1、经历:最近在进行微信蓝牙打印功能模块的开发,了解了下蓝牙连接的全流程,好记性不如烂笔头,记录一下
2、感想:
先来说一下蓝牙连接的几个流程吧,虽然官方有且很详细了:https://developers.weixin.qq.com/miniprogram/dev/framework/device/ble.html
首先是蓝牙适配器模块的初始化wx.openBluetoothAdapter,不初始化是无法使用其他蓝牙接口的
初始化后,要开始扫描周围的蓝牙设备wx.startBluetoothDevicesDiscovery,还要配置扫描到蓝牙设备的监听方法wx.onBluetoothDeviceFound
触发扫描到蓝牙设备的监听方法后,我们可以调用wx.getBluetoothDevices获取在蓝牙模块生效期间所有搜索到的蓝牙设备
获取到devices列表后我们可以在页面展示出来,当点击要连接的蓝牙设备就取出该设备device里面的deviceId进行连接wx.createBLEConnection
连接成功后我们要停止扫描周围蓝牙设备wx.stopBluetoothDevicesDiscovery,同时取消监听蓝牙适配器状态变化事件wx.offBluetoothDeviceFound,因为扫描设备比较耗费系统资源
之后调用wx.getBLEDeviceServices获取连接的蓝牙设备提供的所有服务services,这时遍历一下如果有service里的isPrimary是true,说明这个service是主服务,就可以进行通信,如果多个主服务的话,就按业务需求操作就好了
选了主服务service后用这个服务的uuid和连接设备的deviceId去查该服务的所有特征值wx.getBLEDeviceCharacteristics
查到这个服务的所有特征值后进行遍历通过辨别特征的properties里面的write、read、notify来判断是否具备读写、订阅等功能
存在properties.read可以用wx.readBLECharacteristicValue,存在properties.notify的话可以监听订阅的notify事件,简单来说就是建立长连接,获取设备发出的数据
存在properties.write的话就可以调用wx.writeBLECharacteristicValue传入特征的uuid、服务的uuid和连接设备的deviceId来写入二进制数据数据
蓝牙打印的话,直接把数据转二进制传过去是不行的,打印机是识别不了的,因为js里面用的Unicode编码,译名为万国码、国际码。而打印机里面用的是GBK编码,也就是国标码,编码不同,所以要经过转义才行
转义完后,传给打印机的数据也不是随便传,除了传打印数据,还要传打印机能识别的指令,打印机才能动起来,目前主流的打印机控制语言有三种:Epson公司的ESC命令集、HP公司的PCL命令集、Adobe公司的PostScript(简称PS)命令集
刚好我开发的业务主要是打印票据,而ESC命令集是针式打印机和票据打印领域的事实上的工业标准,所以我用的是ESC命令集
写完数据后,打印机就成功打印出票据了,就可以调用wx.closeBLEConnection断开连接了,再调用wx.closeBluetoothAdapter关闭蓝牙模块,流程就结束了
wx.openBluetoothAdapter //初始化蓝牙模块 wx.startBluetoothDevicesDiscovery //开始扫描设备 wx.onBluetoothDeviceFound //监听发现设备时的事件 wx.getBluetoothDevices //获取蓝牙模块生效期间所有的设备 wx.createBLEConnection //连接设备 wx.stopBluetoothDevicesDiscovery //停止扫描设备 wx.offBluetoothDeviceFound //取消监听发现设备的事件 wx.getBLEDeviceServices //获取该设备所有服务 wx.getBLEDeviceCharacteristics //获取单个服务的所有特征 wx.writeBLECharacteristicValue //写入数据 wx.readBLECharacteristicValue //读取数据 wx.closeBLEConnection //断开连接 wx.closeBluetoothAdapter //关闭蓝牙模块