收藏
回答

安卓手机上onBLECharacteristicValueChange不能触发

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug wx.onBLECharacteristicValueChange 客户端 6.7.3 2.4.2 [199]

- 当前 Bug 的表现(可附上截图)


在Android手机上,成功调用wx.notifyBLECharacteristicValueChange后,调用wx.writeBLECharacteristicValue不能触发wx.onBLECharacteristicValueChange设置的回调函数,但在iOS手机上能够触发回调函数。


- 预期表现


回调函数被触发


- 复现路径


调试环境:小米6 Pro,Android 8.1.0,微信6.7.3


第一步,定义回调方法:

const onBleCharRead = res => { ... }


第二步,调用wx.onBLECharacteristicValueChange(onBleCharRead)设置回调监听


第三步,调用wx.notifyBLECharacteristicValueChange方法启用指定characteristic的notify功能(提示成功)


第四步,调用wx.readBLECharacteristicValue方法读取另外一个characteristic的数据(此时onBleCharRead回调被触发)


第五步,调用wx.writeBLECharacteristicValue方法向指定的characteristic些数据(数据长度20字节)


进行第五步时onBleCharRead一直不会被触发,尝试过在write之前延迟一段时间(最长1s),但仍然不能解决问题。


相关日志如下:



回答关注问题邀请回答
收藏

3 个回答

  • 长江一号
    长江一号
    2022-12-17

    我也排查了一两天,最后一个不经意的测试,让我发现问题所在。我用网上找的蓝牙助手去发命令,HBulider调试器竟然收到广播信息了,那说明我接收本身写的没有问题。

    之前我也加了type:'notification',还有plus.bluetooth.onBLECharacteristicValueChange这种写法,其实这些都可以不用加,只要正常的写法writeType: 'writeNoResponse' 即可了

    问题就在于写命令出错了,虽然返回写成功了。贴上我调试的代码吧

    // 写命令+接收广播消息
    var bufferstr = this.string2buffer(this.writeCmd);
    uni.writeBLECharacteristicValue({	
        deviceId,
        serviceId,
        characteristicId,
        value: bufferstr,
        writeType: 'writeNoResponse',
        success: res => {
            console.log('writeBLECharacteristicValue:success:' + JSON.stringify(res));
            setTimeout(() => {
                uni.onBLECharacteristicValueChange(res => {	
                    let buffer = res.value;	
                    let dataView = new DataView(buffer);
                    let dataResult = [];
                    for (let i = 0; i < dataView.byteLength; i++) {
                        dataResult.push(dataView.getUint8(i).toString(16));
                    }
                   const result = dataResult;
                   console.log('onBLECharacteristicValueChange:success:OK:', result);
                });
            }, 500);
        },
        fail: err => {
            console.log('writeBLECharacteristicValue:error:' + JSON.stringify(err));
        }											});
    
    string2buffer: function(str) {
        // 首先将字符串转为16进制
        let val = str;
        // 将16进制转化为ArrayBuffer
        return new Uint8Array(
      	val.match(/[\da-f]{2}/gi).map(function(h) {
      		return parseInt(h, 16);
      	})).buffer;
    }
    


    2022-12-17
    有用
    回复
  • 王江
    王江
    2019-03-26

    参考这篇帖子已经解决了:wx.onBLECharacteristicValueChange 在安卓无回调

    在notifyBLECharacteristicValueChange方法里面增加了以下参数:

    type: 'notification'


    2019-03-26
    有用
    回复
  • 疯狂的小辣椒
    疯狂的小辣椒
    2018-12-24

    麻烦给个相关的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)

    2018-12-24
    有用
    回复 4
    • 王江
      王江
      2019-03-26

      谢谢,问题目前是解决了,下面已经回复。不过type这个参数在官方文档里面是没有的,建议增加一下,或者在接口里面处理Android的情况

      2019-03-26
      回复
    • 疯狂的小辣椒
      疯狂的小辣椒
      2019-03-26回复王江

      好的,感谢反馈,后面我们在文档那里补充下

      2019-03-26
      回复
    • Wm
      Wm
      2019-04-13回复王江

      怎么解决的 ?


      2019-04-13
      回复
    • 王江
      王江
      2019-04-13回复Wm

      wx.notifyBLECharacteristicValueChange的参数里面增加:

      type: 'notification'

      2019-04-13
      回复
登录 后发表内容