BLE模式和配置文件(原文)
本文檔探討了BLE如何工作棚赔,特別是如何將兩種BLE模式(連接和廣告)用于不同的目的焕济。
外圍設(shè)備和中央設(shè)備vs服務(wù)器和客戶端
當(dāng)我們通過(guò)BLE連接設(shè)備時(shí)绍弟,我們將它們視為外設(shè)(從設(shè)備)設(shè)備或中央(主設(shè)備)設(shè)備杏死。 藍(lán)牙標(biāo)準(zhǔn)建立了該區(qū)分方式以匹配設(shè)備上可用的資源:
- 主設(shè)備/中央
通常將具有更多的計(jì)算資源和可用能量 - 例如計(jì)算機(jī)或平板電腦厢岂。
- 從設(shè)備/外設(shè)
一個(gè)mbed設(shè)備 - 將在計(jì)算資源和能源兩個(gè)方面受限制。
目前楚堤,mbed的BLE_API支持創(chuàng)建外設(shè)疫蔓。 我們計(jì)劃盡快將其擴(kuò)展到中央設(shè)備。
BLE使用兩個(gè)附加術(shù)語(yǔ)來(lái)描述連接實(shí)體 - 服務(wù)器和客戶端:
- 服務(wù)器
該設(shè)備具有希望共享的信息身冬,且對(duì)于BLE而言通常是外設(shè)(如mbed板子)鳄袍。
- 客戶端
需要信息和服務(wù)的設(shè)備,且對(duì)于BLE而言通常是中央設(shè)備 - 例如電話吏恭。
在討論信息交流時(shí),我們使用術(shù)語(yǔ)服務(wù)器和客戶端 重罪。 我們使用中央和外設(shè)來(lái)表示BLE連接的起點(diǎn)和目標(biāo)樱哼。 中央作為客戶端連接哀九,外圍設(shè)備作為服務(wù)器并不罕見。

mbed板是服務(wù)器或外設(shè);手機(jī)是客戶端和中央設(shè)備“)
啟動(dòng)連接
中央啟動(dòng)搅幅,控制和結(jié)束連接 - 外設(shè)不能強(qiáng)制中央執(zhí)行(掃描BLE設(shè)備阅束,查看其信息,連接等)茄唐。 中央還決定詢問外圍設(shè)備的頻度息裸。 然而,外設(shè)可以向中央推薦一些東西沪编。 有關(guān)這些決定的更多信息呼盆,請(qǐng)參閱連接參數(shù)部分 。
廣告和連接模式
BLE使用的兩種模式是:
- 廣告模式
外設(shè)會(huì)發(fā)出該區(qū)域任何設(shè)備可以接收到的信息蚁廓。 這是中央設(shè)備如何知道周圍有外圍設(shè)備的方式访圃。
- 連接模式
外設(shè)和中央設(shè)備建立一對(duì)一的對(duì)話。 這就是他們?nèi)绾谓粨Q復(fù)雜的信息的方式相嵌。
中央設(shè)備必須知道外圍設(shè)備存在才能與之連接腿时。 因此,外設(shè)將使用BLE 廣告模式發(fā)布其存在饭宾。 在這種模式下批糟,設(shè)備使用通用訪問配置文件 (GAP)以穩(wěn)定的速率發(fā)送一些信息 —— 一個(gè)廣告。 這個(gè)廣告是其他設(shè)備看铆,像你的手機(jī)徽鼎,接收到的。 它告訴他們附近有一個(gè)BLE設(shè)備存在性湿,以及該設(shè)備是否愿意與他們交談纬傲。

廣告模式數(shù)據(jù)包大小非常有限宵荒。 GAP廣播的一般數(shù)據(jù)包格式如下圖所示:

每個(gè)BLE包可以包含最多47個(gè)字節(jié)(這不是很多)报咳,我們不能使用它們的全部:
為了自己的目的侠讯,BLE協(xié)議棧需要8個(gè)字節(jié)(1 + 4 + 3)。
因此暑刃,廣告分組數(shù)據(jù)單元(PDU)最多具有39個(gè)字節(jié)厢漩。 但是BLE棧再次需要一些開銷,占用8個(gè)字節(jié)(2 + 6)岩臣。
-
PDU的廣告數(shù)據(jù)字段剩下31個(gè)字節(jié)溜嗜,分為廣告數(shù)據(jù)(AD)結(jié)構(gòu)宵膨。 然后:
GAP廣播必須包含告訴設(shè)備有關(guān)我們發(fā)送的廣告類型的標(biāo)志。 標(biāo)志結(jié)構(gòu)總共使用三個(gè)部分(一個(gè)用于數(shù)據(jù)長(zhǎng)度炸宵,一個(gè)用于數(shù)據(jù)類型辟躏,一個(gè)用于數(shù)據(jù)本身)。 我們需要前兩個(gè)字節(jié)(數(shù)據(jù)長(zhǎng)度和類型指示)的原因是幫助解析器來(lái)使用我們的標(biāo)志信息正常工作土全。 我們還剩下28個(gè)字節(jié)捎琐。
現(xiàn)在我們終于用自己的數(shù)據(jù)結(jié)構(gòu)發(fā)送自己的數(shù)據(jù)了 - 但是它也需要一個(gè)長(zhǎng)度和類型的指示(總共兩個(gè)字節(jié)),所以我們只剩下26個(gè)字節(jié)裹匙。
所有這些意味著我們只有26B用于通過(guò)GAP發(fā)送的數(shù)據(jù)瑞凑。
如果您想查看AD的示例,請(qǐng)參閱自定義GAP廣告部分中的擴(kuò)展說(shuō)明幻件。
對(duì)于許多應(yīng)用拨黔,廣告可能是需要的一切。 這可能是:
- 外圍設(shè)備只想周期性地廣播可以適應(yīng)廣告的少量信息绰沥。
- 無(wú)論身份驗(yàn)證如何篱蝇,這些數(shù)據(jù)都可用于范圍內(nèi)的任何中央設(shè)備。
但是徽曲,有時(shí)候零截,您需要提供比單向數(shù)據(jù)傳輸更多的信息或更復(fù)雜的交互。 為此秃臣,您需要在BLE設(shè)備和用戶的手機(jī)涧衙,平板電腦或計(jì)算機(jī)之間設(shè)置“對(duì)話”。該會(huì)話基于連接模式 奥此,其描述了僅兩個(gè)設(shè)備之間的關(guān)系:BLE外圍設(shè)備和中央設(shè)備弧哎。
目前,廣告和連接模式還不能共存稚虎。 這是因?yàn)锽LE外圍設(shè)備一次只能連接到一個(gè)中央設(shè)備(如移動(dòng)電話)撤嫩。 連接建立的時(shí)刻,BLE外設(shè)將停止廣告蠢终。 在這一點(diǎn)上序攘,沒有其他中央設(shè)備能夠連接到它,因?yàn)槿绻粡V告寻拂,他們不能發(fā)現(xiàn)該設(shè)備在那里程奠。 只有在第一個(gè)連接終止并且BLE外圍設(shè)備再次開始廣告之后,才能建立新的連接祭钉。
注意:最新的藍(lán)牙標(biāo)準(zhǔn)允許廣告并行連接瞄沙,這將在2015年底之前成為mbed的BLE_API的一部分。
服務(wù)和配置文件(GATT)
為了使上述通信的功耗較低,BLE規(guī)范在連接模式下交換數(shù)據(jù)的方式施加了特定的結(jié)構(gòu)帕识。 它依賴于BLE外設(shè)維護(hù)客戶端可以訪問的狀態(tài)變量數(shù)據(jù)庫(kù)(如電池電量泛粹,溫度和時(shí)間)的能力。 我們可以根據(jù)功能將狀態(tài)變量分組到服務(wù)中肮疗。 例如,心率服務(wù)是狀態(tài)變量的集合扒接,包括心率測(cè)量和身體傳感器位置伪货。 這些狀態(tài)變量的技術(shù)術(shù)語(yǔ)是“特征(Characteristics)”。 為了互操作性钾怔,每個(gè)特征(Characteristics)也包含了值類型的描述碱呼。 這樣客戶端就可以解釋這個(gè)值,即使它們沒有被特別編程來(lái)識(shí)別它宗侦。

服務(wù)愚臀,特征及其配套屬性是連接方式的基本實(shí)體。 服務(wù)使用通用屬性配置文件(Generic Attribute Profile矾利,GATT)根據(jù)特征來(lái)組織信息姑裂。 我們將在下面更詳細(xì)地探索特征。
我們將服務(wù)捆綁到一個(gè)配置文件中 男旗。 例如舶斧,心率配置文件(Heart Rate Profile)包括兩個(gè)服務(wù) - 心率和設(shè)備信息(Heart Rate and Device Information),血壓配置文件(Blood Pressure Profile)包括血壓和設(shè)備信息(Blood Pressure and Device Information)服務(wù)察皇。

BLE已經(jīng)有一段時(shí)間了茴厉,所以它有一些標(biāo)準(zhǔn)的服務(wù),你可以進(jìn)入什荣。 回到我們的心率監(jiān)測(cè)器的例子矾缓,心率服務(wù)是完善的,易于使用稻爬。 它可以從BLE心率監(jiān)測(cè)器讀取信息并將其發(fā)送到應(yīng)用程序嗜闻。 你會(huì)在稍后的編碼示例中看到。
在開始研究項(xiàng)目之前因篇,值得看看是否已經(jīng)有可以完成所需功能的服務(wù)了; 它會(huì)節(jié)省大量的編碼和測(cè)試時(shí)間泞辐。 您可以在這里找到可用的配置文件和服務(wù)列表。
特征和相互作用
服務(wù)將數(shù)據(jù)分解為特征 竞滓。 每個(gè)特征映射到單個(gè)數(shù)據(jù)點(diǎn):它告訴你一件事咐吼,只有一件事。 例如商佑, 設(shè)備信息服務(wù)具有以下特征:

- 制造商名稱
- 型號(hào)
- 序列號(hào)
- 硬件版本
- 固件版本
- 軟件版本
- 系統(tǒng)ID
- IEEE 11073-20601監(jiān)管認(rèn)證資料清單(regulatory certification data list)
這些特征中的每一個(gè)應(yīng)該只包含其標(biāo)簽所包含的信息锯茄。 他們一起揭示設(shè)備的制造商信息,并組成一個(gè)完整的設(shè)備信息服務(wù)。 此服務(wù)本身捆綁在不同的配置文件中肌幽。
在mbed上創(chuàng)建一個(gè)特征非常簡(jiǎn)單晚碾,因?yàn)锽LE_API為涉及服務(wù)定義的實(shí)體提供C++抽象。 例如喂急,這里我們創(chuàng)建一個(gè)簡(jiǎn)單的特征格嘁,通知客戶一個(gè)按鈕的狀態(tài)(按下/釋放):
//button initial state
bool buttonPressed = false;
//read-only characteristic of type boolean,
//accepting the buttonState’s UUID and initial value
ReadOnlyGattCharacteristic<bool> buttonState(BUTTON_STATE_CHARACTERISTIC_UUID,
&buttonPressed);
有關(guān)mbed的特征創(chuàng)建的完整展示,請(qǐng)參閱我們的輸入服務(wù)模板 廊移。
特征完全由其聲明糕簿,值和描述符定義:
聲明包含有關(guān)特征的數(shù)據(jù),例如其通用唯一標(biāo)識(shí)符(UUID)狡孔。
值是特征的“有趣”部分:它是包含您正在查看和響應(yīng)的數(shù)據(jù)的值懂诗。
** 描述符**不是強(qiáng)制性的; 您可以使用它來(lái)提供有關(guān)特征的更多信息或控制其行為。 例如苗膝,在使用通知時(shí)使用描述符殃恒。
特征可以是靜態(tài)的(如設(shè)備的制造商名稱)或動(dòng)態(tài)的。 如果一個(gè)特征是動(dòng)態(tài)的辱揭,當(dāng)設(shè)備有新的信息時(shí)离唐,您的設(shè)備可以為它生成一個(gè)新的值。 例如界阁,在心率服務(wù)中侯繁, 當(dāng)前心率是定期獲得新值的特征。
以下是創(chuàng)建讀/寫特征(可以接收新值并顯示其當(dāng)前值的特征)的示例:
bool initialValueForLEDCharacteristic = false;
ReadWriteGattCharacteristic<bool> ledState(LED_STATE_CHARACTERISTIC_UUID,
&initialValueForLEDCharacteristic);
有關(guān)在mbed上創(chuàng)建讀/寫特征的信息泡躯,請(qǐng)參閱我們的執(zhí)行器服務(wù)模板 贮竟。
一些特征是雙向?qū)嶓w。 這意味著服務(wù)器(BLE外設(shè))可以自己更新较剃,也可以從客戶端(手機(jī))接收新的值咕别。 這種雙向流量使BLE具有交互性:用戶向一個(gè)或多個(gè)特征發(fā)送新值,并且設(shè)備響應(yīng)這些新值写穴。 例如惰拱,當(dāng)UriBeacon設(shè)備打開時(shí),它進(jìn)入臨時(shí)配置模式(configuration mode) 啊送,讓我們有機(jī)會(huì)更新其特征的值(包含稍后公布的數(shù)據(jù))偿短。
對(duì)于每個(gè)特征,服務(wù)定義說(shuō)明客戶端是否有權(quán)寫入該特征馋没。 這是在外設(shè)上設(shè)置GATT服務(wù)器時(shí)完成的昔逗。 在我們的示例中, 配置模式(configuration mode)指出廣告信息是可讀/寫的篷朵, 廣告模式表示它是只讀的勾怒。 因此婆排,根據(jù)設(shè)備的模式,相同的特征可以具有兩種不同的權(quán)限笔链。
UUID
每個(gè)服務(wù)和特征都需要一個(gè)普遍唯一的標(biāo)識(shí)符(UUID)段只,它們?cè)诼暶髦辛谐觯ㄈ缟纤觯?對(duì)于BLE官方實(shí)體,UUID為16位鉴扫,BLE站點(diǎn)上提供了完整的列表赞枕,以獲取服務(wù)和特性 。 對(duì)于您自己創(chuàng)建的服務(wù)和特征坪创,您將需要128位UUID; 您可以在UTI網(wǎng)站上生成鹦赎。
有關(guān)UUID分配的更多信息,請(qǐng)參見我們的服務(wù)創(chuàng)建示例 误堡。
配置文件,服務(wù)和特征的總結(jié)
因此雏吭,配置文件的完整拆分是:一個(gè)或多個(gè)服務(wù)锁施,每個(gè)服務(wù)包含零個(gè)或多個(gè)特征,每個(gè)特征具有零個(gè)或多個(gè)描述符:
