下图是来自ST中文官网下载的GATT介绍,比较多直观,分享一下。
主程序开始先进行各种外设初始化:
MX_GPIO_Init();
MX_RADIO_Init();
MX_RADIO_TIMER_Init();
MX_PKA_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Init code for STM32_BLE */
MX_APPE_Init(NULL);
初始化BLE STACK, 还有UTIL SEQUENCER,之前有大佬分享过文章: [ST NUCLEO-WBA52CG] 3 - BLE中的sequencer -- UTIL_SEQ_RegTask()函数的作用 https://bbs.eeworld.com.cn/thread-1253252-1-1.html】
例程提供了LED1状态的读,写;BUTTON1的NOTIFY。
通过USB DONGLE连接WB09-KE开发板,可以看到小灯与按键对应的CHARACTERISTIC。
下面来分析一下按键状态上报NOTIFY的工作大致流程。首先,GATT CLIENT会点击enable notify,这样WB09-KE的BLE STACK会经由如下处理。
ble_evt.c中的void BLE_STACK_Event(hci_pckt *hci_pckt, uint16_t length)函数会对BLE STACK传递过来的事件做检查。如下:
接着调用:
上面的BLE EVT SvcHandler其实是在P2P_SERVER_Init()函数进行初始化的时候注册的专门的回调函数。
如果解析HCI PDU发现是禁止NOTIFICATION,那么会
notification.EvtOpcode = P2P_SERVER_SWITCH_C_NOTIFY_DISABLED_EVT;
接着 P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_OFF;
这个status标志位会影响按键按下后,是否通知GATT Client。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在上面使能了NOTIFY后,WB09-KE开发板这边,如果有SW1按下,
如下图L259,会根据P2P_SERVER_APP_Context.Switch_c_Notification_Status来决定是否调用:
P2P_SERVER_NotifyValue(P2P_SERVER_SWITCH_C, &p2p_server_notification_data, P2P_SERVER_APP_Context.ConnectionHandle);
最终会调用aci_gatt_srv_notify来把最新的BUTTON status发送出去。