使用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
相关产品推荐
相关产品推荐

