慕容雪花 发表于 2024-9-14 23:40

【ST NUCLEO-WB09KE测评】-7-基于p2p_server例程实现读取特征值

本帖最后由 慕容雪花 于 2024-9-16 13:10 编辑

<p>根据自己对手册的理解,如果CHARACTERISTIC使用了value buffer,那么GATT CLIENT在读取该CHAR 值的时候,BLE STACK直接从value buffer里面取走数据。不会通过事件&ldquo;aci_gatt_srv_read_event&rdquo;上报到应用层。</p>

<p>还有一种情况,动态变化的数据不宜使用value buffer。</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>所以,接下来的实验会禁掉value buffer,然后再EVENT处理分支中提供CHARACTERISTIC值。在CubeIde图形化配置界面中,选择MiddleWare-&gt;ST BLE</p>

<p> &nbsp;</p>

<p>点击保存后,CUBEIDE自动生成代码。</p>

<p>接着在p2p_server.c文件中,P2P_SERVER_EventHandler()里面:</p>

<p>先定义几个变量:</p>

<pre>
<code>uint8_t mgc_val_len;
static uint8_t mgc_val_buff={0};;
uint8_t attr_error_code = BLE_ATT_ERR_NONE;
APP_DBG_MSG("--IN File p2p_server.c. P2P_SERVER_EventHandler\n");</code></pre>

<p>然后调用aci_gatt_srv_resp()返回数据给GATT CLIENT。</p>

<pre>
<code>    case ACI_GATT_SRV_READ_VSEVT_CODE :
    {
      /* USER CODE BEGIN EVT_BLUE_GATT_SRV_READ_BEGIN */

      /* USER CODE END EVT_BLUE_GATT_SRV_READ_BEGIN */
      p_read = (aci_gatt_srv_read_event_rp0*)p_evt-&gt;data;
          if(p_read-&gt;Attribute_Handle == (P2P_SERVER_Context.Led_CCharHdle + CHARACTERISTIC_VALUE_ATTRIBUTE_OFFSET))
          {
                return_value = BLEEVT_Ack;
                /*USER CODE BEGIN Service1_Char_1_ACI_GATT_SRV_READ_VSEVT_CODE_1 */
                APP_DBG_MSG("--MGCSH IN File p2p_server.c. ACI_GATT_SRV_READ_VSEVT_CODEGATT : READ LED STATUS COMMAND RECEIVED\n");
                notification.EvtOpcode = P2P_SERVER_LED_C_READ_EVT;
                P2P_SERVER_Notification(&amp;notification);

                mgc_val_len = 2;
                mgc_val_buff = mgc_val_buff + 1;
                mgc_val_buff = mgc_val_buff + 2;
                aci_gatt_srv_resp(p_read-&gt;Connection_Handle,BLE_GATT_UNENHANCED_ATT_L2CAP_CID,p_read-&gt;Attribute_Handle,attr_error_code,mgc_val_len,mgc_val_buff);
                /*USER CODE END Service1_Char_1_ACI_GATT_SRV_READ_VSEVT_CODE_1 */

                /*USER CODE BEGIN Service1_Char_1_ACI_GATT_SRV_READ_VSEVT_CODE_2 */

                  /*USER CODE END Service1_Char_1_ACI_GATT_SRV_READ_VSEVT_CODE_2 */
          } /* if(p_read-&gt;Attribute_Handle == (P2P_SERVER_Context.Led_CCharHdle + CHARACTERISTIC_VALUE_ATTRIBUTE_OFFSET))*/</code></pre>

<p>上面准备的数据第一个字节每次加1,第二个字节每次加2,实验现象:</p>

<p>a791601200914b8b2c8b12dc4740b3ba</p>

<p>&nbsp;</p>

<p>后面加入OLED显示,可以显示Attribute Handle,以及发送出去的数据。后续可以把这些数据替换为比如ADC数据,更有实际意义。</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>改进了一下界面:可以显示按键状态以及GATT client请求读取特征值的数据和句柄。</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

sujingliang 发表于 2024-10-8 13:17

<p>赞。</p>

<p>学习了:</p>

<p>如果想触发ACI_GATT_SRV_READ_VSEVT_CODE,需要将Characteristic type设为Non-buffered。</p>
页: [1]
查看完整版本: 【ST NUCLEO-WB09KE测评】-7-基于p2p_server例程实现读取特征值