我正在使用 esp idf 4.4 和 Nimble 1.3.0
第一次我能够配对插入密钥客户端的 android 设备。一旦设备配对并绑定,我就可以永远读取和写入加密的关贸协定。
绑定在重新启动和限制最大可绑定设备大小后仍然存在。
如果我在客户端取消配对 esp32,就像通过蓝牙 Android 选项取消配对一样,我将无法读取/写入加密的 gapps。
要查看 characteris
tics 和 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;
}
仅当我解除对等客户端的连接时才会发生这种情况。