【ST NUCLEO-WB09KE测评】-7-基于p2p_server例程实现读取特征值
[复制链接]
本帖最后由 慕容雪花 于 2024-9-16 13:10 编辑
根据自己对手册的理解,如果CHARACTERISTIC使用了value buffer,那么GATT CLIENT在读取该CHAR 值的时候,BLE STACK直接从value buffer里面取走数据。不会通过事件“aci_gatt_srv_read_event”上报到应用层。
还有一种情况,动态变化的数据不宜使用value buffer。
所以,接下来的实验会禁掉value buffer,然后再EVENT处理分支中提供CHARACTERISTIC值。在CubeIde图形化配置界面中,选择MiddleWare->ST BLE
点击保存后,CUBEIDE自动生成代码。
接着在p2p_server.c文件中,P2P_SERVER_EventHandler()里面:
先定义几个变量:
uint8_t mgc_val_len;
static uint8_t mgc_val_buff[2]={0};;
uint8_t attr_error_code = BLE_ATT_ERR_NONE;
APP_DBG_MSG("--IN File p2p_server.c. P2P_SERVER_EventHandler\n");
然后调用aci_gatt_srv_resp()返回数据给GATT CLIENT。
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_CODE GATT : READ LED STATUS COMMAND RECEIVED\n");
notification.EvtOpcode = P2P_SERVER_LED_C_READ_EVT;
P2P_SERVER_Notification(¬ification);
mgc_val_len = 2;
mgc_val_buff[0] = mgc_val_buff[0] + 1;
mgc_val_buff[1] = mgc_val_buff[1] + 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))*/
上面准备的数据第一个字节每次加1,第二个字节每次加2,实验现象:
Untitled Project
后面加入OLED显示,可以显示Attribute Handle,以及发送出去的数据。后续可以把这些数据替换为比如ADC数据,更有实际意义。
改进了一下界面:可以显示按键状态以及GATT client请求读取特征值的数据和句柄。
|