通过BLE向设备发送数据后无法接收通知,求助排查
BLE设备指令发送后无法获取通知反馈排查
我正在开发一款向BLE设备发送指令的应用,但无法获取设备反馈。我使用ble.plx库的Characteristic监听功能,但monitorCharacteristicForService没有输出任何内容。我需要读取通知中的值用于后续逻辑,这是首次接触BLE开发,已确认Service UUID和Characteristic UUID正确,目前无排查思路,以下是我的代码:
function scanAndConnect() { BLTManager.startDeviceScan(null, null, (error, device) => { if (error) { // Handle error (scanning will be stopped automatically) return } // Check if it is a device you are looking for based on advertisement data // or other criteria. if (device.name=='Audio PCM Streamer') { console.log(device.name); // Stop scanning as it's not necessary if you are scanning for one device. BLTManager.stopDeviceScan(); device.connect() .then((device) => { return device.discoverAllServicesAndCharacteristics() }) .then( (device) => { device.monitorCharacteristicForService(SERVICE_UUID,CHARACTERISTIC_UUID,(err,result)=>{ if(err) { console.log(err) return; } console.log(result); }); // Subscription device.requestMTU(251) let data = Uint8Array(9); data[0]=0xA5; data[1]=0xA5; data[2]=0xA5; data[3]=0xA5; var b64encoded = btoa(decoder.decode(data)); device.writeCharacteristicWithoutResponseForService(SERVICE_UUID,CHARACTERISTIC_UUID,b64encoded); }) .catch((error) => { // Handle errors }); } }); }
排查建议
- 确认Characteristic支持通知属性:用BLE调试工具(如nRF Connect)连接设备,查看目标Characteristic是否开启了Notify属性,只有支持通知的特征才能被监听。
- 保留monitor返回的Subscription对象:
monitorCharacteristicForService会返回一个订阅实例,若不保存该实例,可能被垃圾回收导致监听失效。修改代码:const subscription = device.monitorCharacteristicForService(SERVICE_UUID, CHARACTERISTIC_UUID,(err,result)=>{ if(err) { console.log(err) return; } console.log(result); }); - 异步处理MTU请求:
requestMTU是异步操作,当前代码同步执行write,可能MTU尚未协商完成就发送了指令,导致数据传输异常。调整为:device.requestMTU(251) .then(() => { let data = Uint8Array(9); data[0]=0xA5; data[1]=0xA5; data[2]=0xA5; data[3]=0xA5; // 直接转换Uint8Array为base64,避免编码错误 const b64encoded = btoa(String.fromCharCode(...data)); return device.writeCharacteristicWithoutResponseForService(SERVICE_UUID, CHARACTERISTIC_UUID, b64encoded); }) - 修正数据编码逻辑:
decoder.decode(data)会将Uint8Array转为字符串,若包含不可打印字符会导致btoa编码错误,改用String.fromCharCode(...data)直接转换更可靠。 - 完善错误日志:在catch块中添加
console.log(error),排查连接、服务发现过程中是否存在隐藏错误。
内容的提问来源于stack exchange,提问作者rerboi
相关产品推荐
相关产品推荐

