古詩詞大全網 - 個性簽名 - Uniapp實現藍牙收據打印功能。

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.單擊設備列表選擇連接的設備。

(1)設備列表中的每壹項都可以得到設備名稱、設備Id等信息。連接時,我們只需要deviceId來創建藍牙連接。在此之前,我們可以通過onBLEConnectionStateChange來監控createBLEConnection的狀態。

②連接成功後,順便關閉搜索設備開關。連接成功後,需要通過deviceId獲取設備服務(getBLEDeviceServices)。這裏需要在獲取方法時為方法設置壹個延遲,否則獲取的serviceId將為空。

③成功獲取設備服務後,會返回serviceId數組,然後我們需要使用deviceId和Service ID來獲取特征值。

(4)獲得特征值後,需要找壹個變量來臨時存儲特征值,因為後面向打印機發送數據時需要用到特征值。關閉搜索框

4.連接好設備後,點擊打印按鈕,就可以開始拼接打印數據了。在步驟1中,判斷是否有連接的設備,將拼接並打印數據。在這裏,拼接任務會交給父頁面(onPrint),拼接完成後,數據會傳輸到設備。bufferData的數據更新後,需要的參數是opt中的參數,deviceId是設備Id。ServiceId是服務id;特性Id是壹個功能代碼;Value是寫數據,需要轉換成GBK格式;LasterSuccess為所有數據發送成功的回調;OnceLength是分包發送的每個數據包的長度。因為安卓和iOS不壹樣,補充壹個判斷。分包發送的方法封裝在sendDataToDevice中。

5.添加CPCL指令的方法放在bluetool.js中(@/components/kk-printer/utils/blue tool . js)。下面是壹些常用的指令拼接方法,通過組件實例來展示。請檢查項目中的@/components/kk-printer/utils/blue tool . js。

6、實際工程中使用的:

①該頁面介紹和使用組件文件夾中的kk-printer組件。

②使用組件

拼接數據時,不同的打印需求拼接方式不同。

打印logo圖片和簽名圖片時,需要註意在canvasGetImageData之前加壹個延遲或者等到draw()完成,否則得到的圖像像素數據將全部為0。使用addCPCLImageCmd時,註意調整灰度值閾值。如果灰度值過高或過低,在該方法中,低於灰度值的圖像像素將被篩選出來並變為0。

AddBaseInfo:打印基本信息

AddTicketsInfo:打印提單信息。

兩者都是印刷文字和排版,沒有難度。

最後說壹下數據拼接的註意點:

①將數據發送到藍牙打印機進行打印。發送的任何東西都要轉換成二進制數據,藍牙打印的文本編碼是GBK。發送中文時,要先轉換成GBK編碼,再轉換成二進制數據,包括發送打印機指令。

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

③發送要打印的內容後,必須發送打印指令才能順利打印(有些指令不需要)。

(4)在分包傳輸過程中,由於設備連接不穩定,經常會出現10007找不到特征值的情況,需要在失敗回調中記錄斷點,繼續發送後續數據包。