真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ios藍(lán)牙開發(fā)源碼,ios藍(lán)牙開發(fā)源碼是什么

iOS 藍(lán)牙開發(fā)(一)

iOS 藍(lán)牙開發(fā)(二)

創(chuàng)新互聯(lián)主營桂陽網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,桂陽h5成都微信小程序搭建,桂陽網(wǎng)站營銷推廣歡迎桂陽等地區(qū)企業(yè)咨詢

iOS 藍(lán)牙開發(fā)(三)

iOS 藍(lán)牙開發(fā)(四)

在iOS中藍(lán)牙相關(guān)實現(xiàn)都是在CoreBluetooth這個framework中的,所以我們創(chuàng)建一個單例類中需要先導(dǎo)入 #import CoreBluetooth/CoreBluetooth.h ,再后即可使用這個單例類進(jìn)行管理我們藍(lán)牙的掃描、連接、狀態(tài)等實現(xiàn)。

當(dāng) central.state 為CBManagerStatePoweredOn即可開始掃描, 具體方法 [self.centralManager scanForPeripheralsWithServices:nil options:nil] 當(dāng)調(diào)用 scanForPeripheralsWithServices:options: 函數(shù)時就會實時調(diào)用其代理方法 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

peripheral 是外設(shè)類 advertisementData 是廣播的值,一般攜帶設(shè)備名, serviceUUID 等信息。 RSSI 絕對值越大,表示信號越差,設(shè)備離的越遠(yuǎn)。如果想裝換成百分比強度, (RSSI+100)/1001 (這是一個約數(shù),藍(lán)牙信號值并不一定是-100 - 0的值)

藍(lán)牙的連接是當(dāng)中心設(shè)備掃描到可用外設(shè)后, 利用函數(shù) [self.centralManager connectPeripheral:peripheral options:nil]; 進(jìn)行鏈接, 當(dāng)函數(shù)被調(diào)用后, 就會回調(diào)其對應(yīng)的代理函數(shù)。

本篇筆記主要是記錄如何初始化藍(lán)牙的 CBCentralManager 的中心管理類,并記錄如何實現(xiàn)掃描周邊外設(shè)、如何鏈接、獲取藍(lán)牙當(dāng)前狀態(tài)。

[img]

iOS開發(fā)之藍(lán)牙/Socket鏈接小票打印機(二)

上一篇 主要介紹了部分ESC/POS指令集,包括一些常用的排版指令,打印位圖指令等。另外,還介紹了將圖片轉(zhuǎn)換成點陣圖的方法。在這篇文章中,將主要介紹通過藍(lán)牙和Socket連接打印機,發(fā)送打印指令相關(guān)知識。這里將用到 CoreBluetooth.framework 和 CocoaAsyncSocket 。

藍(lán)牙是一種支持設(shè)備間短距離通訊的無線電技術(shù)。iOS系統(tǒng)中,有四個框架支持藍(lán)牙鏈接:

CoreBluetooth框架有兩個核心概念,central(中心)和 peripheral(外設(shè)),它們分別有自己對應(yīng)的API;這里顯然是手機作為central,藍(lán)牙打印機作為peripheral;

設(shè)置代理后,會回調(diào)此方法,確認(rèn)藍(lán)牙狀態(tài),當(dāng)狀態(tài)為 CBCentralManagerStatePoweredOn 才能去掃描設(shè)備,藍(lán)牙狀態(tài)變化時,也會回調(diào)此方法

調(diào)用此方法開始掃描外設(shè)

注意:第一個參數(shù)指定一個 CBUUID 對象數(shù)組,每個對象表示外圍設(shè)備正在通告的服務(wù)的通用唯一標(biāo)識符(UUID)。此時,僅返回公布這些服務(wù)的外設(shè)。當(dāng)參數(shù)為 nil ,則返回所有已發(fā)現(xiàn)的外設(shè),而不管其支持的服務(wù)是什么。

當(dāng)掃描到4.0外設(shè)后會回調(diào)此方法,這里包含設(shè)備的相關(guān)信息,如名稱、UUID、信號強度等;

調(diào)用此方法連接外設(shè)

[self.centralManager connectPeripheral:peripheral options:nil];

注意:第一個參數(shù)是要連接的外設(shè)。第二個參數(shù) options 是可選的 NSDictionary ,系統(tǒng)定義了一下三個鍵,它們的值都是NSNumber (Boolean);默認(rèn)為NO。當(dāng)設(shè)置為YES,則應(yīng)用進(jìn)入后臺或者被掛起后,系統(tǒng)會用Alert通知藍(lán)牙外設(shè)的狀態(tài)變化,效果是這樣

連接成功或失敗,都有對應(yīng)的回調(diào)方法

連接成功后設(shè)置代理 peripheral.delegate = self ,調(diào)用 [peripheral discoverServices:nil]; 尋找外設(shè)內(nèi)的服務(wù)。這里的參數(shù)是一個存放 CBUUID 對象的數(shù)組,用于發(fā)現(xiàn)特定的服務(wù)。當(dāng)傳nil時,表示發(fā)現(xiàn)外設(shè)內(nèi)所有的服務(wù)。發(fā)現(xiàn)服務(wù)后系統(tǒng)會回調(diào)下面的方法:

發(fā)現(xiàn)服務(wù)后,調(diào)用 [peripheral discoverCharacteristics:nil forService:service]; 去發(fā)現(xiàn)服務(wù)中包含的特征。和上面幾個方法一樣,第一個參數(shù)用于發(fā)現(xiàn)指定的特征。為nil時,表示發(fā)現(xiàn)服務(wù)的所有特征。

當(dāng)掃描到寫入特征時,保存,用于寫入數(shù)據(jù)。

寫入數(shù)據(jù),我們只需要調(diào)用方法

這里的 self.peripheral 就是連接的外設(shè), self.characteristicInfo 就是之前保存的寫入特征;這里最好使用 CBCharacteristicPropertyWrite 特征,并且 type 選擇 CBCharacteristicWriteWithResponse 。當(dāng)寫入數(shù)據(jù)成功后,系統(tǒng)會通過下面這個方法通知我們:

由于藍(lán)牙設(shè)備每次可寫入的數(shù)據(jù)量是有限制的,因此,我們需要將之前拼接的打印數(shù)據(jù)進(jìn)行拆分,分批發(fā)送給打印機

這里的 MAX_CHARACTERISTIC_VALUE_SIZE 是個宏定義,表示每次發(fā)送的數(shù)據(jù)長度,經(jīng)筆者測試,當(dāng) MAX_CHARACTERISTIC_VALUE_SIZE = 20 時,打印文字是正常速度。但打印圖片的速度非常慢, 應(yīng)該在硬件允許的范圍內(nèi),每次發(fā)盡量多的數(shù)據(jù)。 不同品牌型號的打印機,這個參數(shù)是不同的,筆者的藍(lán)牙打印機該值最多到140。超出后會出現(xiàn)無法打印問題。 最后筆者將該值定為 MAX_CHARACTERISTIC_VALUE_SIZE = 120 ,測試了公司幾臺打印機都沒有問題。

另外iOS9以后增加了方法 maximumWriteValueLengthForType: 可以獲取寫入特診的最大寫入數(shù)據(jù)量,但經(jīng)筆者測試,對于部分打印機(比如我們公司的)是不準(zhǔn)確的,因此,不要太依賴此方法,最好還是自己取一個合適的值。

注意:每個打印機都有一個緩沖區(qū),緩沖區(qū)的大小視品牌型號有所不同。打印機的打印速度有限,如果我們瞬間發(fā)送大量的數(shù)據(jù)給打印機,會造成打印機緩沖區(qū)滿。緩沖區(qū)滿后,如繼續(xù)寫入,可能會出現(xiàn)數(shù)據(jù)丟失,打印亂碼。

這里使用 CocoaAsyncSocket 開源框架,與打印機進(jìn)行 Socket 連接。 CocoaAsyncSocket 中主要包含兩個類:

這里我們只用到 GCDAsyncSocket ,因此只需要將 GCDAsyncSocket.h 和 GCDAsyncSocket.m 兩個文件導(dǎo)入項目。

注意:手機和打印機必須在同一局域網(wǎng)下,設(shè)置到打印機的host和port。

連接成功后會通過代理回調(diào)

Timeout為負(fù),表示不設(shè)置超時時間。這里的data就是 上一篇 中拼接的打印數(shù)據(jù)。

寫入完成后回調(diào)

斷開連接有以下幾種方法

連接斷開后回調(diào)

讀取到數(shù)據(jù)會回調(diào)

網(wǎng)口打印機一般都支持狀態(tài)查詢,查詢指令如下:

可以通過 上一篇 介紹指令拼接方法,查詢打印機的狀態(tài)。

本篇只是簡單介紹了,通過藍(lán)牙和Socket連接打印機的方法。雖然可以初步完成連接和打印,但是,在真正的項目中使用還是遠(yuǎn)遠(yuǎn)不夠的。這里還有很多情況需要考慮,比如連接斷開、打印機異常、打印機緩沖區(qū)滿、打印機缺紙等。我們可以針對自身的業(yè)務(wù)情況,進(jìn)行相應(yīng)的處理。

Core Bluetooth Programming Guide

Getting the pixel data from a CGImage object

Core Bluetooth Programming Guide

iOS藍(lán)牙開發(fā)相關(guān)知識點和注意事項

總結(jié)一下藍(lán)牙開發(fā)相關(guān)的知識點和注意事項,做個筆記,也希望你們能少踩坑

(公司部分藍(lán)牙項目為混編項目,藍(lán)牙相關(guān)處理均采用了Objective-C,故本文????均采用OC,Swift處理相同)

藍(lán)牙4.0包含兩個藍(lán)牙標(biāo)準(zhǔn),它是一個是 雙模 的標(biāo)準(zhǔn),它包含 傳統(tǒng)藍(lán)牙部分(也稱經(jīng)典藍(lán)牙) 和 低功耗藍(lán)牙部分(BLE) , 二者適用于不同的應(yīng)用場景和應(yīng)用條件。他們的特點如下

所以藍(lán)牙4.0是集成了傳統(tǒng)藍(lán)牙和低功耗藍(lán)牙兩個標(biāo)準(zhǔn)的,并不只是低功耗藍(lán)牙

藍(lán)牙4.0支持兩種部署方式: 雙模式 和 單模式 ,雙模同時支持經(jīng)典藍(lán)牙和低功耗藍(lán)牙,而單模則只支持其中一種。

二者更多細(xì)節(jié)詳見: 傳統(tǒng)藍(lán)牙和低功耗藍(lán)牙的區(qū)別

iOS中藍(lán)牙相關(guān)功能都封裝進(jìn)了 CoreBluetooth 類中,其中有幾個常見的參數(shù)和概念

具體API參考 CoreBluetooth藍(lán)牙開發(fā)

保存到數(shù)組中的設(shè)備可通過 UUID 來進(jìn)行區(qū)分。從 iOS7之后蘋果不提供外設(shè)的mac地址,外設(shè)的唯一標(biāo)識換成了由mac封裝加密后的UUID,需要注意的是不同的手機獲取同一個外設(shè)的UUID是不同的,所以在不同手機之間UUID不是唯一的,但在本機上可以作為唯一標(biāo)識(特殊情況手機刷機后也會改變UUID)。

如何獲取Mac地址

一般使用場景是根據(jù)Mac地址區(qū)分某個外設(shè)

注意點:

寫入數(shù)據(jù)時可能會遇到需要分包發(fā)送的情況,我們可以通過下面的API或許當(dāng)前特征支持的最大的單條寫入長度

maxLength 一般取決于藍(lán)牙模塊內(nèi)部接收 緩沖區(qū) 的大小,很多硬件設(shè)備這個緩沖區(qū)的大小是 20 字節(jié), 這個大小也和特征的寫入權(quán)限有關(guān),像具有寫入權(quán)限 withResponse 類的特征其大小一般為 512 字節(jié),當(dāng)然這些都是取決于設(shè)備測的設(shè)置;

當(dāng)我們單次發(fā)送的數(shù)據(jù)字節(jié)長度大于 maxLength 時,我們就需要采用分包的方式來發(fā)送數(shù)據(jù)了,

分包發(fā)送的邏輯類似于下面

這邊延時主要是設(shè)備側(cè)的接收模塊接收數(shù)據(jù)以及處理能力有限

外圍設(shè)備測和中心設(shè)備(大部分情況下是手機)保持藍(lán)牙連接的狀態(tài)下,如果長時間不產(chǎn)生交互,藍(lán)牙就會斷開,所以為了保持兩者持續(xù)的連接狀態(tài),需要做保活處理,也就是需要持續(xù)的發(fā)送心跳包(watchdog)。相應(yīng)的處理是使用一個定時器定時向設(shè)備側(cè)發(fā)送符合設(shè)備協(xié)議格式的心跳包。

斷開連接很簡單,只需要調(diào)用 [self.centralManager cancelPeripheralConnection:peripheral] 傳入需要斷開連接的設(shè)備對象就行了。斷開連接時會自動調(diào)用 centralManager:didDisconnectPeripheral:error: 代理方法。

按照之前的慣例,當(dāng)error為nil時表示斷開成功,error不為nil時斷開失敗。這種理解是錯誤的。

當(dāng)你調(diào)用 cancelPeripheralConnection: 方法(主動斷開)斷開連接時error為nil ; 沒有調(diào)用這個方法(異常斷開)而斷開時error返回的是異常斷開的原因。也可以理解為主動調(diào)用斷開連接方法一定會斷開

接下來就是斷開重連的問題了,對藍(lán)牙功能進(jìn)行封裝時肯定少不了斷開重連。首先斷開時可通過上面的代理方法的error是否為nil判斷是否是異常斷開,一般情況下異常斷開時是需要重連的

原因就是當(dāng)設(shè)備斷開連接后 peripheral.services 為nil了,當(dāng)然 service.characteristics 也是nil,所以需要在斷開連接時把保存這個設(shè)備對應(yīng)的服務(wù)和特征全部清除,然后在連接成功時重新過一遍發(fā)現(xiàn)服務(wù)和發(fā)現(xiàn)特征的流程就好了。

iOS7 開始,Apple加入了Beacon圍欄檢測的API, ( iBeacon-維基百科 ), 其工作方式是,配備有低功耗藍(lán)牙(BLE)通信功能的設(shè)備使用 BLE 技術(shù)向周圍發(fā)送自己特有的 ID,接收到該 ID 的應(yīng)用軟件會根據(jù)該 ID 采取一些行動。比如,在店鋪里設(shè)置 iBeacon 通信模塊的話,便可讓 iPhone 和 iPad 上運行一資訊告知服務(wù)器,或者由服務(wù)器向顧客發(fā)送折扣券及進(jìn)店積分, 或者公司的手機打卡,只要手機靠近打卡器一定范圍,手機測就向打開器發(fā)送打卡信息,從而自動打卡。這種場景還有很多。 其中一個最重要的功能就是App的喚醒功能(殺死后也能喚醒)

舉一個我們的例子,我們的產(chǎn)品業(yè)務(wù)場景就是在進(jìn)入車輛以后,需要使用藍(lán)牙連接我們的后裝車載設(shè)備以采集車輛信息和駕駛行為行程等,這里有一個問題就是在App被殺死的情況下如何喚醒App, 因為不可能要求用戶每次都主動去打開App,這樣體驗太差。我們的做法是通過iBeacon,當(dāng)我們的車輛點火以后,設(shè)備測通電,發(fā)出 iBeacon廣播 ,App實現(xiàn)監(jiān)聽iBeacon相關(guān)功能后就可以喚醒我們App,然后在相應(yīng)的回調(diào)的處理一些事情,比如通過藍(lán)牙連接設(shè)備。這里的前提條件是我們的硬件設(shè)備測包含iBeacon模塊,具有iBeacon功能,而且對iBeacon的廣播頻率也有一定的要求,長了可能喚醒的功能會不穩(wěn)定,官方建議的好像是100ms,頻率超高越耗電,但可以讓手機或其它監(jiān)聽設(shè)備越快地發(fā)現(xiàn)iBeacon。標(biāo)準(zhǔn)的BLE廣播距離是100m,這使Beacon在室內(nèi)位置跟蹤場景下的效果更理想。

關(guān)于iBeacon更多的使用及介紹請參考

蘋果核 - iOS端近場圍欄檢測(一) ——iBeacon

iBeacon技術(shù)初探

iOS藍(lán)牙實現(xiàn)匯總

一、相關(guān)介紹

CoreBluetooth專門用于與BLE設(shè)備通訊。并且現(xiàn)在很多藍(lán)牙設(shè)備都支持4.0,4.0以其低功耗著稱,所以一般也叫BLE(Bluetooth low energy),所以也是在iOS比較推薦的一種開發(fā)方法。

Central(中心設(shè)備);

Peripheral(外圍設(shè)備);

advertising(廣告);

Services(服務(wù));

Characteristic(特征)

CoreBluetooth介紹

在CoreBluetooth中有兩個主要的部分,Central和Peripheral,CBPeripheralManager 作為外圍設(shè)備。CBCentralManager作為中心設(shè)備。所有可用的iOS設(shè)備可以作為外圍(Peripheral)也可以作為中央(Central),但不可以同時既是周邊也是中央。

外圍設(shè)備(Peripheral)設(shè)備是廣播設(shè)備的數(shù)據(jù),中央設(shè)備(Central)是管理并且使用這些數(shù)據(jù)的設(shè)備。

也就是說外圍(Peripheral)向周圍發(fā)送廣播,告訴周圍的中央設(shè)備(Central)它(周邊(Peripheral)這里有數(shù)據(jù),并且說明了能提供的服務(wù)和特征值(連接之后才能獲取),

其實藍(lán)牙傳值相當(dāng)于網(wǎng)絡(luò)接口,硬件的service的UUID加上characteristic的UUID,

打一個比喻:service的UUID相當(dāng)于主地址,characteristic的UUID相當(dāng)于短鏈接,短鏈接必須是主地址的分支,拼在一起的是接口,你和硬件設(shè)定的藍(lán)牙傳輸格式類似于json,雙方可識別的數(shù)據(jù),因為藍(lán)牙只能支持16進(jìn)制,而且每次傳輸只能20個字節(jié),所以要把信息流轉(zhuǎn)成雙方可識別的16進(jìn)制。

|

二、中心設(shè)備CBCentralManager

CBCentralManager是管理中心設(shè)備的管理類,其中重要方法如下:

其中state是一個枚舉,有關(guān)藍(lán)牙是否可用的狀態(tài)如下:

下面這些方法用于初始化管理中心:

三、外設(shè)CBPeripheralManager

從上面我們知道,中心設(shè)備是用來掃描周圍的外設(shè),兩臺設(shè)備的通訊中,必須有一個充當(dāng)中心設(shè)備,一個充當(dāng)外設(shè),外設(shè)是由CBPeripheralManager進(jìn)行管理,主要方法如下:

四、中心設(shè)備與外設(shè)對象CBCentral與CBPeripheral

上面介紹了中心設(shè)備管理類與外設(shè)管理類,這些類用于將設(shè)備連接建立起來,器具的數(shù)據(jù)交換的服務(wù)和一些信息則是在對應(yīng)的設(shè)備對象中。

五、服務(wù)對象CBService

服務(wù)對象是用來管理外設(shè)提供的一些數(shù)據(jù)服務(wù)的,其中屬性如下:

六、服務(wù)的特征值CBCharacteristic

通過綁定服務(wù)中的特征值來進(jìn)行數(shù)據(jù)的讀寫操作,其中屬性如下:

七、讀寫請求對象CBATTRequest

服務(wù)對象是外設(shè)向中心設(shè)備提供的相關(guān)數(shù)據(jù)服務(wù),獲取到相應(yīng)服務(wù)后,中心設(shè)備可以進(jìn)行讀寫請求,讀寫對象屬性如下:

八、開發(fā)流程

1. 新建Central Manager實例并進(jìn)行監(jiān)聽藍(lán)牙設(shè)備狀態(tài)

2. 開始搜索外圍設(shè)備,通過delegate獲得數(shù)據(jù)

3. 連接外圍設(shè)備,delegate通知連接結(jié)果

4. 獲得外圍設(shè)備的服務(wù),delegate獲得結(jié)果

5. 獲得服務(wù)的特征,delegate獲得結(jié)果

6. 根據(jù)服務(wù)和特征給外圍設(shè)備發(fā)送數(shù)據(jù)

7. 根據(jù)delegate回調(diào),從外圍設(shè)備讀數(shù)據(jù)


網(wǎng)站標(biāo)題:ios藍(lán)牙開發(fā)源碼,ios藍(lán)牙開發(fā)源碼是什么
瀏覽地址:http://weahome.cn/article/dsopdpd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部