详细问题描述
(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)
[内容]
1.调用uni.notifyBLECharacteristicValueChange会触发uni.onBLECharacteristicValueChange,并会返回上一次uni.writeBLECharacteristicValue后的返回结果
- 在1.9.7之前的版本调用uni.writeBLECharacteristicValue后,不会触发uni.onBLECharacteristicValueChange,但在调用uni.writeBLECharacteristicValue后马上执行uni.readBLECharacteristicValue会触发uni.onBLECharacteristicValueChange,在onBLECharacteristicValueChange中也能获得正确的返回结果;在1.9.7后,调用uni.writeBLECharacteristicValue可以正常触发uni.onBLECharacteristicValueChange,但在onBLECharacteristicValueChange无法返回正确的结果,一直返回空值
- uni.writeBLECharacteristicValue在真机调试和越狱包都执行正常,但上架到app store后只能偶尔几次写入成功,但不管是否写入成功都会返回ok,从蓝牙设备的响应可以看出是否写入成功。
- 以上问题均只在IOS的app里出现,安卓都正常
重现步骤
[步骤]
示例代码
uni.onBLECharacteristicValueChange(function(e) {
console.log('onBLECharacteristicValueChange:' + util.buf2hex(e.value).trim());
Param.stateChangeBack('onBLECharacteristicValueChange:' + util.buf2hex(e.value).trim());
var result = util.buf2hex(e.value).trim();
if (Param.writeOk)
success(result);
});
function writeCharacteristics(cmds) {
Param.stateChangeBack('writeCharacteristics');
for (var i = 0; i < cmds.length; i++) {
console.log('cmd:' + util.buf2hex(cmds[i]));
Param.stateChangeBack('cmd:' + util.buf2hex(cmds[i]));
uni.writeBLECharacteristicValue({
deviceId: Param.lockNo.toUpperCase(),
serviceId: Param.serviceUuid.toUpperCase(),
characteristicId: Param.characterUuid.toUpperCase(),
value: cmds[i],
success: function(e) {
console.log('write characteristics success: ' + JSON.stringify(e));
Param.stateChangeBack('write characteristics success: ' + JSON.stringify(e));
},
fail: function(e) {
console.log('write characteristics failed: ' + JSON.stringify(e));
Param.stateChangeBack('write characteristics failed: ' + JSON.stringify(e));
//failure(FailMsg.WRITEVALUEFAIL);
if (Param.doIndex < 10) {
Param.doIndex++;
setTimeout(() => {
writeCharacteristics(Param.bleCmd);
}, 200);
}
}
});
}
}
运行日志:
21:42:38.807 open adapter success: {"errMsg":"openBluetoothAdapter:ok"}
21:42:38.828 startBluetoothDevicesDiscovery success:{"errMsg":"startBluetoothDevicesDiscovery:ok"}
21:42:38.848 onBluetoothAdapterStateChange: {"available":true,"discovering":false}
21:42:38.869 startBluetoothDevicesDiscovery success:{"errMsg":"startBluetoothDevicesDiscovery:ok"}
21:42:38.889 onBluetoothDeviceFound: {"devices":[{"RSSI":-52,"advertisServiceUUIDs":["6E400001-B5A3-F393-E0A9-DEAFD37C1A10"],"deviceId":"9A48D668-F275-8C7A-6BFE-F14D01B49CAA","localName":"000-102","name":"000-102"}]}
21:42:38.930 stopBluetoothDiscovery
21:42:38.971 start connect
21:42:38.992 stop Discovery success: {"errMsg":"stopBluetoothDevicesDiscovery:ok"}
21:42:39.012 onBluetoothAdapterStateChange: {"available":true,"discovering":false}
21:42:39.833 onBLEConnectionStateChange: {"connected":true,"deviceId":"9A48D668-F275-8C7A-6BFE-F14D01B49CAA"}
21:42:39.853 create connection success: {"errMsg":"createBLEConnection:ok"}
21:42:40.899 set notify success: {"errMsg":"notifyBLECharacteristicValueChange:ok"}
21:42:40.919 onBLECharacteristicValueChange:d00ba53030a73030aa3939
21:42:40.940 cmd:d016303461333136346435306164a53535353330
21:42:40.960 cmd:35a7
21:42:40.981 write characteristics success: {"errMsg":"writeBLECharacteristicValue:ok"}
21:42:41.001 onBLECharacteristicValueChange:
21:42:41.042 close connection
21:42:41.063 close connection success: {"errMsg":"closeBLEConnection:ok"}
21:42:41.083 onBLEConnectionStateChange: {"connected":false,"deviceId":"9A48D668-F275-8C7A-6BFE-F14D01B49CAA"}
21:42:41.104 onBLEConnectionStateChange: {"connected":false,"deviceId":"9A48D668-F275-8C7A-6BFE-F14D01B49CAA"}
21:42:41.125 stopBluetoothDiscovery
21:42:41.145 closeBluetoothAdapter
21:42:41.166 onBluetoothAdapterStateChange: {"available":false,"discovering":false}
21:42:41.186 closeBluetoothAdapter success: {"errMsg":"closeBluetoothAdapter:ok"}
IDE运行环境说明
[HBuilderX1.9.9]
[windows7]
uni-app运行环境说明
[运行端是app]
[运行端版本号:9.4.18]
[项目是HBuilderX创建的]
App运行环境说明
[iOS版本号:9.1、12.2、12.1.4、12.1.2]
[手机型号:iphone5、iphone SE、iPhone7 Plus、iPhoneXSMax、iPhone6s Plus、iPhoneX、iPHoneXR]
[模拟器型号]
附件
[QQ:3806994]
5 个回复
XTiger (作者)
又是石沉大海
CLP
每次写入完成都启动notifyBLECharacteristicValueChange监听 试试
XTiger (作者)
试过,写完后再调用notifyBLECharacteristicValueChange,onBLECharacteristicValueChange会响应,但返回结果仍然是空,但在xcode里则写入完成后能监听到返回结果
2019-06-11 21:14
CLP
回复 XTiger: 在xcdoe里是说你自己对原生插件吗?
2019-06-14 12:24
XTiger (作者)
回复 CLP: 用xcode打包的时候真机运行
2019-06-14 13:44
CLP
回复 XTiger: 就是说你是离线用xcode打包的时候,能监听到要的结果;HBuilderX运行的时候不行是吗
2019-06-14 13:59
XTiger (作者)
回复 CLP: 是的,打好包在手机上运行也不行
2019-06-14 14:03
CLP
回复 XTiger: 什么叫打好包? 是离线打包还是云打包?
2019-06-14 14:35
XTiger (作者)
回复 CLP: 云打包
2019-06-14 14:37
CLP
是xcode调试的时候可以还是Xcode打包的时候可以,什么情况下不行?是HBuilderX调试的时候不行?
2019-06-14 14:37
CLP
你描述的细节,说不通啊,云打包和xcode离线打包,在蓝牙上没什么区别的,为什么会云打包不行,离线打包可以了
XTiger (作者)
xcode调试的时候可以,离线打包好的我还没试,正在准备试一下,HBuilderX调试和云打包的都是不行的
2019-06-14 15:11
XTiger (作者)
之前是用的1.9.4的SDK,刚换成2.0.0的SDK试了下,xcode调试也没有返回结果了
openBluetooth
> openBluetoothAdapter
> open adapter success: {"errMsg":"openBluetoothAdapter:ok"}
> startDiscovery
> startDevicesDiscovery
> startBluetoothDevicesDiscovery success:{"errMsg":"startBluetoothDevicesDiscovery:ok"}
> onBluetoothAdapterStateChange: {"available":true,"discovering":false}
> startDiscovery
> startDevicesDiscovery
> startBluetoothDevicesDiscovery success:{"errMsg":"startBluetoothDevicesDiscovery:ok"}
> onBluetoothDeviceFound: {"devices":[{"RSSI":-80,"advertisServiceUUIDs":["6E400001-B5A3-F393-E0A9-C0BD13F2AB4E"],"deviceId":"A80ABA07-373A-4EDF-19B2-925085697685","localName":"000-101","name":"000-101"}]}
> stopBluetoothDiscovery
> start connect
> stop Discovery success: {"errMsg":"stopBluetoothDevicesDiscovery:ok"}
> onBluetoothAdapterStateChange: {"available":true,"discovering":false}
> onBLEConnectionStateChange: {"connected":true,"deviceId":"A80ABA07-373A-4EDF-19B2-925085697685"}
> create connection success: {"errMsg":"createBLEConnection:ok"}
> startCharacteristicsNotify
> set notify success: {"errMsg":"notifyBLECharacteristicValueChange:ok"}
> onBLECharacteristicValueChange:d00ba53030a73030aa3030
> writeCharacteristics:d016303461333136346435306164a53731343334
> write characteristics success: {"errMsg":"writeBLECharacteristicValue:ok"}
> writeCharacteristics:30a7
> onBLECharacteristicValueChange:
> write characteristics success: {"errMsg":"writeBLECharacteristicValue:ok"}
> onBLECharacteristicValueChange:
> success
2019-06-14 16:03
CLP
如果每次notifyBLECharacteristicValueChange都订阅再监听, 或者readBLECharacteristicValue读也不行的话,我们排查下
XTiger (作者)
每次都是这样
2019-06-14 21:11
CLP
回复 XTiger: 你的write的 property是啥
2019-06-17 12:02
XTiger (作者)
回复 CLP: 你说的是Characteristic的属性吗?写是true,读是false
2019-06-17 13:43
XTiger (作者)
还一个问题,一次写入超20个字节,我的蓝牙设备是等所有结果写入完成后才返回结果的,在安卓上是正常的,将超过20字节的数据分成两次写入,等写入完成后,在onBLECharacteristicValueChange会监听到结果,但在苹果里,每次写入都会响应onBLECharacteristicValueChange,但没有结果,可以看上面的日志
2019-06-17 13:46
XTiger (作者)
回复 CLP: 蓝牙上有两个Characteristic,一个只能写不能读,用来接收写入数据,另一个只能读,用来监听反馈结果
2019-06-17 13:49
CLP
回复 XTiger:把2个特征值完成的属性发一下,我试的特征值write为true时,监听的时候是有返回值的,如果没有任何信息返回应该是写成功了,但是返回的数据就是空,所以js层看到的现象就是没有返回结果,实际在原生层是空值即 value=nil
2019-06-18 16:18
XTiger (作者)
回复 CLP: 第一个Characteristic: Properties: Notify,这个用于监听返回结果,uni.notifyBLECharacteristicValueChange的时候用的是这个
第二个Characteristic:Properties: Write, Write no response,这个用于写入
2019-06-18 16:45
XTiger (作者)
写入是成功的,蓝牙设备是有反应的,只是监听不到结果
2019-06-18 16:46
CLP
回复 XTiger: 蓝牙设备是有反应的,这句话是什么意思,有什么反应
2019-06-18 17:35
CLP
Characteristic:Properties: Write, Write no response 这个写的属性,是HX打印出来的吗?
2019-06-18 17:37
XTiger (作者)
回复 CLP: 蓝牙上面有指示灯,写入成功灯会亮
2019-06-18 21:18
XTiger (作者)
回复 CLP: Properties: Write, Write no response,这个是用第三方的APP查看的
2019-06-18 21:19
XTiger (作者)
回复 CLP: 另外,还有这个问题,麻烦也帮忙查查看http://ask.dcloud.net.cn/question/72681
iphone7、ipponeXR两个型号的手机操作完蓝牙后,蓝牙停止广播,怀疑是不是没有正常断开连接。
2019-06-19 07:58
CLP
回复 XTiger: 第一个Characteristic: Properties: Notify 这个属性是true还是false。把HX打印的2个特征值发出来看看
2019-06-19 11:15
XTiger (作者)
回复 CLP: 第一个Characteristic: Properties: Notify 这个属性是true,第二个Characteristic: Properties: Notify,这个属性是false
2019-06-19 13:57
XTiger (作者)
回复 CLP: 具体属性看下面的回复的图片,这是用HelloUniApp小程序获取的属性截图
2019-06-19 14:09
XTiger (作者)
回复 XTiger: 可以的话加下我QQ:3806994,沟通起来方便点
2019-06-19 14:12
XTiger (作者)