uniapp蓝牙接收数据失败(已解决)

问题

用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)

运行结果

以下是运行结果:

img

尝试过的方法

目前我已经找了很多方法都没解决,包括以下:

  • 设置state:false

  • 设置一个计时器setTimeout

解决方法

问题最终还是对蓝牙服务的不了解导致的,首先每个蓝牙设备有很多个服务,每个服务下又有很多的特征值,只需要一个一个判断特征值是否支持监听就行了。

蓝牙设备支持读取和写入吗 特征值支持 read和write 吗

我写过类似的蓝牙模块功能,可以看看
https://blog.csdn.net/m0_52539553/article/details/121116532?spm=1001.2014.3001.5501

忘了更新解决方法了:
问题最终还是对蓝牙服务的不了解导致的,首先每个蓝牙设备有很多个服务,每个服务下又有很多的特征值,只需要一个一个判断特征值是否支持监听就行了。