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

React Native中BleManager.write无法获取蓝牙传感器响应值求助

问题分析与解决方案

核心问题

BLE的write操作仅负责向设备发送数据,不会直接返回传感器的响应。传感器的响应需要通过订阅对应特征的通知/指示来监听,这是BLE通信的标准流程。你的代码错误地期望BleManager.write的返回值是设备响应,同时还存在async/await与then/catch混用的语法问题。

具体修复步骤

1. 先订阅响应特征的通知

在连接设备后,先订阅传感器用来返回响应的特征(通常和写入特征是同一个,或者是设备指定的另一个特征),注册回调来接收响应数据:

// 在连接成功后调用,订阅通知
async function setupNotification() {
  const peripheralId = "XX:XX:XX:XX:XX:XX";
  const serviceUUID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';
  const responseCharUUID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; // 替换为设备响应的特征UUID

  await BleManager.startNotification(peripheralId, serviceUUID, responseCharUUID);
  
  // 注册监听回调,保存响应到变量
  BleManager.on('BleManagerDidUpdateValueForCharacteristic', (args) => {
    const { value } = args;
    // value是Uint8Array格式,转成你需要的格式
    const responseBuffer = Array.from(value);
    console.log('收到设备响应:', responseBuffer);
    // 这里可以把responseBuffer赋值给全局/组件状态中的writeBuffer
    // 比如用useState的话:setWriteBuffer(responseBuffer);
  });
}

2. 修正onlyWrite函数的语法逻辑

去掉async/await和then/catch的混用,write操作只负责发送数据,响应由上面的通知回调接收:

async function onlyWrite(){
  const command = ['XX', 'XX', 'XX', 'XX', 'XX', '00','00','00','00','00','00','XX','XX','00','00','00','00','00', 'XX','XX'];
  const data = command.map(x => parseInt(x, 16));
  const peripheralId = "XX:XX:XX:XX:XX:XX";
  const serviceUUID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';
  const writeCharUUID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';

  try {
    await BleManager.write(peripheralId, serviceUUID, writeCharUUID, data, 35);
    console.log('数据发送成功:', data);
    // 这里不需要返回响应,响应会在通知回调中处理
  } catch (error) {
    console.error('发送失败:', error);
  }
}

3. 修正按钮调用的异步处理

async函数返回的是Promise,直接console.log会打印Promise对象,需要用await或者then处理:

<View style={{margin: 10}}>
    <Button 
      title=" OnlyWrite " 
      onPress={async () => {
        await onlyWrite();
        // 如果需要在发送后获取最新的writeBuffer,直接用状态中的值即可
        // console.log('当前响应:', writeBuffer);
      }} 
    />
</View>

4. 用组件状态管理响应数据

如果是在函数组件中,建议用useState来管理writeBuffer,这样响应更新时组件能自动刷新:

import { useState, useEffect } from 'react';

function YourComponent() {
  const [writeBuffer, setWriteBuffer] = useState([]);

  useEffect(() => {
    // 组件挂载时设置通知监听
    setupNotification();
    // 清理监听
    return () => {
      BleManager.removeAllListeners('BleManagerDidUpdateValueForCharacteristic');
    };
  }, []);

  // ... 上面的setupNotification和onlyWrite函数放在这里 ...

  return (
    <View>
      <Button 
        title=" OnlyWrite " 
        onPress={async () => await onlyWrite()} 
      />
      <Text>最新响应: {JSON.stringify(writeBuffer)}</Text>
    </View>
  );
}

关键注意点

  • 确认传感器的响应是通过通知(Notification)还是指示(Indication)发送的,对应调用startNotification或startIndication。
  • 确保订阅的特征UUID和设备实际用来返回响应的特征一致,可通过BLE调试工具(如nRF Connect)查看设备的服务和特征。
  • 处理响应数据时,注意value是Uint8Array类型,需要转成数组或其他格式再使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:40:17