【ST NUCLEO-WB09KE测评】-7-基于p2p_server例程实现读取特征值
本帖最后由 慕容雪花 于 2024-9-16 13:10 编辑<p>根据自己对手册的理解,如果CHARACTERISTIC使用了value buffer,那么GATT CLIENT在读取该CHAR 值的时候,BLE STACK直接从value buffer里面取走数据。不会通过事件“aci_gatt_srv_read_event”上报到应用层。</p>
<p>还有一种情况,动态变化的数据不宜使用value buffer。</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>所以,接下来的实验会禁掉value buffer,然后再EVENT处理分支中提供CHARACTERISTIC值。在CubeIde图形化配置界面中,选择MiddleWare->ST BLE</p>
<p> </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->data;
if(p_read->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(&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->Connection_Handle,BLE_GATT_UNENHANCED_ATT_L2CAP_CID,p_read->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->Attribute_Handle == (P2P_SERVER_Context.Led_CCharHdle + CHARACTERISTIC_VALUE_ATTRIBUTE_OFFSET))*/</code></pre>
<p>上面准备的数据第一个字节每次加1,第二个字节每次加2,实验现象:</p>
<p>a791601200914b8b2c8b12dc4740b3ba</p>
<p> </p>
<p>后面加入OLED显示,可以显示Attribute Handle,以及发送出去的数据。后续可以把这些数据替换为比如ADC数据,更有实际意义。</p>
<p> </p>
<p> </p>
<p>改进了一下界面:可以显示按键状态以及GATT client请求读取特征值的数据和句柄。</p>
<p> </p>
<p> </p>
<p>赞。</p>
<p>学习了:</p>
<p>如果想触发ACI_GATT_SRV_READ_VSEVT_CODE,需要将Characteristic type设为Non-buffered。</p>
页:
[1]