小程序蓝牙API实践
概念
蓝牙基础概念可以参考这个 链接1 ,在此链接底部中有基础demo。链接2是相关概念及具体API陈述。本文暂不涉及蓝牙beacon。建议启动demo对照文档逐步练习、理解。
每个蓝牙设备可能提供多个 Service(服务),每个 Service 可能有多个 Characteristic(特征值),我们根据蓝牙设备的协议对对应 Characteristic 的值进行读写即可达到与其通信的目的。
假设实现手机控制蓝牙设备灯光亮起,实现过程是:手机(蓝牙主机设备)给蓝牙设备(蓝牙从机设备)发送灯光亮起信号,约定发送1即灯光亮起,发送2即灯光熄灭。即在从机某个服务中的某个特征值中写入1即可控制灯光亮起。
流程
初始化蓝牙模块 wx.openBluetoothAdapter
初始化失败时提示用户打开蓝牙并给予微信访问蓝牙的权限!安卓端需要打开定位;同时,监听蓝牙适配器状态 wx.onBluetoothAdapterStateChange,一旦蓝牙可用时可进行第2步操作
搜索蓝牙设备 wx.startBluetoothDevicesDiscovery
此API比较消耗性能,不要重复搜索,并且在连接蓝牙设备后需停止搜索设备 wx.stopBluetoothDevicesDiscovery
此API不会返回蓝牙设备,请继续往下看。
监听搜寻新设备 wx.onBluetoothDeviceFound
此API返回搜寻到的蓝牙设备(数组形式),在返回的设备数组中包含name、localName、RSSI(信号强度)、deviceId(设备id)等信息。可根据业务对设备列表进行过滤、排序等操作。
连接蓝牙设备 wx.createBLEConnection
根据业务需求与蓝牙设备进行交互,如用户手动选择蓝牙设备并进行连接或与硬件工程师约定标识(deviceId、name…)进行直连。
连接设备需要传入第3步 获取的deviceId(设备id),返回连接的结果。若成功则需停止搜索设备 wx.stopBluetoothDevicesDiscovery ,失败可提示用户。
监听蓝牙设备连接状态 wx.onBLEConnectionStateChange
用于处理蓝牙连接意外断开等异常情况
获取已连接蓝牙设备的services(服务) wx.getBLEDeviceServices
可在第5步成功后延时3秒再获取services,需要传入第3步 获取的deviceId(设备id)。返回蓝牙设备的所有服务(数组形式)
可根据业务对蓝牙设备服务列表进行过滤、排序等操作。Android端与iOS端列表可能有不同,安卓上,部分机型获取设备服务时会多出 00001800 和 00001801 UUID 的服务,这是系统行为,注意不要使用这两个服务。
获取蓝牙设备服务中的特征值 wx.getBLEDeviceCharacteristics
在第6步中从蓝牙设备中取得services,而单个service中有多个Characteristics(特征值)。所以此时先遍历services,拿到每个service的serviceId(也就是service的uuid)+deviceId 传入 wx.getBLEDeviceCharacteristics 来获取单个service中的Characteristics(特征值)。返回的Characteristics为数组形式。一个蓝牙设备对应多个服务,一个服务对应多个特征值。
遍历Characteristics(特征值)列表,取得每个特征值的属性:uuid(每个Characteristic的uuid,iOS和Android可能会不同)、write、read、notify等属性。根据自身业务,判断特征值是否可读写可notify等,进行后续操作。如果特征值可读则wx.readBLECharacteristicValue,但此时不会返回值。 如果可notify则wx.notifyBLECharacteristicValueChange,但值变化时此方法不会返回新值,而是通过wx.onBLECharacteristicValueChange返回新值。
在步骤2遍历中监听每个特征值变化 wx.onBLECharacteristicValueChange 此时才会读取到值
因为监听只能针对单个特征值,所以需要在第2步遍历中进行监听。值变化时可根据自身业务进行更新等操作。
注意,此时读取到的值是ArrayBuffer形式,需要进行转化才可读取到真正的值。 转化时需要注意硬件工程师写入的值的编码及进制!(如ASCII码 16进制) 点此链接了解ArrayBuffer 点此链接了解进制
可以给每个Characteristic绑定其serviceId以便后续使用。
至此,蓝牙设备所有特征值已获取完毕。
读写蓝牙设备服务中的特征值
写数据: wx.writeBLECharacteristicValue 。写入的数据必须是ArrayBuffer 二进制类型 涉及数据转格式。可参考这个链接
读取值:在获取特征值时已监听值变化,关注wx.onBLECharacteristicValueChange即可取得最新的值
断开蓝牙设备的连接
关闭蓝牙模块
API
小程序中iOS仅支持低功耗蓝牙,因此仅关注低功耗蓝牙API及蓝牙通用API。