最近应公司要求开发一款小程序,有一个功能是通过低功耗蓝牙进行数据获取。由于本人是Android手机(苹果也有基本不用),所以调试一直用的都是Android端微信调试。产品快发布时,同事就用苹果来测试一下,结果才不忍睹。让我这人称"惊讶经理小王子",顿时颜面扫地。
第一,渲染的蓝牙名字问题
Android端的:
Android端中获取到蓝牙信息:name和localName是一致的。所以我就惯用name。
但是ios端:
ios端的name和localName是不一致的,所以用ios小程序显示的是E04-BT_V1.,当时都懵了。
第二,数据写入问题:
名字错了,发送总该行吧。结果大跌眼睛,一直提示发送错误。因为与小程序连的产品为了统一方便uuid默认0000FFF0-0000-1000-8000-00805F9B34FB,所以我直接把
serviceId: “0000FFF0-0000-1000-8000-00805F9B34FB”,
characteristicId: “0000FFF2-0000-1000-8000-00805F9B34FB”,写死了。
然后就一直报错,当时又懵逼了。于是看了度娘,微信开放社区都没解决。通过自己结合文档摸索,终于找到问题了。
如果手机是ios系统就必须将下两个方法写在wx.writeBLECharacteristicValue({})前面
wx.getBLEDeviceServices({
deviceId:devv,//devv蓝牙的deviceId就是上面图片中的"532B......."
success (res) {
wx.getBLEDeviceCharacteristics({
deviceId:devv,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId:res.services[1].uuid,//
success (res) {
// console.log( res.characteristics)
},
fail(res) {
console.error('getBLEDeviceCharacteristics===', res)
}
})
},
fail (e){
console.log('fail services:', res)
}
})
IOS写入数据时serviceId(服务)和characteristicId(特征)一定要大写
wx.writeBLECharacteristicValue({
deviceId: devv,
serviceId: “0000FFF0-0000-1000-8000-00805F9B34FB”,
characteristicId: “0000FFF2-0000-1000-8000-00805F9B34FB”,
第三,数据读取问题:
Android系统中wx.writeBLECharacteristicValue({})里直接放wx.notifyBLECharacteristicValueChange({})再放 wx.onBLECharacteristicValueChange(function (res) {})是可以将另一端发送的数据读出来的如下:
wx.writeBLECharacteristicValue({
deviceId: devv,
serviceId: "0000FFF0-0000-1000-8000-00805F9B34FB",
characteristicId: "0000FFF2-0000-1000-8000-00805F9B34FB",
value:that.data.buffer,
success: function (res) {
wx.notifyBLECharacteristicValueChange({
state: true,
deviceId:devv,
serviceId:"0000FFF0-0000-1000-8000-00805F9B34FB",
characteristicId: "0000FFF1-0000-1000-8000-00805F9B34FB",
success: function (res) {
wx.onBLECharacteristicValueChange(function (res) {
console.log( res)
})
}
})
}
})
IOS系统中就必须加上 wx.readBLECharacteristicValue({})不然数据是不更新的。(代码就不上了,跟上面差不多加上wx.readBLECharacteristicValue({}))就行。
下面说一下IOS中的uuid:
这是三种通过wx.getBLEDeviceServices({})获取的。
获取其特征值wx.notifyBLECharacteristicValueChange({})具体看问题二中的代码:
每一个uuid又有什么权限呢,看下图:
上面properties是权限,下面是对应的uuid
0000FFF3一般就要用于写操作(wx.writeBLECharacteristicValue({}))的特征值中,因为接收端一般不用0000FFF3特征值。
到这里就结束了,希望帮助你顺利脱坑,以上代码均是我举例说明,请结合自己实际代码进行调试。
希望能够帮到大家哦!IT需要爱与和平😊,最后请大家关注我,以及我的一分钟系列(Android篇和小程序篇)让你一分钟实现相应的功能,成功引起产品经理的注意袄。