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 个回答
暂无答案, 快来添加答案吧

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览