RN用藍牙接入熱敏打印機和智能電子秤(轉載)

最近要爲app用藍牙接入便攜熱敏打印機和讀藍牙電子秤。做爲一名前端,能涉及到硬件的開發讓我以爲興奮不已,因此我馬上着手開始相應的預研。並把遇到的知識點和問題記錄下來。html

btw,大部分知識點未深刻可能有錯,歡迎指正。前端

需求簡單來講是:app內經過藍牙來打印和讀藍牙電子秤。java

拆解

從需求中能夠分爲三塊,藍牙通訊層 和 打印機協議 和 電子秤協議。react

藍牙

通訊

相似http,傳輸層而已,傳輸二進制內容,有讀有寫。 讀寫都會有buffer。android

RN庫

看了兩個庫 react-native-ble-manager react-native-bluetooth-serial,前者的api感受太繁瑣,看不懂,哭。 我用的是後者,but不要用其npm上的版本,用其最新的github代碼庫,由於接口比較多且穩定。git

react-native-bluetooth-serial是單例的,我須要連藍牙打印和藍牙電子秤,因此我須要兩個這樣的庫,fork下來改改就ok,不會太難。這是我改的react-native-gm-bluetoothgithub

react-native-bluetooth-serial有個方法list獲取設備列表,在Android上是獲取已經配對的設備(預先在系統界面上匹配好),在iOS上是以掃描的形式把列表返回。npm

有個listener能監聽數據的回調,不建議使用,由於回調可能很頻繁,容易致使應用奔潰。 推薦主動去讀。c#

btw建議你們多看下源碼加深理解。java代碼仍是比較容易懂的,而Object-C就難點。segmentfault

react-native-gm-bluetooth

基於業務上的須要,增長了些功能。

  • writeHexToDevice 把16進制轉成bytes寫進藍牙設備

  • writeTextToDevice 把文本轉成bytes寫進藍牙設備

和一些打印輔助Util

藍牙3.x、藍牙4.x、BLE?

瞭解很少,未深刻。

藍牙4.x是3.x的升級版,並增長了低功耗(BLE)。BLE支持的安全級別中有些是不須要匹配的。

Android/iOS

瞭解很少,未深刻。

Android是須要用mac id去鏈接設備。而iOS須要用uuids(多個,多是server uuid, read uuid, write uuid)

你會發如今系統界面,iOS搜不到藍牙設備,而Android能夠,還搜出來不少。我的感受是iOS指把有記錄(貌似須要在某網站申請註冊)的藍牙設備放出來,其餘的隱藏。 
然而經過api搜索仍是能找出來的。

其餘

自動鏈接。沒作,目前是經過人工介入連接,成功以後id保存起來,下次啓動嘗試鏈接。但沒有作設備離開了以後又回來等狀況的自動鏈接。

耗電。接入了兩個藍牙設備,都是高頻的工做,貌似耗電仍是挺大的,得一直充電。

熱敏打印機

熱敏打印機分兩種,小票和標籤。小票即商場購物買單的小票,標籤即包裝盒上的標籤。

小票用的是TSC指令集,標籤用的ESC指令集。文檔在這裏ESC TSC文檔

打印demo可參考這裏gmrnbt

TSC

通常流程:初始化(紙張寬度)-》初始化(還原)-》設置(對齊、字體大小等)-》 打印內容 -》打印 -》蜂鳴(提示打印完成)。

其中 1 初始化可能屢次調用,2 字體大小有幾種尺寸:倍高、倍寬、倍高寬 3 調打印命令後纔打印出來 4 文本可自動換行 5 能識別符號(\t \n 等)6 比較特別的打印樣式如表格則須要本身根據打印內容計算了

ESC

通常流程:初始化(標籤寬度、標籤間隔、起始位置、出紙方向等等) -》 初始化 -》 打印座標和內容 -》 打印 -》 蜂鳴。

其中 1 和TSC不同,ESC是按座標打印的,超出紙張部分不會打印 2 字體大小有 1 2 3規格,可分別設置高寬 3 一次打印命令一張標籤 4 可打二維碼一維碼等等 5 注重對打印內容的計算,以便打印在正確的位置

注意:因爲每一個設備不同,其實位置可能並不是是0,0。 好比我測試用的座標是30,32。 坑。

電子秤

電子秤就簡單多了,讀電子秤發過來的數據便可。 麻煩的地方是每一個稱的數據格式不同,須要寫邏輯去解。

花絮八卦

整個過程當中組內進行了不少討論和實踐:

打印機供應商有提供SDK,直接使用就好。
以前作Android的同事開發過一版Android的小票打印,用的佳博軟件提供的打印機,也是費了不少心思才找到他們提供SDK,但提供的api很奇怪,打印須要指定座標。(固然和咱們的認知窄有關) 
and 既然用了佳博的SDK,猜想會綁定了了佳博供應的打印設備,尚未iOS的,因而就放棄了SDK的方案。

打印就像畫圖,設個座標,調畫圖api畫。
另外一位同事開發過win(c#)的票據打印,是經過類畫圖形式調用。

打印的本質是否pdf,用電腦打印的時候均可以另存爲pdf的
從上面來方案來看都感受略不靠譜,是否麻煩了點!
繼續體驗了不少打印的功能,發如今打印的時候均可以把打印的內容存爲pdf,好比網頁打印,好比excel、doc、ppt均可以存爲pdf。
翻了下PDF的定義「便攜式文檔格式(英語:Portable Document Format,簡稱PDF)」。
同時也在github上找了個庫 react-native-print,它把html -> pdf。
此時略興奮,感受要接近真相了。
因而瘋狂的往pdf靠,然而並無更多的資料支撐pdf這個想法。

打印的本質是圖片。
同上,沒有進展。可能不使用在熱敏打印機上

就作android好了,iOS太封閉
應該沒啥好解釋的,確實不少廠商有可能不會對iOS作適配。 就拿iOS藍牙來講,就有不少人在抱怨搜不到設備。

外賣軟件能作到接入各類廠商,能Android,iOS哦。
是的,在jd搜索下熱敏打印機,發現能接入各類供應商和手機系統。

基於最後一點,咱們堅信也能夠作到。

。。。省略艱辛的查資料過程

直到和一位同行交流中瞭解到 TSC ESC 指令集,才忽然豁然開朗。

資源總結

github,找到相關的庫,一個一個拜讀。 必要時發issue聯繫做者交流。

找打印機供應商客服,他們能提供很專業的意見,有必要還能夠和他們的技術對接。

讀代碼,分析SDK,少不了。要向瞭解細節,心石放下就得讀代碼。 Java、Object-C不懂就問唄。

藍牙模塊應該會有官方的使用案例的,Android,iOS。

轉載自:https://segmentfault.com/a/1190000008981416

相關文章
相關標籤/搜索