微信藍芽連線列印流程
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
藍芽列印的話,直接把資料轉二進位制傳過去是不行的,印表機是識別不了的,因為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 //關閉藍芽模組