uni-app onBLECharacteristicValueChange 在写入后会逐渐增加监听值

uni-app onBLECharacteristicValueChange 在写入后会逐渐增加监听值

示例代码:

uni.writeBLECharacteristicValue({  
    deviceId: t.w_deviceId,  
    serviceId: t.w_serviceId,  
    characteristicId: t.w_characteristicId,  
    value: n,  
    success: function(e) {  
    console.log('写入成功');  

          uni.onBLECharacteristicValueChange((function(e) {  
                console.log('e.characteristicId', e.characteristicId);  
                if (e.characteristicId == t.n_CharacteristicId) {  
                  ...  
                }  
          }))  
    },  
        fail: function(t) {  
        console.log('向低功耗蓝牙设备指定特征值写入二进制数据', t);  
    }  
})

操作步骤:

  • 通过writeBLECharacteristicValue写入二进制数据
  • 通过onBLECharacteristicValueChange监听特征值变化事件

预期结果:

  • 每次写入,监听的值只出现一次

实际结果:

  • 每次写入,监听会累加
  • 特此说明:小程序并不会出现这种问题,一切正常,只在安卓app上出现了(目前只测试了安卓)

bug描述:

在使用writeBLECharacteristicValue向低功耗蓝牙设备指定特征值写入二进制数据后,通过onBLECharacteristicValueChange监听低功耗蓝牙设备的特征值变化事件。在安卓app上会重复监听并累加。

  • 第一次只有一个值,第二次会出现两次,。。。
  • 在小程序上没有出现这种问题

图片

Image 1 Image 2


更多关于uni-app onBLECharacteristicValueChange 在写入后会逐渐增加监听值的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

你每次写入都注册了一次onBLECharacteristicValueChange

更多关于uni-app onBLECharacteristicValueChange 在写入后会逐渐增加监听值的实战教程也可以访问 https://www.itying.com/category-93-b0.html


我也遇到这个问题,大佬有解决办法吗?

回复 rooanlee: 把这段代码放外面,只调用一次。

谁有解决方案?

在 UniApp 中,onBLECharacteristicValueChange 是用于监听蓝牙设备特征值(Characteristic Value)变化的回调函数。当你向蓝牙设备的某个特征值写入数据后,设备可能会返回一些数据,这些数据会通过 onBLECharacteristicValueChange 回调函数传递给你。

如果你发现 onBLECharacteristicValueChange 返回的值逐渐增加,这可能是由于以下原因之一:

1. 设备本身的行为

蓝牙设备可能会根据你写入的数据进行某种计算或操作,并返回递增的值。例如,设备可能是一个计数器,每次写入后都会返回一个递增的计数值。

2. 数据缓冲或累积

如果你在短时间内多次写入数据,设备可能会将这些数据缓冲或累积,并在 onBLECharacteristicValueChange 中一次性返回多个结果,导致你看到的值逐渐增加。

3. 数据处理逻辑问题

在你的代码中,可能对 onBLECharacteristicValueChange 返回的数据进行了某种处理,导致值逐渐增加。例如,你可能在每次回调时将新值累加到之前的数值上。

4. 多次监听

如果你多次调用了 uni.onBLECharacteristicValueChange,可能会导致回调函数被多次触发,从而使得值看起来在逐渐增加。

解决方案

  1. 检查设备文档:首先,确认设备的行为是否符合预期,查看设备文档,了解设备在接收到写入数据后会返回什么样的数据。

  2. 检查数据处理逻辑:确保你在 onBLECharacteristicValueChange 回调中没有对数据进行不必要的累加或其他处理。

  3. 确保单次监听:确保你在应用生命周期中只调用了一次 uni.onBLECharacteristicValueChange,避免多次监听导致回调函数被多次触发。

  4. 清除监听:在不需要监听时,调用 uni.offBLECharacteristicValueChange 来取消监听,避免不必要的回调。

示例代码

以下是一个简单的示例,展示如何正确使用 onBLECharacteristicValueChange

// 监听蓝牙设备特征值变化
uni.onBLECharacteristicValueChange((res) => {
  console.log('Characteristic Value Changed:', res.value);
  // 处理接收到的数据
  // 例如,将 ArrayBuffer 转换为字符串
  const value = new Uint8Array(res.value);
  console.log('Received Data:', String.fromCharCode.apply(null, value));
});

// 写入数据到蓝牙设备特征值
function writeToBLECharacteristic(deviceId, serviceId, characteristicId, data) {
  uni.writeBLECharacteristicValue({
    deviceId: deviceId,
    serviceId: serviceId,
    characteristicId: characteristicId,
    value: data,
    success: (res) => {
      console.log('Write Success:', res);
    },
    fail: (err) => {
      console.error('Write Failed:', err);
    }
  });
}

// 取消监听
function stopListening() {
  uni.offBLECharacteristicValueChange();
}
回到顶部