刚刚结束了一个项目,其中用到了小程序的蓝牙模块,当时也是遇到了很多的问题,这里就说下其中遇到的一些问题和坑

1 流程

首先是开启蓝牙模块,
uni.openBluetoothAdapter({ success(res) { console.log(res) } })这里可以在fail的时候提示用户开启蓝牙,在成功的回调里获取本机蓝牙适配器状态,uni.getBluetoothAdapterState({ success(res) { console.log(res) } })当返回的适配器可用时,就可以开始连接蓝牙了。
这时候问题来了,我们的蓝牙是属于扫码连接蓝牙,扫码后对返回的结果处理下就得到了连接蓝牙的deviceId,但是后来发现ios系统的蓝牙deviceId和安卓的deviceId是不一样的,安卓的是设备的MAC地址,ios的是设备的UUID,所以就不能直接通过扫码后的结果来得到连接蓝牙的deviceId。
那么要如何解决这个问题呢
后来就通过小程序的蓝牙搜索来直接得到设备的deviceId,
详解小程序的蓝牙模块
在监听搜索新设备的事件里对设备进行定点搜索,我们通过扫码得到的字段和搜索得到的设备名进行比较,实现定点搜索,而不是得到搜索列表。这里当时遇到了一个小问题,ios在连接一次设备后其name发生改变了(具体原因不知),后来我们通过对比其localName才得以解决,具体设备具体情况处理,可以问下你们制作设备的人员。在得到设备的deviceId后就可以连接蓝牙了,连接完蓝牙后就可以启用低功耗蓝牙设备特征值变化时的 notify 功能,这里又有个新的坑了。一般来说一类设备的serviceId,characteriscId是一样的,也就是说在我们可以知道这类设备的serviceId,characteriscId情况下,是不需要去调用uni.getBLEDeviceServices和getBLEDeviceCharacteristics来获取对应的值的,
但是ios系统必须要调用。所以我们可以提前获取手机系统,在ios系统里就在调用uni.getBLEDeviceServices和getBLEDeviceCharacteristics接口后来监听特征值变化
详解小程序的蓝牙模块在监听特征值的变化里写回调函数。
对于蓝牙写入这里,主要就是一个分包函数,每次写入不能超过20个字节,这里一般要问下设备人员,蓝牙写入的每个分包的前缀是什么,包头,包中和包尾的前缀是不一样的。
所以大致流程就分为1.初始化蓝牙。
2.获取适配器状态
3.搜索蓝牙
4.在设备列表找到指定蓝牙
5.连接蓝牙
6.获取设备所以服务
7获取对应服务的特征值
8开启监听特征值变化的 notify 功能
9蓝牙写入

2 坑点

流程上就这么多,大多博客也写的大同小异,但是坑点的话蓝牙模块还是蛮多的,只要是ios和安卓的一些不一样,本文上面也把遇到的问题写了出来,希望能帮助大家

有疑问的欢迎留言

分类:

技术点:

相关文章: