文 | 极乐叔
这两天,我试着在小程序中,调用蓝牙设备接口。
这个模块做了 2 周,找了很多资料文档,看示例看别人的 demo,最后发现还是得靠自己。
下面,我将在知晓程序(微信号 zxcx0101)为大家总结,我在研究小程序蓝牙接口的时候遇到的问题。
关注「知晓程序」微信公众号,回复「开发」,获取小程序开发全套经验。
小程序如何连接蓝牙设备?
我实现的小程序模块自动连接(根据需要,可改手动),是在小程序初始化完成时开始自动调用执行。
大致流程:
点击查看大图
下面,我们一步步来完成这个流程。
开始连接蓝牙设备
1. 开启连接
app.js
的 onLaunch()
方法里中,我们调用 this.startConnect();
来开启连接,弹出提示框,进行配对。如果失败,则提示设备蓝牙不可用,同时开启蓝牙适配器状态监听。
2. 获取本机蓝牙状态
调用 this.getBluetoothAdapterState()
获取本机蓝牙适配器状态,判断是否可用。若 available
为 false
,则为用户没有开启系统蓝牙。
同时,判断程序还没有开始搜索蓝牙设备,调用 this.startBluetoothDevicesDiscovery()
开始扫描附近的蓝牙设备,以及 this.getConnectedBluetoothDevices()
,获取本机已配对的蓝牙设备。
3. 开始搜索新设备
开始搜索蓝牙设备 startBluetoothDevicesDiscovery()
,提示蓝牙搜索。
4. 获取已配对的蓝牙设备
需要注意的是,参数 services
(Array
)是必填的,但是官方示例中以及各种坑爹 demo 里从没见过有谁填写。不填写这个属性此方法,将无法获取到任何已配对设备。
如果要调用此方法,则代表需要连接特定设备,并且知道该设备的一个主服务 serviceId
。
如暂时不知道这个 ID,可以先手动连接一次想要连接的设备,然后获取 service
列表,记录属性 primary
为 true
的值至少一个。
5. 处理搜索功能开启失败的情况
如果搜索功能启动失败,回到第 2 步,重新检查蓝牙适配器。如果可用,开启蓝牙搜索功能并开启发现附近蓝牙设备事件监听:this.onBluetoothDeviceFound()
。
此方法可自定义过滤一些无效的蓝牙设备,比如 name
为空的,或是产品开发中,需要过滤设备名称不含有特定规律字符串的设备。
6. 自动配对设备
在第 5 步中发现了某个想配对的设备,则获取到该设备的 deviceId
,然后用 this.startConnectDevices()
接口,开始配对该设备。
开启连接后,为了避免出现冲突,一旦开启连接,则需要终止扫描附近蓝牙设备、终止读取本机已配对设备。
7. 连接成功后握手
连接成功后,使用 this.getService(deviceId)
接口,获取设备的所有服务。
8. 读取服务的特征值
9. 意外处理
如果扫描到的设备中没有想要连接的设备,可以尝试使用系统蓝牙手动配对,然后再小程序中调用 getConnectedBluetoothDevices()
获取本机已配对的蓝牙设备,然后过滤设备(可能获取多个已配对的蓝牙设备)。
然后,将已获取的蓝牙设备 deviceId
列表放入到一个数组中,然后调用自定义方法 this.loopConnect();
。
思路:通过递归调用获取已配对蓝牙设备的 deviceId
,如果获取到了就去连接,如果 devicesId[x]
为空,说明上传调用 getConnectedBluetoothDevices()
时,获取到的已配对设备全部连接失败了。
这时候,我们需要则开启重新获取已配对蓝牙设备,并开启扫描附近蓝牙设备。
10. 自动循环重试
startConnectDevices('loop', array)
方法,是当获取已配对蓝牙设备进行连接时调用。
其中的处理逻辑上文已经贴出,意思就是在连接失败后 fail
方法里累加一个全局变量,然后回调 loopConnect(array)
方法。
11. 手动连接
上文介绍的方法是为了直接自动连接,如果不需要自动连接,可使用方法 getBluetoothDevices()
,获取已扫描到的蓝牙设备的列表。
开发者可以做个页面显示出设备名,用户点击某个设备后,才开始连接。
需要注意的事项
that.serviceId
是在初始化时设置的,由于对需要连接设备的主服务 serivceId
和各种特征值都是已知的,因此可以这样做。如果不可知,可以做一个扫描方法自己检查特征值的用途。writeBLECharacteristicValue
和 openNotifyService
操作需要注意,如果同时开启这两项操作要先调用 wirte
再开启 notify
(原因未知,个人心得)。onBlueToothAdapterStateChange()
监听蓝牙适配器状态,以此判断连接过程中、连接后用户开关了设备蓝牙。如果判断到关了蓝牙,发出开启蓝牙的提示;如果监听到开启了,就重新回到第 1 步。最后本文属于个人开发者的一点总结,欢迎留言指导讨论。
原文地址:http://www.jianshu.com/p/0b41d9ff7abc