設(shè)置你的本地設(shè)備作為外設(shè)的最佳實(shí)踐
和許多中央端事務(wù)一樣坷檩,這個(gè)Core Bluetooth框架給你控制實(shí)現(xiàn)外設(shè)角色的大部分按价。這個(gè)章節(jié)提供了指導(dǎo)方針和最佳實(shí)踐,以一種負(fù)責(zé)任的方式利用這種控制的水平。
廣播的注意事項(xiàng)
廣播外設(shè)數(shù)據(jù)對(duì)于設(shè)置你的本地設(shè)備來(lái)實(shí)現(xiàn)外設(shè)角色是很重要的属韧。下面的部分有助于以一個(gè)恰當(dāng)?shù)姆绞阶鲞@些。
考慮廣播數(shù)據(jù)的限制
你廣播你的外設(shè)數(shù)據(jù)通過(guò)CBPeripheralManager
類的startAdvertising:
方法傳遞一個(gè)廣播數(shù)據(jù)的字典蛤吓,正如Advertising Your Services所描述宵喂。當(dāng)你創(chuàng)建了一個(gè)廣播字典,記住柱衔,你可以廣播時(shí)有什么限制以及限制多少樊破。
雖然在通常情況下廣播包可以攜帶關(guān)于外設(shè)的多種信息,你只能夠廣播你的設(shè)備本地名和你想要廣播的一些服務(wù)UUIDs唆铐。也就是說(shuō)哲戚,當(dāng)你創(chuàng)建你的廣播字典時(shí),你只能指定這兩個(gè)鍵:CBAdvertisementDataLocalNameKey
和CBAdvertisementDataServiceUUIDsKey
艾岂。如果你指定其它的鍵會(huì)接收到一個(gè)錯(cuò)誤顺少。
當(dāng)廣播數(shù)據(jù)時(shí)你使用的空間也是有限的。當(dāng)你的應(yīng)用程序處于前臺(tái),最多可以使用28個(gè)字節(jié)的空間在初始廣播數(shù)據(jù)中脆炎,為了提供給兩個(gè)支持的廣播數(shù)據(jù)鍵梅猿。如果這個(gè)空間用完了,有一個(gè)在掃描響應(yīng)時(shí)只能用于本地名稱的額外的10字節(jié)的空間秒裕,任何服務(wù)的UUIDs都不適用于分配到這個(gè)特殊的溢出區(qū)域袱蚓;它們只能被發(fā)現(xiàn)通過(guò)一個(gè)iOS設(shè)備明確地掃描它們。當(dāng)你的應(yīng)用程序處于后臺(tái)時(shí)几蜻,在這個(gè)溢出區(qū)域本地名稱不會(huì)被廣播喇潘,所有的服務(wù)UUIDs在這里。
注意:這些空間大小不包括任何新數(shù)據(jù)類型要求的頭部信息的兩個(gè)字節(jié)梭稚。廣播和回應(yīng)數(shù)據(jù)的準(zhǔn)確的格式在藍(lán)牙4.0規(guī)范中有定義颖低。
為了幫助你保持在這些空間約束內(nèi),限制你廣播給這些標(biāo)識(shí)你的主要服務(wù)的服務(wù)UUIDs弧烤。
只有在你需要的時(shí)候才廣播數(shù)據(jù)
自從廣播外設(shè)數(shù)據(jù)使用你的本地設(shè)備的無(wú)線(和你設(shè)備的電池),當(dāng)你想要其它的設(shè)備連接你的設(shè)備時(shí)才廣播忱屑。一旦連接上,這些設(shè)備可以直接探索并于外設(shè)數(shù)據(jù)交互暇昂,不需要其它的任何廣播包莺戒。因此,為了最小化無(wú)線的使用话浇,增加應(yīng)用程序的性能,保留你的設(shè)備的電量脏毯,當(dāng)它不再需要時(shí)停止廣播來(lái)促進(jìn)任何預(yù)期的藍(lán)牙低功耗事務(wù)。為了在你的本地外設(shè)上停止廣播幔崖,簡(jiǎn)單地調(diào)用CBPeripheralManager
類的stopAdvertising
方法食店,就像:
[myPeripheralManager stopAdvertising];
讓用戶決定什么時(shí)候廣播
知道什么時(shí)候可以廣播往往是用戶可以知道的東西。例如赏寇,當(dāng)你知道附近沒(méi)有任何其它的藍(lán)牙低功耗設(shè)備時(shí)在你的設(shè)備上廣播服務(wù)是沒(méi)有意義的吉嫩。你的應(yīng)用程序往往也沒(méi)有意識(shí)附近有什么其它的設(shè)備,在你的應(yīng)用程序上為用戶提供用戶交互界面來(lái)讓用戶決定什么時(shí)候去廣播嗅定。
配置你的特征
當(dāng)你創(chuàng)建一個(gè)可變的特征自娩,你要設(shè)置它的屬性,值渠退,和權(quán)限忙迁。這些設(shè)置決定著怎樣與訪問(wèn)和與特征值交互的中央連接。雖然你可能要決定配置你的特征的屬性和權(quán)限在你的應(yīng)用程序需求的基礎(chǔ)上碎乃。下面部分提供了一些指導(dǎo)方針在你需要執(zhí)行下面兩個(gè)任務(wù)時(shí):
- 允許連接的中央來(lái)訂閱你的特征
- 保護(hù)敏感的特征值被配對(duì)中央訪問(wèn)
配置你的特征來(lái)支持通知
正如在Subscribe to Characteristic Values That Change Often中描述,要求中央訂閱經(jīng)常改變的特征值(一個(gè)遠(yuǎn)程外設(shè)的服務(wù)的)姊扔。當(dāng)可能時(shí),通過(guò)允許連接外設(shè)來(lái)訂閱你的特征值來(lái)鼓勵(lì)這個(gè)實(shí)踐梅誓。
當(dāng)你創(chuàng)建了一個(gè)可變的特征恰梢,配置它來(lái)支持訂閱佛南,通過(guò)使用CBCharacteristicPropertyNotify
常量來(lái)設(shè)置特征屬性,就像:
myCharacteristic = [[CBMutableCharacteristic alloc] initWithType:myCharacteristicUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permission:CBAttributePermissionReadable];
在這個(gè)例子中嵌言,特征值是可讀的嗅回,并能夠通過(guò)連接的中央訂閱。
需要一個(gè)配對(duì)的連接來(lái)訪問(wèn)敏感數(shù)據(jù)
根據(jù)一些使用情況摧茴,你可能想要發(fā)送一個(gè)有一個(gè)或多個(gè)特征值需要很安全的服務(wù)绵载。例如,想象你想要發(fā)送一個(gè)社交媒體配置服務(wù)苛白。這個(gè)服務(wù)可能有特征值代表成員的個(gè)人信息尘分,比如姓,名丸氛,和郵件地址。很可能著摔,你想要允許只有信任的設(shè)備來(lái)獲取一個(gè)成員的郵件地址缓窜。
你可以通過(guò)設(shè)置恰當(dāng)?shù)奶卣鲗傩院蜋?quán)限來(lái)保證只有信任的設(shè)備能夠訪問(wèn)敏感的特征值。繼續(xù)這個(gè)例子谍咆,為了允許只有信任的設(shè)備獲取一個(gè)成員的郵件地址禾锤,設(shè)置特征的屬性和權(quán)限,就像:
emailCharacteristic = [[CBMutableCharacteristic alloc] initWithType:emailCharacteristicUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
在這個(gè)例子中摹察,特征被配置成允許只有信任的設(shè)備能夠讀和訂閱它的值恩掷。當(dāng)一個(gè)連接遠(yuǎn)程中央嘗試讀取或訂閱這個(gè)特征值時(shí),Core Bluetooth會(huì)嘗試配對(duì)你的本地外設(shè)與該中央來(lái)創(chuàng)建一個(gè)安全的連接供嚎。
例如黄娘,如果中央和外設(shè)都是iOS設(shè)備,兩個(gè)設(shè)備接收到一個(gè)提醒克滴,表明另一個(gè)設(shè)備想要配對(duì)逼争。中央設(shè)備的提醒包含一個(gè)密碼你必須填入外圍設(shè)備的文本框中來(lái)完成配對(duì)步驟。
在完成配對(duì)步驟后劝赔,外設(shè)會(huì)認(rèn)為該配對(duì)的中央是可信任的設(shè)備誓焦,并允許該中央訪問(wèn)它的加密的特征值。
--翻譯的文檔地址:Best Practices for Setting Up Your Local Device as a Peripheral