上一篇 主要介紹了部分ESC/POS指令集,包括一些常用的排版指令,打印位圖指令等。另外,還介紹了將圖片轉換成點陣圖的方法。在這篇文章中,將主要介紹通過藍牙和Socket連接打印機,發(fā)送打印指令相關知識。這里將用到 CoreBluetooth.framework 和 CocoaAsyncSocket 。
公司主營業(yè)務:網(wǎng)站設計、網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出呼中免費做網(wǎng)站回饋大家。
藍牙是一種支持設備間短距離通訊的無線電技術。iOS系統(tǒng)中,有四個框架支持藍牙鏈接:
CoreBluetooth框架有兩個核心概念,central(中心)和 peripheral(外設),它們分別有自己對應的API;這里顯然是手機作為central,藍牙打印機作為peripheral;
設置代理后,會回調此方法,確認藍牙狀態(tài),當狀態(tài)為 CBCentralManagerStatePoweredOn 才能去掃描設備,藍牙狀態(tài)變化時,也會回調此方法
調用此方法開始掃描外設
注意:第一個參數(shù)指定一個 CBUUID 對象數(shù)組,每個對象表示外圍設備正在通告的服務的通用唯一標識符(UUID)。此時,僅返回公布這些服務的外設。當參數(shù)為 nil ,則返回所有已發(fā)現(xiàn)的外設,而不管其支持的服務是什么。
當掃描到4.0外設后會回調此方法,這里包含設備的相關信息,如名稱、UUID、信號強度等;
調用此方法連接外設
[self.centralManager connectPeripheral:peripheral options:nil];
注意:第一個參數(shù)是要連接的外設。第二個參數(shù) options 是可選的 NSDictionary ,系統(tǒng)定義了一下三個鍵,它們的值都是NSNumber (Boolean);默認為NO。當設置為YES,則應用進入后臺或者被掛起后,系統(tǒng)會用Alert通知藍牙外設的狀態(tài)變化,效果是這樣
連接成功或失敗,都有對應的回調方法
連接成功后設置代理 peripheral.delegate = self ,調用 [peripheral discoverServices:nil]; 尋找外設內(nèi)的服務。這里的參數(shù)是一個存放 CBUUID 對象的數(shù)組,用于發(fā)現(xiàn)特定的服務。當傳nil時,表示發(fā)現(xiàn)外設內(nèi)所有的服務。發(fā)現(xiàn)服務后系統(tǒng)會回調下面的方法:
發(fā)現(xiàn)服務后,調用 [peripheral discoverCharacteristics:nil forService:service]; 去發(fā)現(xiàn)服務中包含的特征。和上面幾個方法一樣,第一個參數(shù)用于發(fā)現(xiàn)指定的特征。為nil時,表示發(fā)現(xiàn)服務的所有特征。
當掃描到寫入特征時,保存,用于寫入數(shù)據(jù)。
寫入數(shù)據(jù),我們只需要調用方法
這里的 self.peripheral 就是連接的外設, self.characteristicInfo 就是之前保存的寫入特征;這里最好使用 CBCharacteristicPropertyWrite 特征,并且 type 選擇 CBCharacteristicWriteWithResponse 。當寫入數(shù)據(jù)成功后,系統(tǒng)會通過下面這個方法通知我們:
由于藍牙設備每次可寫入的數(shù)據(jù)量是有限制的,因此,我們需要將之前拼接的打印數(shù)據(jù)進行拆分,分批發(fā)送給打印機
這里的 MAX_CHARACTERISTIC_VALUE_SIZE 是個宏定義,表示每次發(fā)送的數(shù)據(jù)長度,經(jīng)筆者測試,當 MAX_CHARACTERISTIC_VALUE_SIZE = 20 時,打印文字是正常速度。但打印圖片的速度非常慢, 應該在硬件允許的范圍內(nèi),每次發(fā)盡量多的數(shù)據(jù)。 不同品牌型號的打印機,這個參數(shù)是不同的,筆者的藍牙打印機該值最多到140。超出后會出現(xiàn)無法打印問題。 最后筆者將該值定為 MAX_CHARACTERISTIC_VALUE_SIZE = 120 ,測試了公司幾臺打印機都沒有問題。
另外iOS9以后增加了方法 maximumWriteValueLengthForType: 可以獲取寫入特診的最大寫入數(shù)據(jù)量,但經(jīng)筆者測試,對于部分打印機(比如我們公司的)是不準確的,因此,不要太依賴此方法,最好還是自己取一個合適的值。
注意:每個打印機都有一個緩沖區(qū),緩沖區(qū)的大小視品牌型號有所不同。打印機的打印速度有限,如果我們瞬間發(fā)送大量的數(shù)據(jù)給打印機,會造成打印機緩沖區(qū)滿。緩沖區(qū)滿后,如繼續(xù)寫入,可能會出現(xiàn)數(shù)據(jù)丟失,打印亂碼。
這里使用 CocoaAsyncSocket 開源框架,與打印機進行 Socket 連接。 CocoaAsyncSocket 中主要包含兩個類:
這里我們只用到 GCDAsyncSocket ,因此只需要將 GCDAsyncSocket.h 和 GCDAsyncSocket.m 兩個文件導入項目。
注意:手機和打印機必須在同一局域網(wǎng)下,設置到打印機的host和port。
連接成功后會通過代理回調
Timeout為負,表示不設置超時時間。這里的data就是 上一篇 中拼接的打印數(shù)據(jù)。
寫入完成后回調
斷開連接有以下幾種方法
連接斷開后回調
讀取到數(shù)據(jù)會回調
網(wǎng)口打印機一般都支持狀態(tài)查詢,查詢指令如下:
可以通過 上一篇 介紹指令拼接方法,查詢打印機的狀態(tài)。
本篇只是簡單介紹了,通過藍牙和Socket連接打印機的方法。雖然可以初步完成連接和打印,但是,在真正的項目中使用還是遠遠不夠的。這里還有很多情況需要考慮,比如連接斷開、打印機異常、打印機緩沖區(qū)滿、打印機缺紙等。我們可以針對自身的業(yè)務情況,進行相應的處理。
Core Bluetooth Programming Guide
Getting the pixel data from a CGImage object
Core Bluetooth Programming Guide
以iPhone11,iOS13系統(tǒng)為例,蘋果手機找不到隔空打印機,有可能是不支持“隔空打印”功能或者是沒有開啟無線打印功能。還有可能是蘋果手機和打印機沒有連接至同一個Wi-Fi網(wǎng)絡環(huán)境,這樣就會導致不能找到隔空打印機。
一般不支持“隔空打印”功能的蘋果手機是不能找到隔空打印機的,而支持“隔空打印”功能,那么只要設備處于一個Wi-Fi網(wǎng)絡環(huán)境,這樣就可以找到隔空打印機。
蘋果手機隔空打印的方法如下:
1、首先開啟打印機的無線打印功能;
2、打開手機,在手機桌面上找到“照片”并點擊打開;
3、然后選擇一張要打印的照片并點擊它;
4、接著點擊這張照片左下方的分享圖標,找到打印并點擊它;
5、最后選擇想要的打印機并點擊打印就可以了。
該答案適用于蘋果大部分手機型號。
iOS 10連接打印機的方法如下:
首先運行相應的打印機程序,如下圖所示:
點開對應設備上的開關,如下圖所示:
然后輸入相應的管理員的賬號與密碼,并點擊“OK”如下圖所示:
接下來在下圖中添加或刪除需要使用的打印機,并點擊“OK”。如下圖所示:
接下來打開iOS系統(tǒng)中的“打印和傳真圖標”,并添加需要共享的打印機。如下圖所示:
同時按照下圖刪除不需要的打印機,如下圖所示:
然后添加所需打印機,如下圖所示:
檢查打印機是否添加成功,如果出現(xiàn)下圖則表示打印機添加成功。如下圖所示:
分享題目:ios開發(fā)打印機功能,ios網(wǎng)絡打印
網(wǎng)頁網(wǎng)址:http://m.rwnh.cn/article26/phjecg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供響應式網(wǎng)站、靜態(tài)網(wǎng)站、Google、云服務器、全網(wǎng)營銷推廣、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)