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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:10:15