ArduinoBLE库客户端Disconnected事件无法触发问题求助
BLE客户端Disconnected事件未触发排查
环境配置
- ESP32 作为 BLE Server 运行
- nRF52840开发板(XIAO BLE Sense)作为 BLE Client 运行
问题现象
客户端除Disconnected事件外其他功能均正常:连接事件可正常触发并输出串口信息,但关闭ESP32(异常断电)后,客户端未输出预期的Disconnected event, peripheral:....串口信息,Disconnected事件未触发。
客户端相关代码
BLE初始化代码
// BLE initialization if (!BLE.begin()) { Serial.println("Starting Bluetooth® Low Energy module failed!"); while (1); } MAC = BLE.address().c_str(); Serial.print("BLE MAC: "); Serial.println(MAC.c_str()); BLE.setEventHandler(BLEConnected, bleCentralConnectHandler); BLE.setEventHandler(BLEDisconnected, bleCentralDisconnectHandler);
事件回调函数
void bleCentralConnectHandler(BLEDevice peripheral) { // central connected event handler Serial.print("Connected event, peripheral: "); Serial.println(peripheral.address()); } void bleCentralDisconnectHandler(BLEDevice peripheral) { // central disconnected event handler Serial.print("Disconnected event, peripheral: "); Serial.println(peripheral.address()); startScanning(); }
可能的原因及排查方向
- 异常断开依赖超时检测:ESP32直接断电属于异常断开,没有走BLE标准的断开协商流程,客户端需要等待连接超时才会触发Disconnected事件。默认超时时间可能较长(几秒到几十秒),可以等待一段时间观察是否触发,或者手动缩短连接超时参数(比如通过
BLE.setSupervisionTimeout()设置更短的超时值,具体参考ArduinoBLE库文档)。 - 正常断开测试验证:先测试ESP32主动调用BLE断开API(正常断开),看客户端是否能触发Disconnected事件。如果正常断开能触发,说明异常断电的情况确实需要依赖超时机制。
- 库版本或兼容性问题:检查XIAO BLE Sense使用的ArduinoBLE库版本,尝试更新到最新版,或者查看库的已知issues,确认是否存在异常断开事件不触发的bug。
- 回调逻辑阻塞:
startScanning()函数可能存在阻塞或耗时操作,导致串口打印被延迟或无法执行。可以先注释掉startScanning(),只保留串口打印代码,测试断开事件是否能正常输出。 - 事件类型常量校验:核对ArduinoBLE库的文档,确认
BLEDisconnected事件常量名称是否正确,部分库可能使用BLEDisconnect这类不同的命名(不过连接事件正常,这个概率较低)。
内容的提问来源于stack exchange,提问作者Antonello Barbone
相关产品推荐
相关产品推荐

