React-Native中BleManager.write无法获取蓝牙传感器响应值求助
React Native BLE Manager 无法存储传感器响应数据问题
我使用BLE Manager开发React Native应用,实现手机与蓝牙传感器的通信,目前已完成设备发现、连接、数据发送与接收功能,但传感器的响应结果无法存入指定变量writeBuffer,求解决。
相关代码
异步发送函数
async function onlyWrite(){ let command = ['XX', 'XX', 'XX', 'XX', 'XX', '00','00','00','00','00','00','00','00','00','00','00','00','00', 'XX','XX']; let data = command.map(x => {return parseInt(x, 16);}); const writeBuffer = await BleManager.write( "XX:XX:XX:XX:XX:XX", 'XXXXXXXX-0000-XXXX-XXXX-XXXXXXXXXXXX', 'XXXXXXXX-0000-XXXX-XXXX-XXXXXXXXXXXX', data, 35 ) .then(async() => { console.log(`*******************************Sent ${data}`); console.log("*******************************ONLYWRITE Response From Slave(peripheral="+JSON.stringify(writeBuffer)); }) .catch((error) => { console.log(error); }); console.log("writeBuffer:"+ writeBuffer); return writeBuffer;//The respond this is the output }
按钮调用代码
<View style={{margin: 10}}> <Button title=" OnlyWrite " onPress={ () => console.log("OnlyWriteResponse:"+onlyWrite()) } /> </View>
问题分析与解决办法
核心问题
BLE Manager的write方法仅负责发送数据,不会返回传感器的响应结果。传感器的响应是通过「通知/指示(Notification/Indication)」机制推送的,你现在把write的返回值赋值给writeBuffer,逻辑本身就不成立。
正确实现步骤
订阅目标特征值的通知
在设备连接成功后,先订阅传感器响应对应的特征值,这样才能收到推送的响应数据:// 订阅通知示例 BleManager.startNotification( "XX:XX:XX:XX:XX:XX", 'XXXXXXXX-0000-XXXX-XXXX-XXXXXXXXXXXX', 'XXXXXXXX-0000-XXXX-XXXX-XXXXXXXXXXXX' ).then(() => { console.log("通知订阅成功"); }).catch((error) => { console.log("订阅失败", error); });监听通知事件接收响应
通过事件监听获取传感器的响应数据,并赋值给目标变量(如果是组件状态,用setState或useState更新):// 组件内或全局监听通知事件 DeviceEventEmitter.addListener('BleManagerDidUpdateValueForCharacteristic', (data) => { // 验证是否为目标设备和特征值的响应 if (data.peripheral === "XX:XX:XX:XX:XX:XX" && data.characteristic === 'XXXXXXXX-0000-XXXX-XXXX-XXXXXXXXXXXX') { const responseBuffer = data.value; // 这里就是传感器的响应数据 console.log("收到传感器响应:", responseBuffer); // 把数据存入writeBuffer,比如组件状态:setWriteBuffer(responseBuffer) } });修改发送函数逻辑
onlyWrite只负责发送数据,不需要等待响应返回:async function onlyWrite(){ let command = ['XX', 'XX', 'XX', 'XX', 'XX', '00','00','00','00','00','00','00','00','00','00','00','00','00', 'XX','XX']; let data = command.map(x => parseInt(x, 16)); try { await BleManager.write( "XX:XX:XX:XX:XX:XX", 'XXXXXXXX-0000-XXXX-XXXX-XXXXXXXXXXXX', 'XXXXXXXX-0000-XXXX-XXXX-XXXXXXXXXXXX', data, 35 ); console.log(`已发送数据: ${data}`); } catch (error) { console.log("发送失败:", error); } }修正按钮调用方式
异步函数需要用async/await处理,避免直接打印Promise对象:<View style={{margin: 10}}> <Button title=" OnlyWrite " onPress={async () => { await onlyWrite(); // 响应数据从通知监听回调中获取,不要从onlyWrite返回值拿 }} /> </View>
额外注意事项
- 确保传感器的响应特征值支持通知/指示功能,需对应传感器的协议文档。
- 函数组件中记得在卸载时移除监听,避免内存泄漏:
useEffect(() => { const listener = DeviceEventEmitter.addListener('BleManagerDidUpdateValueForCharacteristic', handleResponse); return () => listener.remove(); }, []);
内容的提问来源于stack exchange,提问作者HUV
相关产品推荐
相关产品推荐

