當前位置:編程學習大全網 - 編程語言 - uniapp實現藍牙小票打印功能

uniapp實現藍牙小票打印功能

最近的壹個項目增加了小票藍牙打印的功能,由於之前對藍牙打印機了解不多,所以遇到的坑比較多,花了點時間把藍牙連接、打印模塊封裝成通用組件,並寫了個打印的例子,這裏做個記錄,以防忘記。

組件: 組件例子

項目需要實現的是App端連接藍牙打印機,打印的內容包括:

1、公司logo(本地圖片)

2、指定格式與排版的文本數據(直線、中英文)

3、簽名的圖片數據(接口傳回的網絡圖片地址)

首先要想能打印,藍牙肯定要連接上,開發前了解壹下低功耗藍牙連接操作流程:

按照api來走壹遍從連接到打印的流程:

這裏我將藍牙連接和打印的流程封裝在組件使用,父組件中只需在onPrint方法中拼接指令,通過bufferData屬性將拼接好的指令數據傳入組件內部即可進行打印操作,onPrintSuccess和onPrintFail分別為打印成功與失敗的回調:

組件內部的實現如下:

1、點擊打印按鈕,打開藍牙適配器(openBluetoothAdapter),並獲取已連接的設備(getConnectedBluetoothDevices),如果沒有已連接的設備則打開搜索設備彈框進行設備搜索(第2步),若設備已連接,則執行打印方法(第4步)

這裏的blesdk是為了方便使用,把uniapp藍牙相關的api統壹放到壹個文件中,並將方法轉為異步,其中還包括添加CPCL指令的字符拼接方法。gbk是壹個用於將數據轉碼為打印機能夠接受的數據格式的模塊

2、打開搜索設備彈框(isShowSearch控制彈框顯示隱藏)

點擊開始搜索(startBluetoothDevicesDiscovery),並監聽搜索到的新設備(onfindBlueDevices),藍牙搜索的操作比較耗費系統資源,所以建議在連接上設備、頁面銷毀時關閉搜索(stopBlueDevicesDiscovery),這裏,我加了兩個按鈕控制搜索的開關

由於加了篩選條件(rssi和設備名、設備ID)因此需要對onfindBlueDevices監聽到的設備列表進行篩選

3、設備列表點擊選擇連接設備

①設備列表中的每壹項都可以獲取到設備的name、deviceId等信息,連接時我們需要的就是deviceId,創建藍牙連接(createBLEConnection),在這之前可以通過onBLEConnectionStateChange監聽連接狀態的變化

②連接成功後順便把搜索設備開關關掉。連接成功後需要通過deviceId獲取設備服務(getBLEDeviceServices),這裏獲取時需要給方法設個延時,否則獲取出來的serviceId會是空的

③獲取設備服務成功後會返回servicesId數組,接著我們需要用deviceId和serviceId來獲取特征值(getDeviceCharacteristics)

④獲取到特征值之後需要找個變量將特征值暫存,因為後續向打印機發送數據時需要用到特征值。關閉搜索彈框

4、在連接上設備後,點擊打印按鈕,這時就可以開始拼接打印數據了。在第1步中做過判斷如果有已連接設備,則開始拼接數據並打印,這裏將拼接的任務交給父頁面(onPrint),拼接完成後通過bufferData傳入,在bufferData數據更新後開始將數據發送給設備,所需的參數即opt中的參數,deviceId為設備id;serviceId為服務id;characteristicId為特征碼;value為寫入的數據,需轉成GBK格式;lasterSuccess為數據全部發送成功的回調;onceLength為分包發送的每個數據包長度,因為安卓和iOS有不同,所以加個判斷。sendDataToDevice中封裝了分包發送的方法。

5、父頁面的onPrint中拼接bufferData數據,添加CPCL指令的方法放在bluetoolth.js中(@/components/kk-printer/utils/bluetoolth.js),以下為組件示例展示的壹部分常用的指令拼接方法,可查看項目中的@/components/kk-printer/utils/bluetoolth.js文件了解指令封裝方法的具體實現

6、實際項目中使用:

①頁面引入並使用components文件夾中的kk-printer組件

②使用組件

拼接數據時將不同的打印需求分不同方法拼接

打印logo圖片、打印簽名圖片,在canvasGetImageData前需要註意加個延時或等待draw()完成後執行,不然獲取到的圖像像素點數據會全是0。使用addCPCLImageCmd時註意調整灰度值threshold,灰度值過高或過低會導致低於灰度值的圖像像素點在方法中被篩掉,變成0

addBaseInfo:打印基本信息

addTicketsInfo:打印提單信息

這兩個都是打印文本與排版的,沒有什麽難點

最後講壹下數據(bufferData)拼接的註意點:

①向藍牙打印機發送數據打印,發送的任何內容都應該要轉成二進制數據,而且藍牙打印的文本編碼是GBK的,發送中文需轉成GBK編碼再轉成二進制數據發送,包括發送打印機指令也要轉成二進制數據發送

②藍牙打印機壹次接收的二級制數據有限制,不同的系統不同的藍牙設備限制可能不同,建議壹次20個字節,做遞歸分包發送

③發送完要打印的內容後,壹定要發送壹個打印的指令才能順利打印 (部分指令不需要)

④在分包發送的時候,由於設備連接不穩定,經常會出現10007,找不到特征值的情況,需要在失敗回調中記錄斷點,繼續發送後續的包

  • 上一篇:關於API?
  • 下一篇:面試老師壹般會問什麽問題
  • copyright 2024編程學習大全網