『壹』 uniapp實現藍牙小票列印功能
最近的一個項目增加了小票藍牙列印的功能,由於之前對藍牙列印機了解不多,所以遇到的坑比較多,花了點時間把藍牙連接、列印模塊封裝成通用組件,並寫了個列印的例子,這里做個記錄,以防忘記。
組件: 組件例子
項目需要實現的是App端連接藍牙列印機,列印的內容包括:
1、公司logo(本地圖片)
2、指定格式與排版的文本數據(直線、中英文)
3、簽名的圖片數據(介面傳回的網路圖片地址)
首先要想能列印,藍牙肯定要連接上,開發前了解一下低功耗藍牙連接操作流程:
按照api來走一遍從連接到列印的流程:
這里我將藍牙連接和列印的流程封裝在組件使用,父組件中只需在onPrint方法中拼接指令,通過bufferData屬性將拼接好的指令數據傳入組件內部即可進行列印操作,onPrintSuccess和onPrintFail分別為列印成功與失敗的回調:
組件內部的實現如下:
1、點擊列印按鈕,打開藍牙適配器(openBluetoothAdapter),並獲取已連接的設備(getConnectedBluetoothDevices),如果沒有已連接的設備則打開搜索設備彈框進行設備搜索(第2步),若設備已連接,則執行列印方法(第4步)
這里的blesdk是為了方便使用,把uniapp藍牙相關的api統一放到一個文件中,並將方法轉為非同步,其中還包括添加CPCL指令的字元拼接方法。gbk是一個用於將數據轉碼為列印機能夠接受的數據格式的模塊
2、打開搜索設備彈框(isShowSearch控制彈框顯示隱藏)
點擊開始搜索(),並監聽搜索到的新設備(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,找不到特徵值的情況,需要在失敗回調中記錄斷點,繼續發送後續的包
『貳』 安卓手機連接藍牙列印
不知道你用的什麼型號列印機,我的是hp100 開藍牙,可以直接列印。
1 列印機打開藍牙
2 手機打開藍牙,搜索設備,配對連接。
3 打開像冊,發送圖片到藍牙設備。
其他
要使用藍牙熱敏標簽列印機無線列印,就要將列印機與手機進行配對連接。下面介紹連接方法。
工具/原料
藍牙熱敏列印機 安卓手機
方法/步驟
1/6 分步閱讀
打開手機藍牙開關,將藍牙熱敏列印機插上電源,打開電源開關
2/6
下載安裝gprinter標簽列印軟體。如果應用商店找不到,可以通過瀏覽器搜索下載,安裝後打開
3/6
點擊「列印工具」按鈕,點擊「藍牙 設置」
4/6
軟體將自動搜索周圍開啟藍牙的設備,找到你的藍牙列印機(printer ***),點擊
5/6
在藍牙配對對話框中,輸入pin碼,初始號碼為0000。配對成功後,將顯示連接設備的名稱設置
6/6
配對成功後,以後打開標簽編輯軟體將自動列出列印機,不用再次配對。返回軟體啟動界面,即可進入編輯和列印。
注意事項
如果搜索不到列印機,請先檢查列印機電源是否接通,電源燈是否亮了。