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關閉藍牙模塊,流程就結束了
其中參考的demo有https://gitee.com/copperpeas/wx-bluetooth、https://github.com/GitOfZGT/wx-bluetooth-print-demo
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 //關閉藍牙模塊