x***@gmail.com
x***@gmail.com
  • 发布:2023-10-30 17:14
  • 更新:2023-10-30 17:14
  • 阅读:376

uniapp 蓝牙无法监听多个特征的问题解决办法

分类:uni-app

问题描述:

在开发app时,项目需要蓝牙同时订阅某个服务下的多个特征值的变化时,直接使用uni.notifyBLECharacteristicValueChange只能订阅一个特征值的变化。

具体实现:

1.将 this.onBLECharacteristicValueChange();放到onLoad()中注册,确保该方法只注册一次,如果该方法注册了多次,蓝牙发送的数据会重复上传。

  1. 在蓝牙的订阅函数notifyBLECharacteristicValueChange()中设置定时器来轮流订阅蓝牙的多个特征值,具体如下:
  2. notifyBLECharacteristicValueChange() {  
            let _this = this;  
            let deviceId = _this.mDevice.deviceId;//这里是蓝牙设备id  
            let serviceId = SERVICE_UUID;//这里是蓝牙的服务UUID  
            let reads = readUUID3;//这里是需要订阅的特征值UUID的数组,[特征值1,特征值2,特征值n]  
            let num = numberReadUUID;//这里是需要订阅的特征值的个数  
            // let characteristicId = reads[0];  
            let countConnect = 0;//连接次数统计  
            let cID=0;//要订阅的特征值的编号  
            _this.notifyCycleTimer = setInterval(()=>{  
                let characteristicId = reads[cID];//要订阅的特征值  
                countConnect = countConnect+1;  
                if(countConnect>10){//连接超过10次没有连接成功就直接返回  
                    uni.hideLoading();  
                    clearInterval(_this.notifyCycleTimer);//注册超时,清理掉定时器  
                    closeBLEConnection();//注册超时就断开蓝牙的连接  
                    closeBluetoothAdapter();//注册超时就关闭蓝牙适配器  
                    uni.showModal({  
                        title: '提示',  
                        content: '蓝牙连接失败,请重试!',  
                        showCancel:false,  
                        complete:function(){  
                            //返回上一界面  
                            uni.navigateBack({  
                                delta:1  
                            });  
                        }  
                    });  
                }  
                uni.notifyBLECharacteristicValueChange({  
                    state: true, // 启用 notify 功能  
                    deviceId,  
                    serviceId,  
                    characteristicId,  
                    success(res) {  
                        console.log('notifyBLECharacteristicValueChange success:' + characteristicId);  
                        cID=cID+1;//订阅成功就订阅下一个特征  
                        if(cID==num){  
                            uni.hideLoading();  
                            clearInterval(_this.notifyCycleTimer);//注册监听成功就清理掉定时器  
                            //返回上一界面  
                            uni.navigateBack({  
                                delta:1  
                            });  
                        }  
                    },  
                    fail(e) {  
                        console.log("订阅失败");  
                    }  
                });  
            },500);//每隔500ms执行一次订阅  
        },
0 关注 分享

要回复文章请先登录注册