使用uniapp實現(xiàn)藍牙小票打印功能
一、項目背景與需求
近期,我們的一項應用增加了藍牙小票打印的功能。由于團隊成員對藍牙打印機了解有限,我們在實現(xiàn)過程中遇到了一些挑戰(zhàn)。為了順利推進項目,我們決定封裝藍牙連接和打印模塊為通用組件,并在此記錄下我們的實現(xiàn)過程,以便未來參考。

二、打印內(nèi)容概述
我們的應用需要實現(xiàn)連接藍牙打印機,并打印以下內(nèi)容:
1. 公司logo(使用本地圖片)
2. 指定格式與排版的文本數(shù)據(jù)(包括直線、中英文)
3. 簽名的圖片數(shù)據(jù)(通過接口獲取的網(wǎng)絡圖片地址)

三、藍牙連接與操作概述
要實現(xiàn)打印功能,首先需要連接藍牙打印機。我們深入了解了低功耗藍牙連接的操作流程,并按照API進行了實踐。
在組件中,我們封裝了從連接到打印的整個流程。父組件只需在onPrint方法中拼接打印指令,通過bufferData屬性將指令數(shù)據(jù)傳入組件即可進行打印操作。我們提供了onPrintSuccess和onPrintFail回調(diào),以便通知父組件打印的結(jié)果。
四、組件內(nèi)部實現(xiàn)詳解
組件內(nèi)部的實現(xiàn)邏輯如下:

1. 當用戶點擊打印按鈕時,我們先打開藍牙適配器(openBluetoothAdapter),并獲取已連接的設備(getConnectedBluetoothDevices)。如果沒有已連接的設備,我們會打開搜索設備彈框,讓用戶進行設備搜索。若設備已連接,則直接執(zhí)行打印方法。
2. 為了方便使用,我們將uniapp藍牙相關的api統(tǒng)一放到一個文件blesdk中,并將方法轉(zhuǎn)為異步。我們還添加了一個字符拼接方法,用于生成CPCL指令。gbk模塊用于將數(shù)據(jù)轉(zhuǎn)碼為打印機能接受的格式。
3. 設備搜索過程中,我們通過isShowSearch控制搜索設備彈框的顯示與隱藏。點擊開始搜索(startBluetoothDevicesDiscovery)后,我們監(jiān)聽搜索到的新設備(onfindBlueDevices)。為了節(jié)省系統(tǒng)資源,我們在連接上設備或頁面銷毀時停止搜索(stopBlueDevicesDiscovery)。
4. 在設備列表中點擊選擇需要連接的設備。我們從設備列表中的每一項都可以獲取到設備的name、deviceId等信息,連接時我們需要的就是deviceId。使用createBLEConnection創(chuàng)建藍牙連接,并通過onBLEConnectionStateChange監(jiān)聽連接狀態(tài)的變化。
5. 連接成功后,我們關閉設備搜索開關,準備進行打印操作。

五、總結(jié)
一、設備連接與服務獲取
設備連接與延遲獲取服務
連接成功后,需要通過deviceId獲取設備服務(getBLEDeviceServices)。在此過程中,設置一個延時是非常必要的,否則可能會獲取到空的serviceId。
二、獲取設備服務并處理返回值

處理設備服務返回的servicesId數(shù)組
成功獲取設備服務后,會返回一個servicesId數(shù)組。隨后,我們將使用deviceId和serviceId來獲取特征值(getDeviceCharacteristics)。
三. 特征值的暫存與處理
暫存特征值與關閉搜索彈框
獲取到特征值后,需要將其暫存于某個變量中。因為后續(xù)向打印機發(fā)送數(shù)據(jù)時,特征值會被用到。關閉搜索彈框以保證用戶界面的整潔。

四、打印數(shù)據(jù)的處理與發(fā)送
拼接并發(fā)送打印數(shù)據(jù)
連接上設備后,點擊打印按鈕,開始拼接打印數(shù)據(jù)。若存在已連接設備,則開始拼接數(shù)據(jù)并打印。拼接的任務交由父頁面(onPrint)處理,完成后通過bufferData傳入。在bufferData數(shù)據(jù)更新后,將數(shù)據(jù)發(fā)送給設備。這一過程涉及opt中的參數(shù),如deviceId、serviceId、characteristicId以及需要寫入的數(shù)據(jù)。數(shù)據(jù)需轉(zhuǎn)成GBK格式,lasterSuccess為數(shù)據(jù)全部發(fā)送成功的回調(diào)。還需考慮分包發(fā)送的情況,根據(jù)安卓和iOS的不同進行相應判斷。sendDataToDevice方法封裝了分包發(fā)送的功能。
五、打印指令的拼接與實現(xiàn)
指令拼接方法與實際使用

父頁面的onPrint負責拼接bufferData數(shù)據(jù)。CPCL指令的添加方法位于bluetoolth.js文件中(路徑為@/components/kk-printer/utils/bluetoolth.js)。這是組件示例展示的一部分常用指令拼接方法。要了解指令封裝方法的具體實現(xiàn),請查閱項目中的@/components/kk-printer/utils/bluetoolth.js文件。
六、項目中的實際應用
kk-printer組件的使用與注意事項
使用addCPCLImageCmd時調(diào)整灰度值threshold的注意事項
在使用addCPCLImageCmd方法時,灰度值threshold的調(diào)整至關重要。過高的灰度值會導致低于該值的圖像像素點被篩除,顯示為0,這可能對打印效果產(chǎn)生嚴重影響。為確保打印質(zhì)量,務必仔細調(diào)整灰度值threshold。

功能打印的注意事項
1. addBaseInfo和addTicketsInfo:這兩個功能主要用于打印基本信息和提單信息。在打印文本和排版方面,沒有特別的難點,但需要確保打印內(nèi)容的準確性和清晰性。
2. 數(shù)據(jù)(bufferData)拼接的要點:
(1)向藍牙打印機發(fā)送數(shù)據(jù)時,所有內(nèi)容必須轉(zhuǎn)換為二進制格式。藍牙打印支持的文本編碼為GBK,因此中文內(nèi)容需先轉(zhuǎn)換為GBK編碼,再轉(zhuǎn)為二進制發(fā)送。包括打印機指令也應以二進制格式發(fā)送。
(2)藍牙打印機一次接收的二進制數(shù)據(jù)量有限,不同系統(tǒng)和設備限制可能不同。建議每次發(fā)送20個字節(jié),采用遞歸分包發(fā)送的方式。

(3)打印前需發(fā)送打印指令,部分指令可省略。
(4)在分包發(fā)送過程中,因設備連接不穩(wěn)定,可能出現(xiàn)錯誤代碼10007及找不到特征值的情況。應在失敗回調(diào)中記錄斷點,繼續(xù)發(fā)送后續(xù)包。
uni-app連接便攜式藍牙打印機的細節(jié)
針對芝柯HDT334藍牙打印機,打印模式為CPCL。主要涉及到藍牙連接和CPCL指令集的定位、畫線功能。在此過程中,需要注意文字超出最大寬度時的動態(tài)換行問題。解決方法是在dom中創(chuàng)建一個隱藏div,將文字放入其中,比較div寬度與打印區(qū)域最大寬度,若超出則截取文字分兩行放置,并相應調(diào)整文字下方內(nèi)容的位置。
uniapp藍牙連接與打印功能的實現(xiàn)

在項目需求中,我們實現(xiàn)了低耗藍牙打印功能。剛開始時,由于涉及的api較多,確實有些復雜。但經(jīng)過梳理和測試,最終成功實現(xiàn)了功能。需要注意的是,此功能不支持藍牙版本4.0以下的設備,對于低版本設備需尋找其他解決方案。在實現(xiàn)過程中,也遇到了一些莫名其妙的問題,但通過排查最終得以解決。
以上內(nèi)容在保持原文風格特點的基礎上,進行了流暢性和吸引力的優(yōu)化,同時確保了內(nèi)容的準確性和生動性。使用藍牙模塊:從初始化到連接與數(shù)據(jù)交互
一、初始化藍牙模塊
在我們的應用中,首先需要調(diào)用uni.openBluetoothAdapter來初始化藍牙模塊。這一步是確保后續(xù)操作能夠順利進行的基礎,如果沒有成功初始化,那么其他的藍牙功能都無法正常使用。
二、搜索周圍設備

初始化完成后,我們可以使用uni.startBluetoothDevicesDiscovery來開始搜索周圍的藍牙設備。通過uni.onBluetoothDeviceFound來監(jiān)聽尋找到新設備的,這樣一旦有新的設備被找到,我們就可以及時獲取并處理。
三、獲取藍牙適配器狀態(tài)及停止設備搜索
通過uni.getBluetoothAdapterState,我們可以獲取本機藍牙適配器的狀態(tài),以便了解藍牙是否開啟以及是否有設備與本機連接。當我們不再需要搜索設備時,可以調(diào)用uni.stopBluetoothDevicesDiscovery來停止設備的搜索。
四、建立藍牙連接與數(shù)據(jù)交互
搜索到需要連接的設備后,我們可以使用uni.createBLEConnection來初始化藍牙連接。由于藍牙連接有時效性,通常在2分鐘后會自動斷開,因此在需要打印數(shù)據(jù)時,我們會重新進行設備連接。這樣做的好處是,我們可以在其他頁面上也使用打印功能,并始終保持有效的連接。

五、效果圖及打印輸出結(jié)果
在完成藍牙連接和數(shù)據(jù)交互后,我們可以展示相關的效果圖,讓用戶直觀地看到藍牙設備的狀態(tài)和打印輸出的結(jié)果。這些結(jié)果不僅證明了我們的應用成功與藍牙設備進行了連接和數(shù)據(jù)交互,也幫助用戶更好地理解和使用我們的應用。
從藍牙模塊的初始化,到設備的搜索、連接和數(shù)據(jù)交互,每一步都需要我們精心設計和處理。只有這樣,我們才能確保應用的穩(wěn)定性和用戶體驗的滿意度。