XTiger
XTiger
  • 发布:2019-02-21 14:58
  • 更新:2022-03-31 18:09
  • 阅读:5213

【报Bug】蓝牙IOS写入特征值监听不到结果

分类:uni-app

详细问题描述(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)
[内容]

在IOS平台上先调用notifyBLECharacteristicValueChange然后再执行writeBLECharacteristicValue,但在onBLECharacteristicValueChange里监听不到返回的结果,在安卓里是没有问题的,下面是我的测试代码,反而在执行notifyBLECharacteristicValueChange时会返回上一次执行writeBLECharacteristicValue的结果

重现步骤
[以下是按如下顺序执行代码的结果:
1.uni.startBluetoothDevicesDiscovery

  1. uni.createBLEConnection
  2. uni.notifyBLECharacteristicValueChange
  3. uni.writeBLECharacteristicValue
    ]
    [结果:
    14:59:54.393 [LOG] : create connection success: {"errMsg":"createBLEConnection:ok"}
    14:59:59.654 [LOG] : startCharacteristicsNotify success: {"message":"ok","code":0}
    14:59:59.674 [LOG] : get characteristics complete: {"message":"ok","code":0}
    15:00:00.714 [LOG] : characteristics value changed: {"deviceId":"E697FBED-A78B-C932-BE9E-DB42844A67DE","serviceId":"6E400001-B5A3-F393-E0A9-FD9521DD94D4","characteristicId":"6E400003-B5A3-F393-E0A9-FD9521DD94D4","value":{}}
    15:00:00.734 [LOG] : Value:d014a1e243426130313031393031303130303031
    15:00:06.014 [LOG] : d00f303461333136346435306164a1
    15:00:06.034 [LOG] : write characteristics success: {"message":"ok","code":0}
    ]
    [期望:
    正确的结果应该是在uni.writeBLECharacteristicValue后,在uni.onBLECharacteristicValueChange返回结果,在安卓平台里也是这样运行的没有问题,但在IOS里在调用 uni.writeBLECharacteristicValue后在uni.onBLECharacteristicValueChange没有任何结果返回
    ]
    [如果语言难以表述清晰,可以拍一个视频或截图,有图有真相]

IDE运行环境说明
[HBuilderX]
[1.6.2]
[windows7]
[mac版本号]

App运行环境说明
[Android版本号]
[iOS9.0]
[iphone5]
[模拟器型号]

代码:

export default {
data() {
return {
devices: null,
devId: 'E697FBED-A78B-C932-BE9E-DB42844A67DE',
serId: '6E400001-B5A3-F393-E0A9-FD9521DD94D4',
chaId: '6E400002-B5A3-F393-E0A9-FD9521DD94D4',
chaId1: '6E400003-B5A3-F393-E0A9-FD9521DD94D4',
value: 'D00F303461333136346435303333A1',
value1: 'D0,0F,30,34,61,33,31,36,34,64,35,30,33,33,A1',
secret: '04a3164d50ad',
secret1: '1234567890ab',
cmd: '',
logStr: ''
}
},
computed: mapState(['forcedLogin', 'hasLogin', 'userName']),
methods: {
...mapMutations(['login']),

        setData() {  
            var p = this;  
            p.devId = 'D0:E3:65:C9:4D:81';  
            p.serId = '00001800-0000-1000-8000-00805f9b34fb';  
            p.chaId = '00002a00-0000-1000-8000-00805f9b34fb';  
            p.value = 'tiger333';  
            //var iv = new Int32Array(value);  
            //iv[0] = 120, iv[2] = 100;  
            //this.getBluetoothDevices();  
            //this.createConnection(devId);  
            //this.getServices(devId);  
            //this.getCharacteristics(devId, serId);  
            //this.readCharacteristics(devId, serId, chaId);  
            //this.listenerCharacteristicsChange();  
            //this.writeCharacteristics(devId, serId, chaId, value);  
            //this.readCharacteristics(devId, serId, chaId);  
            //this.closeConnection(devId);  

        },  
        radioChange: function (e) {  
            var p = this;  
            var cmds = [p.getCmd(p.secret, 'A1', ''), //注册  
                        p.getCmd(p.secret, 'A4', 'HELLO_WORLD'),    //改名称命令  
                        p.getCmd(p.secret, 'A3', p.secret1),    //设置新密钥  
                        p.getCmd(p.secret, 'A5', '123456'),     //设置密码  
                        p.getCmd('', '', 'rest'),   //复位  
                        p.getCmd(p.secret, 'A7', ''),   //开门  
                        p.getCmd(p.secret, 'A6', '2f')  //清空密码  
            ];    
            this.cmd = cmds[e.detail.value];  
            console.log('radio发生change事件,携带value值为:' + e.detail.value);  
        },  
        startBluetoothDiscovery() {  
            var p = this;  
            uni.openBluetoothAdapter({  
                success: function(e) {  
                    p.log('open success: ' + JSON.stringify(e));  
                    uni.startBluetoothDevicesDiscovery({  
                        success: function(e) {  
                            p.log('start discovery success: ' + JSON.stringify(e));  
                            p.listenerDeviceFound();  
                        },  
                        fail: function(e) {  
                            p.log('start discovery failed: ' + JSON.stringify(e));  
                        }  
                    });  
                },  
                fail: function(e) {  
                    if (e.code == '10001') {  
                        uni.showModal({  
                            title: '提示',  
                            content: '蓝牙未开启,请打开蓝牙',  
                            showCancel: false,  
                            success: function(res) {  

                            }  
                        });  
                    }  
                    p.log('open failed: ' + JSON.stringify(e));  
                }  
            });  

        },  
        listenerDeviceFound() {  
            var p = this;  
            uni.onBluetoothDeviceFound(function(e) {  
                var devices = e.devices;  
                p.log('device found: ' + e.length);  
                for (var i in devices) {  
                    p.log(i + ': ' + JSON.stringify(devices[i]));  
                }  
            });  
        },  
        getBluetoothDevices() {  
            var p = this;  
            uni.getBluetoothDevices({  
                success: function(e) {  
                    p.devices = e.devices;  
                    var devices = e.devices;  
                    p.log('get devices success: ' + devices.length);  
                    for (var i in devices) {  
                        p.log(i + ': ' + JSON.stringify(devices[i]));  
                    }  
                },  
                fail: function(e) {  
                    p.log('get devices failed: ' + JSON.stringify(e));  
                }  
            });  
        },  
        createConnection() {  
            var p = this;  
            uni.createBLEConnection({  
                deviceId: p.devId,  
                success: function(e) {  
                    p.log('create connection success: ' + JSON.stringify(e));  
                },  
                fail: function(e) {  
                    p.log('create connection failed: ' + JSON.stringify(e));  
                }  
            });  
        },  
        getServices() {  
            var p = this;  
            uni.getBLEDeviceServices({  
                deviceId: p.devId,  
                success: function(e) {  
                    var services = e.services;  
                    p.log('get services success: ' + services.length);  
                    for (var i in services) {  
                        p.log(i + ': ' + JSON.stringify(services[i]));  
                        //p.getCharacteristics(p.devId, services[i].uuid);  
                    }  
                },  
                fail: function(e) {  
                    p.log('get services failed: ' + JSON.stringify(e));  
                }  
            });  
        },  
        getCharacteristics() {  
            this.startCharacteristicsNotify();  
            var p = this;  
            uni.getBLEDeviceCharacteristics({  
                deviceId: p.devId,  
                serviceId: p.serId,  
                success: function(e) {  
                    var characteristics = e.characteristics;  
                    p.log('get characteristics success: ' + characteristics.length);  
                    for (var i in characteristics) {  
                        p.log(i + ': ' + JSON.stringify(characteristics[i]));  

                    }  
                },  
                fail: function(e) {  
                    p.log('get characteristics failed: ' + JSON.stringify(e));  
                }  
            });  
        },  
        readCharacteristics() {  
            var p = this;  
            uni.readBLECharacteristicValue({  
                deviceId: this.devId,  
                serviceId: this.serId,  
                characteristicId: this.chaId,  
                success: function(e) {  
                    p.log('read characteristics success: ' + JSON.stringify(e));  
                },  
                fail: function(e) {  
                    p.log('read characteristics failed: ' + JSON.stringify(e));  
                }  
            });  
        },  
        writeCharacteristics() {  
            var p = this;  
            //console.log(this.buf2hex(p.cmd));  
            for(var i=0; i<p.cmd.length; i++){  
                console.log(p.buf2hex(p.cmd[i]));  
                plus.bluetooth.writeBLECharacteristicValue({  
                    deviceId: p.devId,  
                    serviceId: p.serId,  
                    characteristicId: p.chaId,  
                    value: p.cmd[i],  
                    success: function(e) {  
                        p.log('write characteristics success: ' + JSON.stringify(e));  
                    },  
                    fail: function(e) {  
                        p.log('write characteristics failed: ' + JSON.stringify(e));  
                    }  
                });  
            }  
            //this.startCharacteristicsNotify();  
        },  
        startCharacteristicsNotify() {  
            var p = this;  
            plus.bluetooth.notifyBLECharacteristicValueChange({  
                state: true,  
                deviceId: p.devId,  
                serviceId: p.serId,  
                characteristicId: p.chaId1,  
                success(e) {  
                    var characteristics = e.characteristics;  
                    console.log('startCharacteristicsNotify success: ' + JSON.stringify(e));  
                    for (var i in characteristics) {  
                        p.log(i + ': ' + JSON.stringify(characteristics[i]));  
                    }  
                },  
                fail(e) {  
                    p.log('startCharacteristicsNotify failed: ' + JSON.stringify(e));  
                },  
                complete(e) {  
                    p.log('get characteristics complete: ' + JSON.stringify(e));  
                }  
            });  

            plus.bluetooth.onBLECharacteristicValueChange(function(e) {  
                p.log('characteristics value changed: ' + JSON.stringify(e));  
                p.log('Value:' + p.buf2hex(e.value).trim());  
            });  
        },  
        closeConnection() {  
            var p = this;  
            uni.closeBLEConnection({  
                deviceId: p.devId,  
                success: function(e) {  
                    p.log('close success: ' + JSON.stringify(e));  
                },  
                fail: function(e) {  
                    p.log('close failed: ' + JSON.stringify(e));  
                }  
            });  
        },  
        stopBluetoothDiscovery() {  
            var p = this;  
            this.closeConnection();  
            uni.stopBluetoothDevicesDiscovery({  
                success: function(e) {  
                    p.log('stop discovery success: ' + JSON.stringify(e));  
                    uni.closeBluetoothAdapter({  
                        success: function(e) {  
                            p.log('close success: ' + JSON.stringify(e));  
                        },  
                        fail: function(e) {  
                            p.log('close failed: ' + JSON.stringify(e));  
                        }  
                    });  
                },  
                fail: function(e) {  
                    p.log('stop discovery failed: ' + JSON.stringify(e));  
                }  
            });  
        },  
        log(str) {  
            this.logStr += str + "\r\n";  
            console.log(str);  
        },  
        buf2hex(buffer) {  
            const hexArr = Array.prototype.map.call(  
                new Uint8Array(buffer),  
                function(bit) {  
                    return ('00' + bit.toString(16)).slice(-2)  
                }  
            )  
            return hexArr.join('');  
        },  
        hex2buff(val) {  
            return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function(h) {  
                return parseInt(h, 16)  
            })).buffer  
        },  
        string2buffer(str) {  
            // 首先将字符串转为16进制  
            let val = ""  
            for (let i = 0; i < str.length; i++) {  
                if (val === '') {  
                    val = str.charCodeAt(i).toString(16)  
                } else {  
                    val += ',' + str.charCodeAt(i).toString(16)  
                }  
            }  
            console.log(val);  
            // 将16进制转化为ArrayBuffer  
            return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function(h) {  
                return parseInt(h, 16)  
            })).buffer  
        },  
        getCmd(secret,action,msg) {  
            var buffers = new Array();  
            var msgLen = msg.length;  
            var len = 3 + secret.length + msgLen;  
            var buffer;  
            var dataView;  
            if(msg == 'rest'){  
                buffer = new ArrayBuffer(4);  
                dataView = new DataView(buffer);  
                dataView.setUint8(0, 'r'.charCodeAt());  
                dataView.setUint8(1, 'e'.charCodeAt());  
                dataView.setUint8(2, 's'.charCodeAt());  
                dataView.setUint8(3, 't'.charCodeAt());  
                buffers.push(buffer);  
                return buffers;  
            }  
            /*  
            for(var i=0; i<len; i++){  
                dataView.setUint8(i, str.substr(i*2, 2));  
            }*/  
            if(msgLen <= 5){  
                buffer = new ArrayBuffer(len);  
            }else{  
                buffer = new ArrayBuffer(20);  
            }  
            dataView = new DataView(buffer);  
            dataView.setUint8(0, parseInt('D0',16));  
            dataView.setUint8(1, len);  
            var secretLen = secret.length;  
            for(var i=0; i<secretLen; i++){  
                dataView.setUint8(i+2, secret[i].charCodeAt());  
            }  
            dataView.setUint8(secretLen + 2, parseInt(action,16));  

            if(msgLen <= 5){  
                if(msg != ''){  
                    for(var i=0; i<msgLen; i++){  
                        dataView.setUint8(secretLen + 3 + i, msg[i].charCodeAt());  
                    }  
                }  
                buffers.push(buffer);  
            }else{  
                for(var i=0; i<5; i++){  
                    dataView.setUint8(secretLen + 3 + i, msg[i].charCodeAt());  
                }  
                buffers.push(buffer);  
                const buffer1 = new ArrayBuffer(msgLen-5);  
                const dataView1 = new DataView(buffer1);  
                for(var i=5; i<msgLen; i++){  
                    dataView1.setUint8(i-5, msg[i].charCodeAt());  
                }  
                buffers.push(buffer1);  
            }  
            //console.log(buffer.length);  

            return buffers;  
        }  

    },  
    onLoad(e) {  

    }  

联系方式
[3806994]

2019-02-21 14:58 负责人:无 分享
已邀请:
9***@qq.com

9***@qq.com

我已经转战apicloud 的ble模块了,那个兼容性很强,跟微信小程序的蓝牙差不多。

  • CLP

    dcloud蓝牙功能 主流功能是完整的,部分细节会慢慢完善

    2019-04-29 17:19

  • 9***@qq.com

    是用uni-app 再引apicloud 的ble模块吗

    2019-04-30 13:11

  • 9***@qq.com

    回复 9***@qq.com: 是整个项目都改用apicloud的ble模块了,不过这个坑也很多。勉强能使用。

    2019-04-30 14:10

  • XTiger (作者)

    回复 CLP: 主要功能虽然完整,但坑那么多,根本没法用,做产品和做实验的要求是不一样的

    2019-05-16 09:38

  • 许香香

    回复 XTiger: 什么时候完善啊,我设备服务加了定时器还有一定几率报10004错误找不到服务,然后我递归找,找不到让他一直找就死循环了……

    2020-05-22 12:54

  • 许香香

    回复 XTiger: 还有就是特征值也是有一定几率找不到

    2020-05-22 12:54

6***@qq.com

6***@qq.com

请问作者,我现在在试着用你的代码,也在做低功耗蓝牙5.0,但是出现了一个问题,用uni.getBLEDeviceServices获取所以服务时,获取不到自定义服务,请问你遇到过吗

  • XTiger (作者)

    没有遇到过你描述的问题

    2019-02-22 18:20

  • 轨道已开

    给一个延迟1000-2000

    2019-04-17 11:08

CLP

CLP

uni.writeBLECharacteristicValue 写特征值之前要选中是 哪个服务uuid 下的哪个通信的uuid 然后再写特征值

  • XTiger (作者)

    deviceId, serviceId, characteristicId这3个值都有提供的,同样的代码在安卓上是可以正常运行的,但在IOS里不行,可以按照我上面的步骤测试一下

    uni.startBluetoothDevicesDiscovery

    uni.createBLEConnection

    uni.notifyBLECharacteristicValueChange

    uni.writeBLECharacteristicValue

    同样的步骤,在安卓平台onBLECharacteristicValueChange里可以监听到返回数据,但在IOS里监听不到

    2019-03-14 11:11

  • CLP

    @lihu2651@163.com:我们的5+demo是可以的

    2019-03-14 12:06

  • XTiger (作者)

    回复 CLP:能把demo发给我吗,邮箱:lihu2651@163.com,官方下载的demo好像没有蓝牙的功能

    2019-03-14 13:49

  • XTiger (作者)

    我也是按照官方的示例代码在iphone里运行的,出现以上问题

    2019-03-14 13:51

  • g***@163.com

    回复 CLP: 我看了hello5+的代码,判断特征值的properties是否为notify或indicate放在了if(characteristic.properties.write)的分支下,有什么特别用意?我的notify信道和write信道就是分开的,用你们这个demo岂不是无法监听了?

    2019-04-24 15:45

  • wxzhuhua

    回复 g***@163.com: 对,我也想问同样的问题

    2020-03-03 10:35

  • CLP

    回复 wxzhuhua: 你可以改一下

    2020-03-03 13:22

  • wxzhuhua

    回复 CLP:

    很多低功耗蓝牙设备无法更改怎么办?

    目前这个设备倒是可以改,已经试过了,本来特征值只有read和notify开启,现在增加了write,按照lihu2651的办法,先调用 writeCharacteristics后再马上执行一下readCharacteristics,然后再oncharacteristicValueChange,但结果还是一样,无法监听到订阅的特征值,不过我用的不是IOS手机,而是安卓手机,另外HBuilderX是目前最新版本,代码是uni-app里面的Hello蓝牙例程

    2020-03-03 14:15

  • CLP

    回复 wxzhuhua: 我的意思是:不是改你设备的特征值属性,改调用方法,直接notify,不是加那个if(characteristic.properties.write)试试

    2020-03-04 11:15

  • wxzhuhua

    回复 CLP: 试了一下,获取特征值以后直接调用notifyBLECharacteristicValueChange,订阅成功,但是还是无法监听到特征值的变化值(因为是用的蓝牙串口,其实就是设备那边通过串口发送的值)

    2020-03-04 14:39

  • CLP

    回复 wxzhuhua: 你试试第三方的蓝牙,看看能不能监听到特征值的变化,我们的蓝牙模块稳定很长时间了,一直没人报问题了,或者是你的用法不对

    2020-03-04 14:44

  • wxzhuhua

    回复 CLP: 测试所用设备用Nordic的手机蓝牙软件nRF Connect 连接测试过,收发都没有问题,但是用uni-app测试,只能发,不能收,真是奇怪,不知你们的例程有没有用蓝牙串口设备连接测试过?

    2020-03-04 21:10

  • CLP

    回复 wxzhuhua: 蓝牙串口设备 是低功耗蓝牙吗 你换个手机测试下,或者用iOS手机试试

    2020-03-05 10:27

  • wxzhuhua

    回复 CLP: 是低功耗蓝牙,跑nRF Connect和uni-app测试的是同一个手机,用其它手机也测试过,结果相同,所以应该不是手机问题,iOS手机尚未试过,准备安卓手机测试通过后再试

    2020-03-05 14:41

  • wxzhuhua

    回复 CLP: 没人报蓝牙问题,会不会是因为原先准备用uni-app开发蓝牙的人都跑光了呢?

    2020-03-06 15:07

  • CLP

    回复 wxzhuhua: 你单独开一个帖子说明白,什么现象,代码怎么写的,提供demo,设备能否寄过来我们测试?

    2020-03-06 15:19

  • wxzhuhua

    回复 CLP: 已开贴:https://ask.dcloud.net.cn/question/90196, 不知怎样提供demo? 设备只有一套,可以寄给你们,不过希望你们测试完成后可以寄回给我。

    2020-03-06 16:52

XTiger

XTiger (作者)

发现问题出在哪了,在安卓里可以createBLEConnection后直接writeBLECharacteristicValue,但在IOS里必须getBLEDeviceServices,getBLEDeviceCharacteristics,再writeBLECharacteristicValue
之前因为getBLEDeviceServices和getBLEDeviceCharacteristics都经常会出现失败,而且经常会出现无限次失败的情况,所以想省掉这两个步骤,没想到出现这样的问题

  • CLP

    你之前是说iOS的,连上蓝牙设备之后,直接调用writeBLECharacteristicValue 这个API传入对应的参数后 不会回调是吗

    2019-03-15 12:40

  • XTiger (作者)

    回复 CLP:是的

    2019-03-15 14:09

  • XTiger (作者)

    回复 CLP:因为我这的场景是相应的参数都是已知的,所以想着连接成功后就直接写数据了

    2019-03-15 14:11

  • CLP

    @lihu2651@163.com:第一次搜索到并且连接该蓝牙设备之后,原生层会有缓存,在没有断开连接之前(包括开发者主动连接或断开连接,设备丢失,连接异常断开等。)是可以直接调用writeBLECharacteristicValue这个API 并且有回调,有真实回调的数据说明写入数据成功,如果只有状态说明只是写的动作操作了,但不一定成功。

    2019-03-15 16:38

  • XTiger (作者)

    回复 CLP:下午又测试了一下,发现确实在连接后直接writeBLECharacteristicValue,在安卓和IOS都是可以的,但执行的结果还是不一样,在IOS必需要先调用一下readBLECharacteristicValue,然后再调用writeBLECharacteristicValue,才能接收到返回值,否则不行,但在安卓里调用readBLECharacteristicValue一直是失败,但不影响接收到返回值。以下是两个平台同样的代码返回的不同结果:

    安卓:

    17:10:13.518 startBluetoothDevicesDiscovery success:{"errMsg":"startBluetoothDevicesDiscovery:ok"} at common/lock.js:91

    17:10:13.538 onBluetoothAdapterStateChange: {"discovering":true,"available":true} at common/lock.js:56

    17:10:20.718 onBluetoothDeviceFound: {"devices":[{"deviceId":"DD:13:99:23:A0:64","name":"1-101","RSSI":-67,"localName":"1-101","advertisServiceUUIDs":["6E400001-B5A3-F393-E0A9-DD139923A064"]}]} at common/lock.js:61

    17:10:21.899 create connection success: {"errMsg":"createBLEConnection:ok"} at common/lock.js:113

    17:10:21.919 onBLEConnectionStateChange: {"deviceId":"DD:13:99:23:A0:64","connected":true} at common/lock.js:76

    17:10:22.740 set notify success: {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/lock.js:162

    17:10:23.059 d00f303461333136346435306164a7 at common/lock.js:193

    17:10:23.079 readBLECharacteristicValue fail: at common/lock.js:186

    17:10:23.099 write characteristics success: {"errMsg":"writeBLECharacteristicValue:ok"} at common/lock.js:200

    17:10:23.220 value:d008a70000aa3030 at common/lock.js:79

    17:10:23.239 close connection success: {"errMsg":"closeBLEConnection:ok"} at common/lock.js:214

    17:10:23.459 stop Discovery success: {"errMsg":"stopBluetoothDevicesDiscovery:ok"} at common/lock.js:226

    17:10:23.479 onBluetoothAdapterStateChange: {"discovering":false,"available":true} at common/lock.js:56

    17:10:23.499 stop Discovery success: {"errMsg":"closeBluetoothAdapter:ok"} at common/lock.js:235


    IOS:


    17:08:46.310 [LOG] : startBluetoothDevicesDiscovery success:{"errMsg":"startBluetoothDevicesDiscovery:ok"}

    17:08:47.370 [LOG] : onBluetoothDeviceFound: {"devices":[{"deviceId":"643F8B97-1247-2E12-E7DA-724BD7D5603F","advertisServiceUUIDs":["6E400001-B5A3-F393-E0A9-DD139923A064"],"localName":"1-101","name":"1-101","RSSI":-56}]}

    17:08:48.430 [LOG] : onBLEConnectionStateChange: {"connected":true,"deviceId":"643F8B97-1247-2E12-E7DA-724BD7D5603F"}

    17:08:48.450 [LOG] : create connection success: {"errMsg":"createBLEConnection:ok"}

    17:08:49.494 [LOG] : set notify success: {"errMsg":"notifyBLECharacteristicValueChange:ok"}

    17:08:49.514 [LOG] : value:d014a1e200000000000000000000000030303333

    17:08:49.534 [LOG] : d00f303461333136346435306164a7

    17:08:49.554 [LOG] : value:d00f303461333136346435306164a1

    17:08:49.574 [LOG] : readBLECharacteristicValue success: {"errMsg":"readBLECharacteristicValue:ok"}

    17:08:49.594 [LOG] : write characteristics success: {"errMsg":"writeBLECharacteristicValue:ok"}

    17:08:49.614 [LOG] : value:d008a70000aa3030

    17:08:49.634 [LOG] : close connection success: {"errMsg":"closeBLEConnection:ok"}

    17:08:49.654 [LOG] : onBLEConnectionStateChange: {"connected":false,"deviceId":"643F8B97-1247-2E12-E7DA-724BD7D5603F"}

    17:08:49.674 [LOG] : onBLEConnectionStateChange: {"connected":false,"deviceId":"643F8B97-1247-2E12-E7DA-724BD7D5603F"}

    17:08:49.694 [LOG] : stop Discovery success: {"errMsg":"stopBluetoothDevicesDiscovery:ok"}

    17:08:49.714 [LOG] : onBluetoothAdapterStateChange: {"available":true,"discovering":false}

    17:08:49.734 [LOG] : onBluetoothAdapterStateChange: {"available":false,"discovering":false}

    17:08:49.754 [LOG] : stop Discovery success: {"errMsg":"closeBluetoothAdapter:ok"}


    还可以发现,在IOS中每次调用notifyBLECharacteristicValueChange的时候也会返回上一次的结果,非常怪异。

    2019-03-15 17:14

  • XTiger (作者)

    其中: value:d008a70000aa3030,value:d014a1e200000000000000000000000030303333这些都是返回结果

    2019-03-15 17:16

  • XTiger (作者)

    我是在notifyBLECharacteristicValueChange成功后调用 的readCharacteristics和writeCharacteristics,以下为代码:

    uni.notifyBLECharacteristicValueChange({

    state: true,

    deviceId: Param.lockNo.toUpperCase(),

    serviceId: Param.serviceUuid.toUpperCase(),

    characteristicId: Param.characterUuid1.toUpperCase(),

    success(e) {

    console.log('set notify success: ' + JSON.stringify(e));

    setTimeout(function(){

    readCharacteristics();

    writeCharacteristics(Param.bleCmd);

    }, 300);

    },

    fail(e) {

    console.log('set notify failed: ' + JSON.stringify(e));

    }

    });

    2019-03-15 17:17

  • XTiger (作者)

    再贴一个IOS不执行readCharacteristics();的执行情况:

    17:17:52.030 [LOG] : startBluetoothDevicesDiscovery success:{"errMsg":"startBluetoothDevicesDiscovery:ok"}

    17:17:52.050 [LOG] : onBluetoothDeviceFound: {"devices":[{"deviceId":"643F8B97-1247-2E12-E7DA-724BD7D5603F","advertisServiceUUIDs":["6E400001-B5A3-F393-E0A9-DD139923A064"],"localName":"1-101","name":"1-101","RSSI":-53}]}

    17:17:53.074 [LOG] : onBLEConnectionStateChange: {"connected":true,"deviceId":"643F8B97-1247-2E12-E7DA-724BD7D5603F"}

    17:17:53.094 [LOG] : create connection success: {"errMsg":"createBLEConnection:ok"}

    17:17:54.134 [LOG] : set notify success: {"errMsg":"notifyBLECharacteristicValueChange:ok"}

    17:17:54.154 [LOG] : value:d008a70000aa3030

    17:17:54.174 [LOG] : d00f303461333136346435306164a7

    17:17:54.194 [LOG] : write characteristics success: {"errMsg":"writeBLECharacteristicValue:ok"}


    可以看到,在执行notifyBLECharacteristicValueChange后会得到一个返回结果,然后在执行writeCharacteristics后就没有反应了

    2019-03-15 17:19

  • CLP

    @lihu2651@163.com: 正常来说writeBLECharacteristicValue 之前notifyBLECharacteristicValueChange开启这个了吗?如果开启,writeBLECharacteristicValue 这个之后,onBLECharacteristicValueChange这个会有writeBLECharacteristicValue 这个的写入值的

    2019-03-15 20:27

  • XTiger (作者)

    回复 CLP:writeBLECharacteristicValue 之前肯定是先调用这notifyBLECharacteristicValueChange的,准确来说是在notifyBLECharacteristicValueChange的success方法里执行的writeBLECharacteristicValue的,我现在测试的结果就是在安卓里是正常的,在IOS里需先执行一次readBLECharacteristicValue,然后再执行writeBLECharacteristicValue才会有返回结果,而且,即使这样,两个平台的响应的结果也不一样

    2019-03-15 21:07

  • CLP

    @lihu2651@163.com: readBLECharacteristicValue和writeBLECharacteristicValue没有关系,读是读,写是写,连接之后就能写,写完之后数据有变化,有notify权限的话notifyBLECharacteristicValueChange开启了, onBLECharacteristicValueChange会监听到

    2019-03-16 11:24

  • XTiger (作者)

    回复 CLP:但是我这测试下来的情况就是这样的,所以怀疑是bug,如果你那有IOS的demo,能否给我一个,我测试下看看

    2019-03-16 12:40

  • CLP

    @lihu2651@163.com:官方的demo

    2019-03-16 16:50

  • XTiger (作者)

    回复 CLP:我也是用官方demo测试的,不知道怎么办了,找不到问题所在

    2019-03-17 21:44

  • XTiger (作者)

    回复 CLP:今天又发现一个问题,我的蓝牙设备是隔0.5秒广播一次信号,uni.onBluetoothDeviceFound在IOS里上报设备很快,应该是正常的,但在安卓里至少要隔5-10秒才会发现设备,有时候甚至要20多秒,不知道是什么原因。我在uni.startBluetoothDevicesDiscovery里的参数都是用的默认值,当我把参数interval设置一个值,比如10,然后在uni.onBluetoothDeviceFound中就获取不到设备了,这个不知道是不是bug

    2019-03-19 16:49

  • CLP

    @lihu2651@163.com:应该平台差异吧

    2019-03-19 18:44

  • 9***@qq.com

    回复 CLP: 我的是iOS和安卓写入数据在plus.bluetooth.onBLECharacteristicValueChange都没有响应是怎么回事,是不是这个plus.bluetooth有BUG 啊,再不行我就换APICloud的ble模块了,

    2019-04-23 11:24

  • CLP

    回复 9***@qq.com: iOS和安卓都没有响应,这个可能行不大,你用我们的demo试的也没有响应吗?

    2019-04-23 13:07

  • 9***@qq.com

    回复 CLP: 对的,我用demo试了,也是没有响应。写入成功了,

    2019-04-24 09:47

  • g***@163.com

    回复 CLP: 我这边测试跟楼主现象相似,ios真机运行,调用uni.onBLECharacteristicValueChange监听,后续接收不到设备返回的数据,但是只要调用uni.notifyBLECharacteristicValueChange,就能立即收到一个特征值变化的事件,返回的数据看起来像是上一次设备返回的,非常怪异

    2019-04-24 15:14

  • CLP

    回复 g***@163.com: 对呀,你得先订阅特征值变化,然后才能监听啊

    2019-04-24 15:22

  • CLP

    回复 9***@qq.com: 特征值变化需要先订阅,然后监听到

    2019-04-24 15:23

  • g***@163.com

    回复 CLP: 正常情况应该是订阅一次,后续只要特征值变化,就可以监听到;但现在的情况是,只有在订阅的当下立马会监听到一条数据,后面不会再收到数据,除非你再调用一次uni.notifyBLECharacteristicValueChange,就又监听到一条数据,这个东西难道需要反复调用?小程序和安卓都是正常的。

    2019-04-24 15:51

  • g***@163.com

    回复 CLP: 不好意思,我再补充一下,uni.notifyBLECharacteristicValueChange和uni.onBLECharacteristicValueChange我都调用了,然后我给我的ble写数据,ble会把我写的数据notify给我,在小程序和安卓下,我每次发送都能收到设备的回应,但是ios始终收不到设备返回的数据,这个就是目前的现象。为了解决这个问题,我把订阅、监听、发送等等每一个步骤都拆分成按钮单独调用进行测试,发现在ios下,只有在调用订阅后会立即监听到一个特征值变化事件,订阅一次监听到一条,而点击发送后,却收不到任何数据

    2019-04-24 16:07

  • CLP

    回复 g***@163.com: 你说的微信小程序,在iPhone手机上也是订阅一次,以后每次都能监听到变化的特征值吗?

    2019-04-24 16:14

  • 9***@qq.com

    回复 CLP: 都试了 ,确实不行,无论是先订阅还是先监听,还是订阅成功在监听,或者发送数据之前监听,发送成功监听,还是多处监听都试了,都不行。

    2019-04-24 16:16

  • g***@163.com

    回复 CLP: 对,是这样

    2019-04-24 16:59

  • XTiger (作者)

    回复 CLP:

    目前蓝牙还有几个坑

    1.前面几位朋友都发现了的问题,IOS下监听不到返回结果的bug。目前发现该问题可以通过在writeCharacteristics后调用一次readCharacteristics解决,我也不明白这中间有什么联系,反正是这样操作就能监听到返回结果了。

    2.IOS第一次打开app后第一次和蓝牙建立连接100%会自动中断连接,然后从第二次开始不会有该问题。目前采用的解决办法是监听连接状态,发现断开后自动重连;

    3.安卓平台第一次连接蓝牙时间超长,经过反复测试,每次都在30秒以上,将近40秒,只要把蓝牙关掉再重新打开就是这样。查了资料,发解到安卓第一次建立连接后会缓存蓝牙数据,以后再连的时候就自己从缓存取数据,关闭蓝牙开关会清空缓存。这个问题很早前就发现了,以前是第一次连接蓝牙操作时,很长时间发现不了蓝牙信号,即在uni.onBluetoothDeviceFound里一直没有上报信号,但我的蓝牙设备是0.5秒就上报一次信号。这几天测试发现问题又变了,现在上报信号的时间很短了,基本2、3秒就能发现信号,但是uni.createBLEConnection却要执行很长时间才有反应,一般在30多秒,这就不正常了。特意用一个蓝牙测试的原生app试过,一般2、3秒就能连接成功。这个问题目前没找到解决办法,只能等官方了。

    2019-04-29 16:56

  • CLP

    回复 XTiger: 谢谢反馈,正在积极排查

    2019-04-29 17:07

  • XTiger (作者)

    回复 CLP: 这几个问题在另发了一个帖子http://ask.dcloud.net.cn/question/70002,追加了一个问题:荣耀8X手机搜索不到蓝牙信号

    2019-04-29 17:11

  • q***@gmail.com

    回复 g***@163.com: 你好,我昨天使用mui也遇到了一模一样的问题,onBLECharacteristicValueChange()只有在notifyBLECharacteristicValueChange()之后才执行一次,请问目前ios平台的这个问题你解决了吗,谢谢

    2019-05-09 09:40

  • XTiger (作者)

    回复 q***@gmail.com: 我现在的解决办法是在调用完writeCharacteristics后,马上调用一下readCharacteristics,这样貌似可以

    2019-05-09 13:30

  • q***@gmail.com

    回复 XTiger: 谢谢热心解答,你现在这个解决办法是放弃使用notifyBLECharacteristicValueChange()和oncharacteristicValueChange()对吗?我这边蓝牙设备发送消息给APP很频繁,但是APP只有几个按钮按下时才发消息给设备,所以我觉得我使用readCharacteristics()来收消息的话会漏收数据。。。

    2019-05-09 14:36

  • XTiger (作者)

    回复 q***@gmail.com: 我的意思是在调用 writeCharacteristics后再马上执行一下readCharacteristics,然后在oncharacteristicValueChange就可以监听到结果了。这听起来很不可思议,但实事就是这样,我也不明白这之间有什么关联,你可以测试一下。

    2019-05-10 08:14

  • q***@gmail.com

    回复 XTiger: 大赞,果然是这样,我这边app蓝牙ble的表现现在两个平台都正常啦,谢谢

    2019-05-10 10:42

  • XTiger (作者)

    回复 q***@gmail.com: 还有很多坑,慢慢踩吧,我是上了贼船下不去了。

    2019-05-10 11:10

  • 2***@qq.com

    回复 CLP: 确实是作者所说的这样,我也是获取不到notify的数据,所以上论坛找到这里来了。现在加上一个uni.readBLECharacteristicValue后可以收到数据了。但是两个平台的API差异还是很大,想用一套代码兼容真是有点困难。官方的demo只有打开蓝牙,搜索蓝牙,连接,获取特征值等,根本没有写数据和读数据的例子。iOS的ble相关API问题真的挺多,我做这个项目都要快崩溃了。官方能好好整整这玩意么。

    2019-05-15 17:51

  • g***@163.com

    回复 XTiger: 我的蓝牙设备只有write和notify的通道,没有read的通道,那我调uni.readBLECharacteristicValue时characteristicId传啥呢?还是说随便传一个?

    2019-05-23 10:56

  • x***@qq.com

    至今,ios也存在这个问题,想要监听到onBLECharacteristicValueChange的值,必须先调用一下readBLECharacteristicValue,否则没戏,android 则正常。

    2019-07-25 14:31

  • XTiger (作者)

    回复 x***@qq.com: 官方工程师前两天已经改好了,估计下个版权应该就能更新出来了

    2019-07-31 09:47

1***@qq.com

1***@qq.com

请问楼主作者您的ios机型的写入通道用的是FFF几 谢谢

2***@qq.com

2***@qq.com - 90后IT男

经过这几个月了不知道大家的产品的都成型了没有,我现在还在摸索阶段,大家使用的时候有没有问题,主要也就是读写数据,设置参数

  • CLP

    放心用

    2019-09-20 12:12

  • 2***@qq.com

    回复 CLP: 我现在也做到了ios下发和读取了,现在还有这些问题吗,我现在也是没有回调好像

    2019-09-20 12:31

  • CLP

    回复 2***@qq.com: 很久没人反馈蓝牙问题了,应该没什么问题,你自己好好检查检查

    2019-09-20 12:33

  • 2***@qq.com

    回复 CLP: 这个帖子之后更新了好多东西吗,修复?

    2019-09-20 14:28

  • XTiger (作者)

    回复 2***@qq.com: 现在IOS都正常了,我这的场景目前使用已经没什么问题了

    2019-09-21 16:42

  • 2***@qq.com

    回复 XTiger: 我现在还正在做ios的,目前是在读数据,但是感觉不太正确,读完之后需要在onBLECharacteristicValueChange获取回调的值,但是我现在还是没有获取到,虽然返回了ok,请问在哪里传参?还有就是安卓的现在怎么样了?使用正常吗

    2019-09-23 08:40

  • 2***@qq.com

    回复 XTiger: 进行读的时候怎么传参啊,好像没找到呢,,,

    2019-09-23 10:31

9***@qq.com

9***@qq.com

plus.bluetooth.writeBLECharacteristicValue

1***@qq.com

1***@qq.com

2022年。。5+还是读不到notify值

1***@qq.com

1***@qq.com

onBLECharacteristicValueChange: {"deviceId":"E8:31:CD:AC:53:96","serviceId":"000000EE-0000-1000-8000-00805F9B34FB","characteristicId":"0000EE01-0000-1000-8000-00805F9B34FB","value":{}}

该问题目前已经被锁定, 无法添加新回复