- 当前 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),但仍然不能解决问题。
相关日志如下:
我也排查了一两天,最后一个不经意的测试,让我发现问题所在。我用网上找的蓝牙助手去发命令,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; }
参考这篇帖子已经解决了:wx.onBLECharacteristicValueChange 在安卓无回调。
在notifyBLECharacteristicValueChange方法里面增加了以下参数:
type: 'notification'
麻烦给个相关的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)
谢谢,问题目前是解决了,下面已经回复。不过type这个参数在官方文档里面是没有的,建议增加一下,或者在接口里面处理Android的情况
好的,感谢反馈,后面我们在文档那里补充下
怎么解决的 ?
wx.notifyBLECharacteristicValueChange的参数里面增加:
type: 'notification'