歡迎訪問(wèn)我的博客 muhlenXi泊柬,該文章出自我的博客,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明來(lái)源: http://muhlenxi.com/2017/05/07/iOS-Bluetooth-Low-Energy-Develop-Chapter6*
導(dǎo)語(yǔ):
在這篇文章中宣肚,主要是將你的本地設(shè)備設(shè)置為一個(gè)廣播數(shù)據(jù)的 Peripheral 的最佳實(shí)踐,以及實(shí)際開發(fā)過(guò)程中應(yīng)該注意的事項(xiàng)悠栓。
正如許多 Central 端的處理一樣霉涨,CoreBluetooth 框架允許你控制 Peripheral 各方面的實(shí)現(xiàn)按价。這一篇將會(huì)給你提供一些準(zhǔn)則和以負(fù)責(zé)的方式給你提供一些使用的最佳實(shí)踐。
留意廣播的數(shù)據(jù)
廣播 Peripheral 的數(shù)據(jù)是實(shí)現(xiàn)設(shè)備本地設(shè)備為 Peripheral 的重要部分笙瑟。接下來(lái)的小節(jié)將會(huì)幫助你以一些合理的方式來(lái)廣播數(shù)據(jù)楼镐。
遵守廣播數(shù)據(jù)長(zhǎng)度的限制
廣播 Peripheral 的數(shù)據(jù)是通過(guò)調(diào)用 CBPeripheralManager
類的 startAdvertising:
方法時(shí)傳入廣播數(shù)據(jù)的字典來(lái)完成的。當(dāng)你創(chuàng)建一個(gè)廣播數(shù)據(jù)字典時(shí)往枷,需要注意你能廣播數(shù)據(jù)的內(nèi)容和長(zhǎng)度限制框产。
盡管通常的廣播數(shù)據(jù)包可以各種各樣 Peripheral 設(shè)備的信息。也許你僅僅想廣播設(shè)備的 Local Name
和你想要廣播的服務(wù)的 UUID错洁,也就是說(shuō)秉宿,當(dāng)你創(chuàng)建廣播數(shù)據(jù)字典的時(shí)候,你僅僅能夠指定以下兩種 Key:CBAdvertisementDataLocalNameKey
和 CBAdvertisementDataServiceUUIDsKey
,如果你指定其他的 Key墓臭,你將會(huì)收到錯(cuò)誤提醒蘸鲸。
對(duì)廣播數(shù)據(jù)的空間大小也有限制。當(dāng)你的 APP 在前臺(tái)運(yùn)行狀態(tài)時(shí)窿锉,你可以有 28 字節(jié)的空間用來(lái)初始化廣播數(shù)據(jù)字典酌摇,該字典包含兩個(gè)支持的 key。如果空間用盡嗡载,最為搜索響應(yīng)將會(huì)額外增加 10 個(gè)字節(jié)的空間僅僅用于 Local name窑多。任何服務(wù)的 UUID 不允許加入到這個(gè)專用的 “overflow” 空間。當(dāng)用戶設(shè)備顯示搜索的時(shí)候才可以發(fā)現(xiàn)這個(gè)專用空間的內(nèi)容洼滚。當(dāng)你的 APP 在后臺(tái)運(yùn)行狀態(tài)時(shí)埂息,則不會(huì)廣播 Local name,并且所有服務(wù)的 UUID 將會(huì)被放到這個(gè)特別空間里遥巴。
注意:這些空間不包含每個(gè)新數(shù)據(jù)類型的 2 個(gè)字節(jié)的頭部信息千康,廣播數(shù)據(jù)和響應(yīng)數(shù)據(jù)的正確格式在 Bluetooth 4。0 規(guī)范铲掐,第3卷拾弃,C部分,11章節(jié)有定義摆霉。
為了在使空間大小在這些約束之內(nèi)豪椿,僅允許廣播主要的 Service UUID。
僅僅廣播你需要的數(shù)據(jù)
因?yàn)閺V播數(shù)據(jù)需要用到設(shè)備的 Radio 携栋,會(huì)影響電池續(xù)航時(shí)間搭盾,因此當(dāng)你想要?jiǎng)e的設(shè)備連接你時(shí),再?gòu)V播數(shù)據(jù)婉支。連接后鸯隅,這些設(shè)備可以直接與 Peripheral 的數(shù)據(jù)進(jìn)行交互,不需要其他廣播數(shù)據(jù)包向挖。因此滋迈,想要促進(jìn) BLE 的處理霎奢,應(yīng)停止廣播來(lái)最小化 Radio 的使用,進(jìn)而增加 APP 的性能和保留設(shè)備的電量饼灿。通過(guò)調(diào)用 CBPeripheralManager
類的 stopAdvertising
方法即可。
[myPeripheralManager stopAdvertising];
讓用戶來(lái)決定什么時(shí)候來(lái)廣播
知道什么時(shí)候來(lái)廣播通常用戶比較清楚帝美。舉個(gè)例子碍彭,當(dāng)你知道附近沒有任何 BLE 設(shè)備時(shí),在你的設(shè)備上 用 APP 廣播服務(wù)是沒有意義的悼潭。因?yàn)槟愕?APP 經(jīng)常感知不到什么設(shè)備在附近庇忌,應(yīng)在 APP 中提供一個(gè) UI 界面來(lái)讓用戶選擇何時(shí)廣播。
配置你的 Characteristic
當(dāng)你創(chuàng)建一個(gè) mutable Characteristic舰褪,然后你設(shè)置它的屬性皆疹,值,權(quán)限等占拍。這些設(shè)定決定著 Central 如何連接和如何與 Characteristic 的值交互略就。雖然你可能基于你的 APP 的不同需要來(lái)配置 不同的Characteristic 屬性、值晃酒、權(quán)限表牢。當(dāng)你需要執(zhí)行以下的兩種任務(wù)時(shí),下面的小節(jié)將會(huì)提供一些指導(dǎo):
- 允許 Central 連接來(lái)訂閱 Characteristic
- 保護(hù) Characteristic 的敏感信息不被未配對(duì)的 Central 訪問(wèn)
配置你的 Characteristic 支持通知
在之前文章的描述中贝次,我們知道對(duì)于經(jīng)常改變值的 Characteristic崔兴,建議 Central 訂閱該 Characteristic。 只要可能蛔翅,應(yīng)允許連接的 Central 來(lái)訂閱你的 Characteristic 的值敲茄。
當(dāng)你創(chuàng)建一個(gè) mutable Characteristic 時(shí),通過(guò)設(shè)置 Characteristic 的 properties 屬性為 CBCharacteristicPropertyNotify
來(lái)支持訂閱山析。就像這樣:
myCharacteristic = [[CBMutableCharacteristic alloc]
initWithType:myCharacteristicUUID
properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify
value:nil permissions:CBAttributePermissionsReadable];
示例中堰燎,Characteristic 的值是可讀的,它可以被連接的 Central 訂閱盖腿。
需要一個(gè)配對(duì)的連接來(lái)訪問(wèn)敏感數(shù)據(jù)
根據(jù)使用情況爽待,你可能想要發(fā)布一個(gè)服務(wù),這個(gè)服務(wù)的一個(gè)或多個(gè) Characteristic 的值是敏感的翩腐。舉個(gè)例子鸟款,你可能想要發(fā)布一個(gè) 社交服務(wù)描述 服務(wù),這個(gè)服務(wù)可能包含一些代表用戶描述信息的 Characteristic茂卦,比如姓何什,名字,和 email 地址等等龙。很有可能处渣,你想要允許受信任的設(shè)備來(lái)獲取用戶的 email 地址伶贰。
你可以確保只有受信任的設(shè)備才能訪問(wèn)敏感 Characteristic 的值,你可以通過(guò)恰當(dāng)?shù)脑O(shè)置 Characteristic 的屬性和權(quán)限來(lái)達(dá)到目的罐栈。繼續(xù)上面提到的例子黍衙,只允許受信任的設(shè)備來(lái)獲得用戶的 email 地址,恰當(dāng)?shù)脑O(shè)置 Characteristic 的 properties 和 permissions荠诬,像這樣:
emailCharacteristic = [[CBMutableCharacteristic alloc]
initWithType:emailCharacteristicUUID
properties:CBCharacteristicPropertyRead
| CBCharacteristicPropertyNotifyEncryptionRequired
value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
示例代碼中琅翻,Characteristic 配置的只允許受信任的設(shè)備來(lái)讀和訂閱它的值。當(dāng)連接后柑贞,Remote Central 嘗試讀取或訂閱這個(gè) Characteristic 的值時(shí)方椎, CoreBluetooth 將嘗試將 Central 和本地設(shè)備配對(duì)來(lái)創(chuàng)建安全連接。
舉個(gè)例子钧嘶,如果 Central 和 Peripheral 都是 iOS 設(shè)備棠众,雙方都會(huì)彈出一個(gè)表示有設(shè)備想要配對(duì)的彈框。你需要將 Central 設(shè)備上彈框的配對(duì)碼填入到 Peripheral 設(shè)備上彈框的文本框里來(lái)完成配對(duì)處理有决。
完成配對(duì)后闸拿,Peripheral 會(huì)認(rèn)為該 Central 是個(gè)受信任的設(shè)備,并允許 Central 來(lái)訪問(wèn)它的加密Characteristic 的值疮薇。
參考文獻(xiàn)
1胸墙、Best Practices for Setting Up Your Local Device as a Peripheral
結(jié)束語(yǔ)
歡迎在本文下面留言一起交流心得...