W801 BLE手机删除配对, 无法再次进行配对

发布于 2023-10-17 21:55:34

开发板: W801-KIT
SDK: WM-W80X-SDK-v1.00.10-202308(使用NimBLE蓝牙协议栈)

在串口输入: t-bt-on, t-ble-server-on,依次打开蓝牙模块, 蓝牙服务器demo
bug复现:

  1. 手机打开蓝牙,执行扫描操作,然后连接WM-XX:XX:XX, 这时手机扫描成功
  2. 手机删除刚才的配对信息,然后再次扫描
  3. 重新和WM-XX:XX:XX进行连接(进行配对操作),多次尝试配对失败。

调试过程:

    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: // 有重复配对这块的处理
            ...
    }
}

串口工具的输出如下:
dd.png

结论:

蓝牙手机删除首次配对信息,重新进行配对时,会出现配对失败的现象。追踪源码发现,gap事件处理函数有两个:

  • gap_event, 位于wm_ble_gap.c,通过ble_gap_adv_start()传入
  • ble_gap_evt_cb,位于/wm_ble_server_api_demo.c, 通过ble_gap_event_listener_register()注册到全局链表

我在学习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。

查看更多

关注者
0
被浏览
5.5k
0 个回答
暂无答案,快来添加答案吧

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览