一分钟解决微信小程序蓝牙(ble)进行读写操作Android和ios的各种奇葩坑

it2025-02-07  9

最近应公司要求开发一款小程序,有一个功能是通过低功耗蓝牙进行数据获取。由于本人是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”,写死了。 然后就一直报错,当时又懵逼了。于是看了度娘,微信开放社区,csdn都没解决。通过自己结合文档摸索,终于找到问题了。 如果手机是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篇和小程序篇)让你一分钟实现相应的功能,成功引起产品经理的注意袄。

最新回复(0)