找回密码
 立即注册
首页 业界区 安全 解决ESP32 BleKeyboard库与Android设备BLE配对失败问题 ...

解决ESP32 BleKeyboard库与Android设备BLE配对失败问题

扒钒 昨天 23:20
最近使用ESP32 C3开发BLE键盘时,遇到一个典型问题:设备能被Android手机正常发现,但配对环节始终失败,系统提示“配对请求被拒绝”或“安全错误”,导致连接中断。本文记录完整排查过程与实用解决方案。
问题现象


  • 硬件:ESP32 C3
  • 库版本:BleKeyboard 0.3.2(基于ESP32 BLE Arduino)
  • 复现步骤

    • 手机蓝牙扫描可见设备"ESP32_Keyboard"
    • 点击配对后立即失败,Android日志显示 bt_btif : bta_dm_ble_sec_req_evt 安全拒绝
    • ESP32串口无配对请求日志,连接直接断开

  • 关键线索:Android 10+ 对BLE HID设备强制要求加密绑定(Bonding),而BleKeyboard默认使用Just Works模式(无绑定),触发安全策略拦截。
根本原因

Android系统自8.0起对HID类设备实施严格安全策略:

  • 要求必须启用加密绑定(Bonding)
  • 禁止Just Works模式(ESP_LE_AUTH_NO_BOND)用于HID服务
  • 默认IO Capability为KeyboardDisplay,期望用户交互验证
而BleKeyboard库默认配置:
  1. // BleKeyboard.cpp 内部默认设置
  2. pSecurity->setAuthenticationMode(ESP_LE_AUTH_NO_BOND); // 无绑定
  3. pSecurity->setCapability(ESP_IO_CAP_NONE);             // 无交互能力
复制代码
此配置与Android安全策略冲突,导致配对被拒绝。
解决方案(按安全性排序)

方案一:启用安全绑定(推荐)

保留加密保护,通过Passkey方式完成配对:
main.ino
  1. #include
  2. #include <BleKeyboard.h>
  3. #include <BLEDevice.h>
  4. #include <BLESecurity.h>
  5. BleKeyboard bleKeyboard("ESP32_Keyboard", "ESP32_Dev", 100);
  6. const uint32_t PASSKEY = 123456; // 固定配对码
  7. void setup() {
  8.   Serial.begin(115200);
  9.   
  10.   BLEDevice::init("ESP32_Keyboard");
  11.   BLESecurity *pSecurity = new BLESecurity();
  12.   
  13.   // 启用绑定 + Passkey验证
  14.   pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND); // 安全绑定
  15.   pSecurity->setCapability(ESP_IO_CAP_KEYBOARD_ONLY);            // 键盘输入能力
  16.   pSecurity->setKeySize(16);                                     // 密钥长度
  17.   pSecurity->setPassKey(PASSKEY);                                // 设置固定配对码
  18.   
  19.   bleKeyboard.begin();
  20.   Serial.println("BLE Keyboard ready. Pairing code: 123456");
  21. }
复制代码
效果:Android弹出6位数字配对码输入框,输入123456后成功绑定。后续连接自动加密,符合安全规范。
方案二:临时调试方案(仅限开发)

如需快速验证功能,可临时禁用绑定(存在安全风险):
main.ino(调试用)
  1. #include
  2. #include <BleKeyboard.h>
  3. #include <BLEDevice.h>
  4. #include <BLESecurity.h>
  5. BleKeyboard bleKeyboard("ESP32_Keyboard", "ESP32_Dev", 100);
  6. void setup() {
  7.   Serial.begin(115200);
  8.   
  9.   BLEDevice::init("ESP32_Keyboard");
  10.   BLESecurity *pSecurity = new BLESecurity();
  11.   
  12.   // 仅调试使用:禁用绑定(Android可能仍拒绝HID类设备)
  13.   pSecurity->setAuthenticationMode(ESP_LE_AUTH_NO_BOND);
  14.   pSecurity->setCapability(ESP_IO_CAP_NONE);
  15.   pSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK); // 仅启用加密密钥
  16.   
  17.   bleKeyboard.begin();
  18. }
复制代码
⚠️ 注意:Android 12+ 可能完全拒绝无绑定的HID设备,此方案兼容性有限。
版本兼容性说明

Android版本安全策略推荐方案≤8.0允许Just Works方案二可用9.0~11强制HID绑定必须用方案一≥12严格校验IO Capability方案一+固定Passkey
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册