用uniapp开发app的蓝牙模块时,获取服务特征值后,有一个特征值只支持indicate(也就是只有indicate为true),通过uni.notifyBLECharacteristicValueChange调用后显示成功并且在success里面调用uni.onBLECharacteristicValueChange进行监听,但似乎onBLECharacteristicValueChange并没有监听成功,设备发向手机的数据不能接收(已经确定设备向手机发送了消息)。
这里我直接把设备id,服务id,特征值都写死了
if (_obj.properties.indicate) {
self.indicateId = _obj.uuid;
if(uni.getStorageSync("indicateService").serviceId == null){
let indicateService = {
'serviceId':serviceId,
'indicateId': _obj.uuid
};
uni.setStorageSync("indicateService",indicateService)
}
setTimeout(()=>{
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
deviceId: '98:DA:20:02:F0:93',
serviceId: '00001801-0000-1000-8000-00805F9B34FB',
characteristicId: '00002A05-0000-1000-8000-00805F9B34FB',
success: res => {
console.log('notifyBLECharacteristicValueChange 成功', res.errMsg);
setTimeout(() => {
console.log("监听开启");
uni.onBLECharacteristicValueChange(res => {
console.log("已经接收到");
console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`);
console.log(this.ab2hex(res.value));
});
console.log("监听开启完成");
}, 1000);
},
fail: res => {
console.log('notifyBLECharacteristicValueChange 失败:' + res.errMsg);
}
});
},1000)
以下是运行结果:
目前我已经找了很多方法都没解决,包括以下:
设置state:false
设置一个计时器setTimeout
问题最终还是对蓝牙服务的不了解导致的,首先每个蓝牙设备有很多个服务,每个服务下又有很多的特征值,只需要一个一个判断特征值是否支持监听就行了。
蓝牙设备支持读取和写入吗 特征值支持 read和write 吗
我写过类似的蓝牙模块功能,可以看看
https://blog.csdn.net/m0_52539553/article/details/121116532?spm=1001.2014.3001.5501
忘了更新解决方法了:
问题最终还是对蓝牙服务的不了解导致的,首先每个蓝牙设备有很多个服务,每个服务下又有很多的特征值,只需要一个一个判断特征值是否支持监听就行了。