开发板: 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.