banner
阿珏酱

阿珏酱

乘上与平常相反的电车,去看看那未曾见过的风景
twitter
github
facebook
bilibili
zhihu
steam_profiles
youtube

熱敏藍牙打印機開發

提示:當你看到這個提示的時候,說明當前的文章是由原emlog博客系統搬遷至此的,文章發布時間已過於久遠,編排和內容不一定完整,還請諒解`

熱敏藍牙打印機開發

日期:2019-11-5 阿珏 折騰代碼 瀏覽:2359 次 評論:14 條

最近在做小票打印這塊,項目需求是IOS和安卓兩種都要實現,開始做的時候也是一臉懵,然後網上找了不少資料,踩了一堆坑,看了好多文章,結果還好成了
藍牙打印機一般分為兩種打印模式,票據打印、標籤打印

公司買的渣渣打印機連開發文檔都沒有,害我走了不少坑,讓我開發買的時候也不咨詢咨詢我
目前微信小程序連接藍牙打印機 wx.createBLEConnection 測試在IOS設備上沒有問題,在部分安卓手機上會出現異常(表現為,連接是會彈出系統配對框,不管點取消還是輸入配對碼後點確定,都是會立馬斷開連接。如果不輸入也不取消則會在30秒以內自動斷開藍牙打印機)

現在采用的方式是各給安卓和IOS寫一套藍牙打印的命令
IOS



Android




就相對簡單方便,采用 Native.js 直接調用 Native Java 接口通道,通過 plus.android 調用安卓原生系統 API。


原生安卓文檔

https://developer.android.google.cn/reference/android/bluetooth/BluetoothAdapter?hl=en





打印指令


(更多打印指令參考 https://www.jianshu.com/p/dd6ca0054298)






關於二維碼的打印




通過上面的文章我們可以知道




我們需要讀取生成後的二維碼的像素點的 rgba,再將圖片數據先 4 合 1 判斷 0 還是 1 (0 代表打印 1 代表不打印),緊接著八合 1,因為一個字節有 8 位。最後使用打印機的位圖指令逐行掃描打印





4 合 1



本想着二維碼不是黑就是白,肯定不是 255 就是 0,其實還是會有一小部分是其他數值的,這個要注意哦,每 4 位是一個像素點的 rgba,然後黑白色的 rgb 就是 (0,0,0) 和 (255,255,255),所以每四位只把第一位黑白化,然後將每四位的第一位取出來作為新的數組,當 rule>200 的時候,值取 0,表示不打印,否則取 1,表示打印;





8 合 1



假如我們取出來的 8 位數是 [0,0,0,0,0,0,0,1],這個時候 8 合 1,我們需要進行進制轉換,從右往左是 2 的零次方,2 的一次方,等等,依次上加,實際是 0 * 27 + 0 * 26 + 0 * 25 + 0 * 24 + 0 * 23 + 0 * 22 + 0 * 21 + 1 * 20, 這個數就是我們要的最終數據的其中之一。




將數據轉換成 ArrayBuffer,其次打印必須要有指令!參考網址以及標準的 ESC-POS 指令集,下面代碼中的數字都是指令,另外,由於我這邊的打印機支持的是 gb2312 格式,所以在轉成 ArrayBuffer 的同時,還需要把編碼格式轉成正確的格式。




不過有一點我是要說下的,要注意 ios 和安卓的不同,安卓一次只能寫入不超過 20 字節(ios 具體不清楚,目測 120 字節),建議是直接截取數據 data.slice (20, byteLength),打印成功再次回調,循環打印。


1、toArrayBuffer , 是個組件,要安裝的,https://www.npmjs.com/package/to-array-buffer 或者你用這種寫法也可以 const buffer = new Uint8Array (Buffer.from (cmds, 'gb2312')).buffer;




2、注意查看自己的數據是否正確,畫圖的數據有問題的話,也可能打印出黑塊;




3、數據要算!!!要算!!要算!! ,比如我畫圖是 160*160 ,然後我打印數據拼接的指令 [29, 118, 48, 0, 20, 0, 160, 0] 這個裡面的 20 和 160 這個就是算的,參考上方文章看下原因,大概就是 1:8,然後畫圖和讀圖的數據一致






相關函數




(經過反復測試得出,打印紙一行最大字節數是 32 字節,這裡指的是普通的票據打印機)


打印三列或者兩列,是需要自己計算空格進行填充,沒有現成的指令噢


總寬度 - 左側文字長度 - 右側文字長度 就是空格的長度。




image


image



代碼大多是直接從項目中 copy 過來的,沒有整理過,並不能直接運行,僅供參考


不是我那一卷打印失敗的打印紙丟了,不然就讓你們看看什麼叫做 第一次做打印機開發的程序員

這次是真大幹貨,篇幅也很長,辛苦了我


網友評論:

image 深圳自考 7 個月前 (2020-10-08)
厲害了 簡直一模一樣 以後可以開一家不餓了麼公司了 [#aru_1]

image 一朵時光紅 1 年前 (2020-03-21)
騰雲奇襲技能釋放時,神明將跳到筋斗雲上,並留下了一個完美的分身

image 李魚兒啊 1 年前 (2019-12-27)
樓主,向打印機發送給 buffer 的地方的代碼可以詳細一點嘛?我目前卡在這一步 很迷惑 可以加我 QQ 2930962607

image 阿珏 1 年前 (2019-12-28)
@李魚兒啊:你得說清楚你的問題

image 李魚兒啊 1 年前 (2019-12-29)
@阿珏:我是 uniApp 的自定義組件模式開發 我是使用的 native.js 連接的 Android 手機的藍牙 頁面使用的是 web-view 的子窗口加載的本地 html 文件 因為需要使用 html2canvas.js 插件來截取頁面生成圖片 在插件的回調方法中可以獲取到 canvas 的 dom 對象 因此可以獲取到 imageData 的像素點信息 然後我使用你寫得 4 合 1 以及 8 合 1 生成數據 然後在發送到打印機的 write 方法時 我寫了 try catch 來捕獲發送時的異常 發現問題出現在生成的數據上面 有時候 catch 會報錯講試圖獲取一個 null Array 的長度 有時候會直接報錯一個空 {} json 對象 比較重要的點是 你在 buffer 數據的轉換上面使用到了 node.js 的 Buffer 對象 但是我這邊並不能使用 希望樓主可以幫忙解答一下 方便的話加一下 QQ 2930962607

image 阿珏 1 年前 (2019-12-30)
@李魚兒啊:很抱歉,關於這個 Android 打印圖片數據的問題,我這邊也沒有完全解決掉,沒辦法給你更好的解決方案。Android 打印這塊可以參考一下 GoogleAndroid 官方的文檔,發送數據處理這塊應該是有問題的。

image 『樂 易』 2 年前 (2019-11-16)
這,不是類似於喵喵機的嗎,正好我買個了喵喵機 P1 [#aru_1]

image 阿珏 2 年前 (2019-11-17)
@『樂 易』:這,貌似不是很一樣,而且那不是叫咕咕機嗎 [#aru_2]

image 『樂 易』 2 年前 (2019-11-17)
@阿珏:功能一樣,只不過喵喵機小一點而已,而且是喵喵機不是咕咕雞 [#aru_38]

image 阿珏 2 年前 (2019-11-18)
@『樂 易』:好吧好吧,原來還有一個叫喵喵機的玩意 [#aru_16]

image mengkun 2 年前 (2019-11-05)
很強!有餓了麼訂單條內味兒了 [#aru_53]

image 阿珏 2 年前 (2019-11-05)
@mengkun:我們是不餓了麼 [#aru_42]

image repostone 2 年前 (2019-11-05)
非技術的路過。

image 阿珏 2 年前 (2019-11-05)
@repostone:牛逼就完事了 [#aru_43]

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。