乐鑫技术交流
直播中

康大争

7年用户 2205经验值
私信 关注
[问答]

为什么esp32 nimble服务器取消配对Android客户端会无法读写ENC GATT呢?

我正在使用 esp idf 4.4 和 Nimble 1.3.0
第一次我能够配对插入密钥客户端的 android 设备。一旦设备配对并绑定,我就可以永远读取和写入加密的关贸协定。
绑定在重新启动和限制最大可绑定设备大小后仍然存在。
如果我在客户端取消配对 esp32,就像通过蓝牙 Android 选项取消配对一样,我将无法读取/写入加密的 gapps。
要查看 characteristics 和 r/w over gatts svr,我使用“BLE tester”apk
这是 ble_hs_cfg。
代码:
ble_hs_cfg.sm_io_cap = 4;
ble_hs_cfg.sm_bonding = 1;
ble_hs_cfg.sm_our_key_dist = BLE_SM_PAIR_KEY_DIST_ENC | BLE_SM_PAIR_KEY_DIST_ID;
ble_hs_cfg.sm_their_key_dist =  BLE_SM_PAIR_KEY_DIST_ENC| BLE_SM_PAIR_KEY_DIST_ID;
ble_hs_cfg.sm_mitm = 1;
ble_hs_cfg.sm_sc = 1;
这是我的同步回调:
代码:
void sync_cb(void) {
// determine best adress type
ble_hs_id_infer_auto(0, &addr_type);      
uint8_t addr_val[6];
ble_hs_id_copy_addr(addr_type, addr_val, NULL);
printf("33[0;36m");
printf("Indirizzo host:n");
for (int j = 0; j < 6; j++) {
         printf("33[0;36m");
         printf("%d ",addr_val[j]);
        }
printf("n");


ESP_LOGI("BLE_Sync", "Device address type %i", addr_type);
   

  advertise();    // start avertising
}
密码注入是由我的间隙事件处理程序回调的这种情况执行的(在主广告函数中作为 cb 插入):
代码:
#if SECU
    case BLE_GAP_EVENT_PASSKEY_ACTION:
      ESP_LOGI(tag, "PASSKEY_ACTION_EVENT started n");
      struct ble_sm_io pkey = {0};                              
      int key = 0;                                             

      if (event->passkey.params.action == BLE_SM_IOACT_DISP {
        ESP_LOGI(tag, "BLE_SM_IOACT_DISP");
        pkey.action = event->passkey.params.action;
        pkey.passkey = 123456; // This is the passkey to be entered on peer
        ESP_LOGI(tag, "Enter passkey %d on the peer side", pkey.passkey);
        rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey);
        ESP_LOGI(tag, "ble_sm_inject_io result: %dn", rc);
      }
我能够捕捉到的是,如果我像前面提到的那样取消配对客户端,则下一对连接(假设是新的客户端)不要像服务器已经识别对等点那样要求密码,但调试让我看到代码卡在 ble_sm.c 的这里   
此代码来自 ble_sm.c 标准库
代码:
static int
ble_sm_chk_repeat_pairing(uint16_t conn_handle,
                          ble_sm_proc_flags proc_flags,
                          uint8_t key_size)
{
    struct ble_gap_repeat_pairing rp;
    struct ble_store_value_sec bond;
    int rc;

    do {
        /* If the peer isn't bonded, indicate that the pairing procedure should
         * continue.
         */
        rc = ble_sm_read_bond(conn_handle, &bond);
        switch (rc) {
        case 0:
            break;
        case BLE_HS_ENOENT:
            return 0;
        default:
            return rc;
        }

        /* Peer is already bonded.  Ask the application what to do about it. */
        rp.conn_handle = conn_handle;
        rp.cur_key_size = bond.key_size;
        rp.cur_authenticated = bond.authenticated;
        rp.cur_sc = bond.sc;

        rp.new_key_size = key_size;
        rp.new_authenticated = !!(proc_flags & BLE_SM_PROC_F_AUTHENTICATED);
        rp.new_sc = !!(proc_flags & BLE_SM_PROC_F_SC);
        rp.new_bonding = !!(proc_flags & BLE_SM_PROC_F_BONDING);

        rc = ble_gap_repeat_pairing_event(&rp);
    } while (rc == BLE_GAP_REPEAT_PAIRING_RETRY);

    BLE_HS_LOG(DEBUG, "silently ignoring pair request from bonded peer");       //THE ATTEMPT, IS STUCK HERE I'M ABLE TO SEE THE PRINT BUT I CAN'T READ OR WRITE ENCRYPTED GATTS.

    return BLE_HS_EALREADY;
}
仅当我解除对等客户端的连接时才会发生这种情况。


回帖(1)

陈霞玻

2023-3-2 14:51:43
密钥似乎存储在 nvs 中,就像 our_sec、pee_sec 和 p_dev_sec 一样。cccds_sec 订阅也很好用。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分