小程序蓝牙的写入数据问题 求助~!
发布于 7 年前 作者 qinjuan 19306 次浏览 来自 问答

先打开

wx.notifyBLECharacteristicValueChange(OBJECT)

这个功能 然后再写入

wx.writeBLECharacteristicValue(OBJECT)

就会写入失败吗?

我试过先写入 再打开notify就可以写入成功 可是这样的话 第一写入时的特征值变化是监听到了吗

wx.onBLECharacteristicValueChange(function(characteristic) {  

 console.log('characteristic value changed:', characteristic)

})


// 向蓝牙设备发送一个0x00的16进制数据

let buffer = new ArrayBuffer(1)

let dataView = new DataView(buffer)

dataView.setUint8(0, 0)


wx.writeBLECharacteristicValue({  // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取  deviceId: deviceId,  // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取  serviceId: serviceId,  // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取  characteristicId: characteristicId,  // 这里的value是ArrayBuffer类型  value: buffer,  success: function (res) {    console.log('writeBLECharacteristicValue success', res.errMsg)  } })

还有一个问题就是  小程序的蓝牙接口是不会自动跟蓝牙设备认证的吗?还是要自己手动写一个跟设备握手的过程?

谢谢~

8 回复

之前说的不太 是打开notify之后 会收到 要求认证的指令串,然后我这时候就要write过去 一些对应的指令 , 如果延时调用write的话 ,我就会错过发送的时机,有没有什么办法 能在开启notify之后 可以直接调用write呢?

之前说的不太 是打开notify之后 会收到 要求认证的指令串,然后我这时候就要write过去 一些对应的指令

————————

看到这里,不能收到指令串后才write对应的指令吗?收到指令是通过这个接口收到的吧?

wx.onBLECharacteristicValueChange(function(res) {  console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
})

哈哈哈 姗姗来迟too 我的wx号是wuhancrazy 麻烦您加我一下  我还有些小程序蓝牙上的问题想请教一下嘻嘻

  1. 这里想知道与蓝牙设备认证是什么流程?我理解蓝牙接口与蓝牙设备认证是业务流程,小程序只提供读写的能力;

  2. 对notify之后,设备不一定是notify完了(可以查一下Android BluetoothGatt.writeDescriptor接口,本质上是通过这个接口配合系统接口BluetoothGatt.setCharacteristicNotification),所以需要增加一定的延时去规避这个问题,notify后延时200ms(可调整)再去写入。

  3. 监听也是认证流程的一部分吗?为什么监听后无法延时去写入?

小程序这边notify是一个异步接口,当没有notify写入成功时,再调write接口会失败,建议在notify后加上延时规避这个问题。

你好,谢谢你的回答:

  1. “认证过程”是 设备方分析了打开notify之后 在wx.onBLECharacteristicValueChange 这个接口里拿到的数据 得出的:设备需要二到三个来回的数据获取和对应的数据写入 以达到认证的目的 此时才能正常地写入和读取数据,否则设备会一直向外发送要求认证的指令。

  2. 正常是 只有打开了notify之后 ,才能监听到设备向外发送的数据吧? 还有一点不太明白就是:有read属性的特征值的数据变化可以通过 wx.onBLECharacteristicValueChange 这个接口监听到是吧,这样的话 wx.readBLECharacteristicValue 是在特征值数据没有变化的时候也可以直接读取到里面的数据吗?我的这个read接口一直在报10008的错误,是不能单独使用还是必须也要在notify之后加上延时调用?

  3. 因为设备是一直在向外发送认证指令,所以我需要打开监听,而之前经过测试是 大概收到指令500ms之后 再向设备发送认证数据 就会没有效果了。所以我想问,如果设备是连接之后一直在向外发送数据的话,是从打开notify之后才算正式开始,还是说从create连接上就开始了,如果是从create就开始的话 ,我还是必须打开notify才能读取到这些数据是嘛.


    谢谢~~

姗姗来迟,

wx.readBLECharacteristicValue 是在特征值数据没有变化的时候也可以直接读取到里面的数据吗


可以的。

所以我想问,如果设备是连接之后一直在向外发送数据的话,是从打开notify之后才算正式开始,还是说从create连接上就开始了,如果是从create就开始的话 ,我还是必须打开notify才能读取到这些数据是嘛.


不是很明白这里开始的意思,是指认证开始的意思嘛?如果是这个意思的话,那应该是取决于设备开始认证的业务逻辑吧。

方便提供一下微信号,我添加一下您微信,仔细找找这个问题嘛?

感谢。

意思是在notify打开后 再延时调用write吗?

我这个应该是需要一个小程序和蓝牙设备握手的过程 ,搜索到设备后, 设备就一直在广播信息,这时候我就必须写入一些指令,如果延时调用了write接口 ,就会错过发送指令的时机,如果是直接写入,之后再打开notify的话,又会监听不到特征值的改变;

或者就是说,不做操作的时候read的接口能直接读取到特征值的数据吗,也需要在notify之后延时调用吗?!

回到顶部