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

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,逻辑本身就不成立。

正确实现步骤

  1. 订阅目标特征值的通知
    在设备连接成功后,先订阅传感器响应对应的特征值,这样才能收到推送的响应数据:

    // 订阅通知示例
    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);
    });
    
  2. 监听通知事件接收响应
    通过事件监听获取传感器的响应数据,并赋值给目标变量(如果是组件状态,用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)
      }
    });
    
  3. 修改发送函数逻辑
    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);
      }
    }
    
  4. 修正按钮调用方式
    异步函数需要用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:26:05