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上会重复监听并累加。
- 第一次只有一个值,第二次会出现两次,。。。
- 在小程序上没有出现这种问题
图片
更多关于uni-app onBLECharacteristicValueChange 在写入后会逐渐增加监听值的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你每次写入都注册了一次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
,可能会导致回调函数被多次触发,从而使得值看起来在逐渐增加。
解决方案
-
检查设备文档:首先,确认设备的行为是否符合预期,查看设备文档,了解设备在接收到写入数据后会返回什么样的数据。
-
检查数据处理逻辑:确保你在
onBLECharacteristicValueChange
回调中没有对数据进行不必要的累加或其他处理。 -
确保单次监听:确保你在应用生命周期中只调用了一次
uni.onBLECharacteristicValueChange
,避免多次监听导致回调函数被多次触发。 -
清除监听:在不需要监听时,调用
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();
}