l***@dierjie.org
l***@dierjie.org
  • 发布:2022-07-05 15:20
  • 更新:2024-04-03 15:34
  • 阅读:1553

【报Bug】蓝牙uni.onBLECharacteristicValueChange在安卓端微信小程序无效

分类:uni-app

产品分类: uniapp/小程序/微信

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 12.3.1

HBuilderX类型: 正式

HBuilderX版本号: 3.4.18

第三方开发者工具版本号: 1.0.6

基础库版本号: 2.24.0

项目创建方式: HBuilderX

示例代码:
    <view>  
        <!-- <button @click="search()">扫描</button> -->  
        <button @click="init()">加载蓝牙</button>  
        <button @click="connect()">连接蓝牙</button>  
        <button @click="getServices()">获取主服务</button>  
        <button @click="getCharacteristics()">获取特征码</button>  
        <button @click="notifyEanble()">启用通知</button>  
        <button @click="notifyDisable()">停用通知</button>  
        <button @click="listener()">开启监听</button>  
        <button @click="sendMessage()">发送</button>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            return {  
                DeviceID: "20:22:06:26:AA:02",  
                ServiceID: null,  
                characteristicWriteID: null,  
                characteristicNotifyID: null,  
            };  
        },  
        onLoad() {  

        },  
        methods: {  
            sendMessage: function() {  
                let buffer = this.stringToBytes("{n}")  
                // console.log(this.characteristicWriteID)  
                uni.writeBLECharacteristicValue({  
                    deviceId:this.DeviceID,  
                    serviceId:this.ServiceID,  
                    characteristicId:this.characteristicWriteID,  
                    value:buffer,  
                    writeType:"write",  
                    success(res) {  
                        console.log(res)  
                    }  
                })  
            },  
            stringToBytes(str) {  
                var array = new Uint8Array(str.length);  
                for (var i = 0, l = str.length; i < l; i++) {  
                    array[i] = str.charCodeAt(i);  
                }  
                // console.log(array);  
                return array.buffer;  
            },  
            ab2str: function(buf) {  
                return String.fromCharCode.apply(null, new Uint8Array(buf));  
            },  
            connect: function() {  
                uni.createBLEConnection({  
                    deviceId:this.DeviceID,  
                    success() {  
                        uni.showToast({  
                            title:"蓝牙连接成功",  
                            duration:2000  
                        })  
                    }  
                })  
            },  
            getServices: function() {  
                let _that = this  
                uni.getBLEDeviceServices({  
                    deviceId:this.DeviceID,  
                    success(res) {  
                        res.services.forEach(service => {  
                            console.log(service)  
                            if(service.isPrimary) {  
                                _that.ServiceID = service.uuid  
                                uni.showToast({  
                                    title:"获取主服务成功",  
                                    duration:2000  
                                })  

                                return  
                            }  
                        })  

                        uni.showToast({  
                            title:"获取主服务失败",  
                            icon:"error",  
                            duration:2000  
                        })  
                    }  
                })  
            },  
            getCharacteristics: function() {  
                let _that = this  
                uni.getBLEDeviceCharacteristics({  
                    deviceId:this.DeviceID,  
                    serviceId:this.ServiceID,  
                    success(res) {  
                        res.characteristics.forEach(characteristic => {  
                            console.log(characteristic)  
                            if(characteristic.properties.write) {  
                                _that.characteristicWriteID = characteristic.uuid  
                            }  
                            if(characteristic.properties.notify) {  
                                _that.characteristicNotifyID = characteristic.uuid  
                            }  
                        })  

                        uni.showToast({  
                            title:"获取特征码完成",  
                            duration:2000  
                        })  
                    }  
                })  
            },  
            notifyEanble: function() {  
                uni.notifyBLECharacteristicValueChange({  
                    deviceId:this.DeviceID,  
                    serviceId:this.ServiceID,  
                    characteristicId:this.characteristicNotifyID,  
                    state:true,  
                    success(res) {  
                        uni.onBLECharacteristicValueChange(function(dataRes) {  
                            console.log(33333)  
                            console.log(_that.ab2str(dataRes.value))  
                        })  

                        uni.showToast({  
                            title:"订阅成功",  
                            duration:2000  
                        })  
                    },  
                    fail: (res) => {  
                        console.log(res)  
                    }  
                })  
            },  
            notifyDisable: function() {  
                uni.notifyBLECharacteristicValueChange({  
                    state:false,  
                    deviceId:this.DeviceID,  
                    serviceId:this.ServiceID,  
                    characteristicId:this.characteristicNotifyID,  
                    success(res) {  
                        uni.showToast({  
                            title:"订阅成功",  
                            duration:2000  
                        })  
                    }  
                })  
            },  
            listener: function() {  
                uni.onBLECharacteristicValueChange(function(res) {  
                    console.log(33333)  
                    console.log(_that.ab2str(res.value))  
                })  
            },  
            init: function() {  
                uni.openBluetoothAdapter({  
                    success() {  
                        uni.showToast({  
                            title:"蓝牙模块初始化成功",  
                            duration:2000  
                        })  
                    }  
                })  
            }  
        }  
    }  
</script>  

<style scoped lang="less">  

</style>

操作步骤:

建立蓝牙连接-》获取services-〉获取特征码-》开启通知并监听notify-〉下发指令

预期结果:

当下发指令后,应该出发监听的回调

实际结果:

指令下发后,监听消息的回调并未触发

bug描述:

微信小程序操控蓝牙设备:扫描、连接、发送指令都OK,唯独特征码监听无反应,能确定设备给小程序发送数据了,但是onBLECharacteristicValueChange回调就是收不到也不触发

2022-07-05 15:20 负责人:无 分享
已邀请:
l***@dierjie.org

l***@dierjie.org (作者)

求关注

a聆听

a聆听

在获取蓝牙设备某个服务中所有特征值的成功回调里去调用notifyBLECharacteristicValueChange;

在 notifyBLECharacteristicValueChange 的 complete 里去调用 onBLECharacteristicValueChange;

l***@dierjie.org

l***@dierjie.org (作者)

唉,完全没有头绪了

l***@dierjie.org

l***@dierjie.org (作者)

依然还卡在这里==! 求大神帮忙

  • a聆听

    肯定是设备的特征值没有对应上; 你的characteristicNotifyID 不对;你首先要确定那个特征值是"读",那个特征值是"写";characteristicNotifyID 应该是"读" 的UUID;

    2022-07-16 15:37

  • a聆听

    有些蓝牙芯片不一定有 properties.notify 自己输出特征值仔细看看吧;

    2022-07-16 15:42

2***@qq.com

2***@qq.com

遇到了一样的问题,ios可以安卓不行

北斗星辰

北斗星辰

遇到类似的问题,调用普通接口有效,但是有一个接口需要硬件工程师主动断开蓝牙连接,然后主动再次连接,然后传参就收不到了(uni.onBLECharacteristicValueChange不调用)

9***@qq.com

9***@qq.com - 小白

遇到了一样的问题,楼主最后怎么解决的? 求告知

9***@qq.com

9***@qq.com

我在这个里面监听到了

yangjw

yangjw

uni.notifyBLECharacteristicValueChange({

里面不执行onBLECharacteristicValueChange

1***@163.com

1***@163.com - 这是个人介绍...

现在解决了吗楼主

要回复问题请先登录注册