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

使用react-native-ble-plx订阅ESP32 BLE服务失败问题求助

问题排查与修复方案

明显代码错误点

  • 逻辑顺序错误:handleConnection 生成器开头直接调用 yield take(setupNotificationChannel),但 setupNotificationChannel 是在后续捕获CONNECT动作后才定义的,会直接触发引用未定义的报错,你误把监听特征值的代码片段提前放到了函数头部,需要删掉开头那段重复的无效代码。
  • 动作监听不完整:创建deviceActionChannel时只注册了DISCONNECT、EXECUTE_TEST两类动作,但后续逻辑判断了UPDATE_FLOW类型的动作,该类型动作永远无法被捕获,订阅逻辑自然不会触发。需要将UPDATE_FLOW加入动作监听列表:
const deviceActionChannel = yield actionChannel([
  'DISCONNECT',
  'EXECUTE_TEST',
  'UPDATE_FLOW' // 新增这一行
]);
  • 通知监听只执行一次:当前仅当收到UPDATE_FLOW动作时才会take一次通知通道的消息,而monitorCharacteristicForService会持续推送特征值更新,单次take只能拿到第一次推送的结果,后续更新会全部丢失。建议单独fork一个常驻任务处理通知推送:
// 连接成功后新增这段代码,启动监听通知的常驻任务
yield fork(function* watchNotifications() {
  while (true) {
    const [error, characteristic] = yield take(setupNotificationChannel)
    if (error != null) {
      console.warn(`Device name = ${device.localName}  Device ID = ${device.id}`)
      console.warn(error.message)
      continue
    }
    if (characteristic != null) {
      // 注意:characteristic.value是Base64编码,需要先解码
      const rawValue = base64.toByteArray(characteristic.value)
      yield put(log(`收到特征值: ${rawValue}`))
      // 这里更新redux状态即可
      yield put(updateButtonState(rawValue))
    }
  }
})

额外排查点

  • UUID一致性校验:调用discoverAllServicesAndCharacteristics后打印设备所有服务、特征的UUID,确认你填写的服务、特征UUID和设备实际暴露的完全一致,注意部分设备UUID为全小写,建议统一转小写后匹配。
  • 权限校验:安卓12及以上版本需要申请BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限,安卓11及以下需要申请ACCESS_FINE_LOCATION权限,所有权限通过后再执行BLE操作。
  • 特征属性校验:确认ESP32端配置的对应特征开启了NOTIFY属性,没有开启通知属性的特征无法被订阅。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:00:00