开发板: W801-KIT
SDK: WM-W80X-SDK-v1.00.10-202308(使用NimBLE蓝牙协议栈)
在串口输入: t-bt-on, t-ble-server-on,依次打开蓝牙模块, 蓝牙服务器demo
bug复现:
调试过程:
tls_ble_server_demo_api_init
// 将GAP事件回调注册到全局GAP监听链表
le_gap_event_listener_register(..., ble_gap_evt_cb, NULL)
ble_gatts_start()
// 启动广播
wm_ble_server_api_demo_adv(true)
tls_nimble_gap_adv(WM_BLE_ADV_IND, 0)
// 指定广播过程的事件回调(建立连接后, 该回调赋值给连接对象)
ble_gap_adv_start(..., gap_event, NULL);
通过追踪源码发现,事件回调函数有2个,一个是ble_gap_evt_cb, 另一个是gap_event。疑似重新配对事件没有传递给ble_gap_evt_cb回调函数。分别在他们的开头添加printf,输出遇到的触发的事件类型(ID),如下:
// 位于: src/app/bleapp/wm_ble_gap.c
static int gap_event(struct ble_gap_event *event, void *arg)
{
// 添加printf帮助定位问题
printf("%s:%d gap_event, type=%d\n", __FILE__, __LINE__, event->type);
return 0;
}
// 位于: src/app/bleapp/wm_ble_server_api_demo.c
static int ble_gap_evt_cb(struct ble_gap_event *event, void *arg)
{
int rc;
struct ble_gap_conn_desc desc;
// 开头添加printf,帮助定位问题
printf("%s:%d, ble_gap_evt_cb, type:%d\n", __FILE__, __LINE__, event->type);
// 后面的不修改
switch(event->type) {
case BLE_GAP_EVENT_CONNECT:
...
case BLE_GAP_EVENT_DISCONNECT:
...
case BLE_GAP_EVENT_REPEAT_PAIRING: // 有重复配对这块的处理
...
}
}
串口工具的输出如下:
结论:
蓝牙手机删除首次配对信息,重新进行配对时,会出现配对失败的现象。追踪源码发现,gap事件处理函数有两个:
我在学习nimble协议栈时发现,通过register方式注册的GAP回调,能收到广播相关,建立连接,断开连接,nofity等事件。但建立连接后的相关事件就收不到,譬如说重复配对事件。
最简单的修复方式是把ble_gap_evt_cb中处理重复配对的代码(case BLE_GAP_EVENT_REPEAT_PAIRING)拷贝到gap_event函数中。但,我觉得这是官方对NimBLE的事件回调有误解导致的,请进行修复!。或修改API,能把ble_gap_evt_cb回调直接传递给ble_gap_adv_start。