微信小程序連接藍牙打印機示例

小程序連接藍牙打印機打印文本與二維碼等示例在 github 上都能找到一些,唯獨打印圖片這個案例幾乎沒有。希望能幫助到有打印圖片需求的小伙伴。
測試打印機:凱盛諾 PTP-II-UBC 58mm 便攜熱敏打印機
測試環(huán)境有:Android微信 , IOS微信;其中 Android 和 IOS 在打印文本與二維碼速率相對一致,但 IOS 打印圖片幾乎慢到無法打印的情況(聽說藍牙打印機在 IOS 中受限制,需要與 IOS 合作授權,在斑馬品牌的一款打印機用 IOS 就能打印出來。即使是 Android ,小程序打印圖片比打印文本會慢許多,并不是打印機的問題,而是小程序只能使用低功率藍牙,受限在一次發(fā)送 20 個字節(jié)的數(shù)據(jù),需要分段遞歸發(fā)送,圖片數(shù)據(jù)可以達到幾萬、幾十萬個字節(jié)。)
打印機指令類型:ESC/POS 指令集 (打印機產家都會提供對應的指令文檔,此 demo 中使用十進制的數(shù)據(jù)格式的指令,十六進制的指令或者更多指令的使用方式可以參考另一個示例小程序藍牙打印 miniprogram-bluetoothprinter)
示例功能
連接藍牙打印機
打印文本 (打印中文出現(xiàn)亂碼,因為打印機默認的編碼是 GB2312,需要將 UTF-8 轉 GB2312,這里用的輕小的GBK 庫,也可以使用text-encoding)
打印二維碼(使用指令打印內置二維碼樣式,或者用圖片方式打印定制二維碼)
打印任意圖片(此示例的重點, canvas 繪制圖片,wx.canvasGetImageData()取得 Uint8ClampedArray后再轉成位圖數(shù)據(jù),使用圖片水平取模數(shù)據(jù)打印指令打印位圖數(shù)據(jù))
效果圖
? ?




Demo 中連接打印機的流程
關于找藍牙設備中能用的 Characteristic,這里貼出對應的代碼,關注注釋部分
圖片來源
在 Demo 中手機選任意一張圖片用 canvas 繪制,wx.canvasGetImageData()取得 Uint8ClampedArray 類型的圖像像素點數(shù)據(jù)。
位圖數(shù)據(jù)
需要把 Uint8ClampedArray 類型的數(shù)據(jù)轉成打印機識別的點陣位圖數(shù)據(jù)(也可以讓后臺實現(xiàn)圖片轉位圖數(shù)據(jù),參考熱敏打印機編程 ESC/POS 指令)。
不同打印機廠家的指令集可能不同,但打印圖片的位圖數(shù)據(jù)是一樣的。
貼出遞歸發(fā)送二進制數(shù)據(jù)到藍牙的代碼
貼出發(fā)送逐行圖片數(shù)據(jù)的代碼
主要參考
微信低功率藍牙
小程序藍牙打印 miniprogram-bluetoothprinter
熱敏打印機編程 ESC/POS 指令