You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}

可能的原因及排查方向

  1. 异常断开依赖超时检测:ESP32直接断电属于异常断开,没有走BLE标准的断开协商流程,客户端需要等待连接超时才会触发Disconnected事件。默认超时时间可能较长(几秒到几十秒),可以等待一段时间观察是否触发,或者手动缩短连接超时参数(比如通过BLE.setSupervisionTimeout()设置更短的超时值,具体参考ArduinoBLE库文档)。
  2. 正常断开测试验证:先测试ESP32主动调用BLE断开API(正常断开),看客户端是否能触发Disconnected事件。如果正常断开能触发,说明异常断电的情况确实需要依赖超时机制。
  3. 库版本或兼容性问题:检查XIAO BLE Sense使用的ArduinoBLE库版本,尝试更新到最新版,或者查看库的已知issues,确认是否存在异常断开事件不触发的bug。
  4. 回调逻辑阻塞:startScanning()函数可能存在阻塞或耗时操作,导致串口打印被延迟或无法执行。可以先注释掉startScanning(),只保留串口打印代码,测试断开事件是否能正常输出。
  5. 事件类型常量校验:核对ArduinoBLE库的文档,确认BLEDisconnected事件常量名称是否正确,部分库可能使用BLEDisconnect这类不同的命名(不过连接事件正常,这个概率较低)。

内容的提问来源于stack exchange,提问作者Antonello Barbone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:05:34