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

【ST NUCLEO-WB09KE测评】-6-BLE例程 p2p_server代码分析

<p>下图是来自ST中文官网下载的GATT介绍,比较多直观,分享一下。</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>主程序开始先进行各种外设初始化:</p>

<pre>
<code>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);</code></pre>

<p>初始化BLE STACK, 还有UTIL SEQUENCER,之前有大佬分享过文章:&nbsp; 3 - BLE中的sequencer -- UTIL_SEQ_RegTask()函数的作用 <a href="https://bbs.eeworld.com.cn/thread-1253252-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1253252-1-1.html</a>】</p>

<p> &nbsp;</p>

<p>例程提供了LED1状态的读,写;BUTTON1的NOTIFY。</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>通过USB DONGLE连接WB09-KE开发板,可以看到小灯与按键对应的CHARACTERISTIC。</p>

<p> &nbsp;</p>

<p>下面来分析一下按键状态上报NOTIFY的工作大致流程。首先,GATT CLIENT会点击enable notify,这样WB09-KE的BLE STACK会经由如下处理。</p>

<p>ble_evt.c中的void BLE_STACK_Event(hci_pckt *hci_pckt, uint16_t length)函数会对BLE STACK传递过来的事件做检查。如下:</p>

<p> &nbsp;</p>

<p>接着调用:</p>

<p> &nbsp;</p>

<p>上面的BLE EVT SvcHandler其实是在P2P_SERVER_Init()函数进行初始化的时候注册的专门的回调函数。</p>

<p> &nbsp;</p>

<p>如果解析HCI PDU发现是禁止NOTIFICATION,那么会</p>

<p>notification.EvtOpcode = P2P_SERVER_SWITCH_C_NOTIFY_DISABLED_EVT;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>接着 P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_OFF;</p>

<p> &nbsp;</p>

<p>这个status标志位会影响按键按下后,是否通知GATT Client。</p>

<p>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</p>

<p>在上面使能了NOTIFY后,WB09-KE开发板这边,如果有SW1按下,</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;&nbsp; &nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>如下图L259,会根据P2P_SERVER_APP_Context.Switch_c_Notification_Status来决定是否调用:</p>

<p>P2P_SERVER_NotifyValue(P2P_SERVER_SWITCH_C, &amp;p2p_server_notification_data, P2P_SERVER_APP_Context.ConnectionHandle);</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>最终会调用aci_gatt_srv_notify来把最新的BUTTON status发送出去。</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<div></div>

<p>&nbsp;</p>

Jacktang 发表于 2024-9-15 08:45

<p>不错,楼主的&nbsp;p2p_server代码分析过程整的好详细</p>
页: [1]
查看完整版本: 【ST NUCLEO-WB09KE测评】-6-BLE例程 p2p_server代码分析