最近要爲app用藍牙接入便攜熱敏打印機和讀藍牙電子秤。做爲一名前端,能涉及到硬件的開發讓我以爲興奮不已,因此我馬上着手開始相應的預研。並把遇到的知識點和問題記錄下來。html
btw,大部分知識點未深刻可能有錯,歡迎指正。前端
需求簡單來講是:app內經過藍牙來打印和讀藍牙電子秤。java
從需求中能夠分爲三塊,藍牙通訊層 和 打印機協議 和 電子秤協議。react
相似http,傳輸層而已,傳輸二進制內容,有讀有寫。 讀寫都會有buffer。android
看了兩個庫 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
基於業務上的須要,增長了些功能。
writeHexToDevice 把16進制轉成bytes寫進藍牙設備
writeTextToDevice 把文本轉成bytes寫進藍牙設備
和一些打印輔助Util
瞭解很少,未深刻。
藍牙4.x是3.x的升級版,並增長了低功耗(BLE)。BLE支持的安全級別中有些是不須要匹配的。
瞭解很少,未深刻。
Android是須要用mac id去鏈接設備。而iOS須要用uuids(多個,多是server uuid, read uuid, write uuid)
你會發如今系統界面,iOS搜不到藍牙設備,而Android能夠,還搜出來不少。我的感受是iOS指把有記錄(貌似須要在某網站申請註冊)的藍牙設備放出來,其餘的隱藏。
然而經過api搜索仍是能找出來的。
自動鏈接。沒作,目前是經過人工介入連接,成功以後id保存起來,下次啓動嘗試鏈接。但沒有作設備離開了以後又回來等狀況的自動鏈接。
耗電。接入了兩個藍牙設備,都是高頻的工做,貌似耗電仍是挺大的,得一直充電。
熱敏打印機分兩種,小票和標籤。小票即商場購物買單的小票,標籤即包裝盒上的標籤。
小票用的是TSC指令集,標籤用的ESC指令集。文檔在這裏ESC TSC文檔
打印demo可參考這裏gmrnbt
通常流程:初始化(紙張寬度)-》初始化(還原)-》設置(對齊、字體大小等)-》 打印內容 -》打印 -》蜂鳴(提示打印完成)。
其中 1 初始化可能屢次調用,2 字體大小有幾種尺寸:倍高、倍寬、倍高寬 3 調打印命令後纔打印出來 4 文本可自動換行 5 能識別符號(\t \n 等)6 比較特別的打印樣式如表格則須要本身根據打印內容計算了
通常流程:初始化(標籤寬度、標籤間隔、起始位置、出紙方向等等) -》 初始化 -》 打印座標和內容 -》 打印 -》 蜂鳴。
其中 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