為物聯網不斷前行的藍牙Mesh
從本質上來講,藍牙Mesh技術并非無線通信技術,而是一種網絡(組網)的技術,用于構建“多對多通信連接”的網絡。
縱觀藍牙技術的發展旅程,SIG不斷地追求著無線連接的性能:傳輸速率(EDR-Enhanced Data Rate、AMP)、低功耗(Sniff Subrating、BLE)、網絡接入(6LoWPAN、Mesh)和安全配對(SSP),以滿足各種應用對近距離通信的需求。
原本,SIG主要是聚焦于“以人為中心的邊緣網絡”進行技術創新,而如今,藍牙適用的范圍已經逐漸拓展到所有物聯網邊緣場景:“藍牙增強速率技術(BR / EDR)”的應用從無線耳機發展到鼠標鍵盤;“藍牙低功耗技術”應用于手表、手環,發掘了可穿戴市場;而“藍牙Mesh組網技術”則瞄準了整個(邊緣域)物聯網市場,包括消費領域和工業領域。
從最新的組網構架(Mesh組網)中,讓我們逐漸地看清了藍牙技術聯盟對物聯網通信的預想,以及對邊緣網絡的理解。
一、為物聯網不斷前行的藍牙Mesh
為了開發和應用的方便,藍牙技術聯盟在藍牙Mesh中加入了“情景(Scene)”這一概念,可以將網絡中的一部分節點、元素、狀態、操作行為“捆綁”在一起,形成“物”的聯動機制,使得應用的內涵豐富多姿,且易于開發和理解。
通過攜帶特殊的16位情景序號,一個觸發節點可以通過發布一個消息,就實現一組節點設備改變各自運行狀態,形成物與物內在關聯的場景。開發人員可以利用豐富的情景預設,向用戶交付最佳的應用體驗。
在安全方面,藍牙技術聯盟從應用到網絡,設計、部署了多層次的防護措施。
- 在藍牙Mesh技術中,引入各類秘鑰:Netkey、AppKey、DevKey,以對應用、網絡、節點進行全面的認證。并且,網絡中的啟動配置設備(配網節點-Provisioner:負責其它所有節點入網的認證和密鑰分配)可以配置黑名單,并控制全網更改秘鑰(秘鑰刷新程序),將嫌疑節點踢出藍牙Mesh網絡;
- 通過NetKey派生的隱私Key,可以模糊化藍牙網絡PDU報頭,以防止定向的竊聽和追蹤;
- 通過在網絡PDU中引入序列號(Sequence Number)和IV索引(IV Index),避免“重放攻擊”,欺騙節點作出未授權的處理和響應。
縱觀藍牙Mesh技術,它轉變了傳統藍牙以“人”為中心的網絡特性(集中化網絡),而轉向“多點對多點”的網絡架構,以滿足“物”的連接需求為協議開發的宗旨。
在局部空間中,從應用到網絡連接,設計了一整套基礎網絡構建的規范和標準,簡化開發和運營的難度。它兼容低功耗藍牙技術,滿足電池驅動設備低頻低量的連接需求。
它采取強制執行的安全策略:入網必須認證、連接必須加密,以及具有秘鑰動態更新、關鍵字節等其它安全措施。其技術的開放性,為物聯網應用生態的構建提供了基礎。
從藍牙Mesh技術中也能看到,它并沒有關于互聯網連接、服務的設計。在實際應用開發中,該部分主要由應用的開發者自己來完成。此外,泛洪的信息傳播模式(“管理型網絡泛洪”),雖然采用了一些優化措施(TTL等),但對網絡的擴展擴容有較大影響,還需要進一步地設計優化方案。
在物聯網的邊緣,越來越多的網絡技術開始考慮“物”的連接需求,Mesh組網、多點對多點、低功耗連接、非對等網絡等理念,不斷嵌入到局部空間的網絡設計當中,邊緣網絡作為物聯網技術的先行者,將成為物聯網生態建立的基石和保證。
二、藍牙Mesh網絡架構
藍牙Mesh通過網狀網的組網結構,可以實現室內的大范圍網絡覆蓋。節點(Node)組成了藍牙Mesh的主干網絡,在Node之間使用了低功耗藍牙的技術進行對連,而具有不同能力特性的節點在網絡中承擔了不同的角色。
承擔網絡角色,需要節點之間遵守藍牙Mesh的語法(通信規則、數據格式)進行對話,通過協商組成網絡并向應用提供網絡路由服務。
節點間的網絡協商過程,是通過“消息攜帶組網信息”,從“源地址向目的地址傳遞”,并形成“網絡信息的交互”而構成的。
1. 網絡地址
藍牙Mesh網絡中,統一的地址長度為16位,分四種類型:單播地址(unicast address)、組播地址(group address)、虛擬地址(virtual address)、未分配地址(unassigned)。
(1)單播地址(Unicast Address)
單播地址在藍牙Mesh網絡中具有唯一性,可以標識出節點內的一個元素,節點在接入網絡的時候被分配獲得。一個mesh網絡可以有32767個單播地址。
(2)組播地址(group address)
組播地址即是多播地址,標識一個或多個元素。SIG預定義了四類組播:“All-proxies”, “All-friends”,“All-relays” 和 “All-nodes”。開發者也可以將多個元素自定義到一個多播地址,便于應用的統一控制和管理。
(3)虛擬地址(Virtual Address)
虛擬地址可以賦給一個或多個元素,且可以由多個節點共有。虛擬地址類似于標簽,可以在設備出廠前就配置,標簽可以使得節點容易在網絡被識別和應用。例如,可以表示某個廠商生產的某一個特定型號的攝像頭。
(4)未分配地址(unassigned)
16位全零的地址,表示元素還沒有配置地址。
2. 消息(Message)
藍牙mesh網絡通過消息承載數據信息進行通信。一個節點可以通過消息來詢問其它節點的狀態,也可以將自己狀態消息發送給別的節點。在藍牙mesh技術規范中,定義了很多種類型的消息。
在藍牙mesh網絡中,無論節點間相距多遠,所有節點均可以訂閱某一節點發布的狀態數據。
(1)消息的應用類型:
消息有兩種應用類型:控制消息(Control Message)和接入消息(Access Message)
- 控制消息(Control Message),是與藍牙mesh網絡操作有關的消息,例如Low Power Node和Friend Node之間的連接請求消息。
- 接入消息(Access Message),該類消息會攜帶節點中的模型和狀態值,用來實現節點之間對模型狀態的查詢和控制。應用層通過接入消息中的操作碼(opcode) 和參數,來識別并執行設備的相關操作。
接入消息有兩種交互類型:有應答(acknowledged)消息和無應答(unacknowledged)消息。
- 有應答消息:表示該消息需要“提問-應答”式的交互,消息發送方需要接收方的響應。響應消息攜帶相關的狀態信息,以向發送方表示某種操作執行成功,并反饋操作執行后的狀態值。如果沒有響應,發送方可以重復發送該消息。
- 無應答消息:發送方向接收方發送消息,但不需要回復。
(2)消息的操作類型
消息中包含三種消息的操作類型:GET、SET、STATUS。三種操作類型對應三種信息操作的方式:
- GET:發送節點使用GET消息,向一個或多個節點請求元素模塊中的狀態值。
- SET:發送節點使用SET消息,向一個或多個節點設置或改變某些狀態值。
- STATUS:該消息是應答消息,是對GET消息或SET消息的響應。STATUS消息中會攜帶當前的狀態值,返回給GET/SET消息的發送節點。
3. 節點模式
根據節點在實際應用中承擔的不同角色,將其分成三類模式:服務器模式(Server Model)、客戶端模式(Client Model)、控制模式(Control Model)。
(1)服務器模式(Server Model)
“服務器”,可以理解為“處理器”和“執行器”,其對兩部分內容進行了定義:
- 數據的定義:定義了元素模型中的狀態屬性(格式、類型)和相關消息。狀態屬性包括狀態(state)、狀態轉換(state transitions), 狀態綁定(state bindings)等等。
- 行為的定義:定義了各類實體操作(Behaviors),以及這些操作和狀態參數的對應關系。例如,當藍牙電燈就收到一個“開關狀態為‘On’”的消息時,它就給燈泡通電發光。
(2)客戶端模式(Client Model)
“客戶端”可以理解為“操作端”或“觸發器”,它沒有狀態信息,但定義了消息的格式和收發方式,用于獲取“服務器”提供的應用服務:發送信息、查詢狀態、控制開關、調節級別等等。“客戶端”就像是電視機的遙控機,由人來操作并切換電視頻道。
(3)控制模式(Control Model)
控制模式兼具了服務器模式和客戶端模式,并且還定義了各模式之間數據交互的處理邏輯(規則和行為),即稱為“控制器邏輯(Controller logic)”。
4. Publish/Subscribe 發布和訂閱
在實際應用中,節點發送應用消息的行為稱為“發布”。消息的發布方向是組地址或者虛擬地址。在應用設計中,組地址或者虛擬地址通常代表一個空間區域或同一類設備,易于用戶和應用系統統一辨識和使用。
“訂閱”就是某個節點被配置成可以接受某個特定消息。換一種說法,節點“訂閱”了某消息,就意味著它可以讀取該消息的內容。
生成消息的節點(客戶端)“發布”消息,使用消息的節點(服務器)“訂閱”消息。
發布和訂閱關系舉例:
在由電燈和開關組成的藍牙Mesh網絡應用中:
- 開關1可以發布消息到廚房組地址
- 電燈1號、2號、3號訂閱了廚房組地址的消息
- 開關2可以發布消息到客廳組地址
- 電燈3號訂閱了客廳組地址的消息
當開關1發布消息(其模型中攜帶“開燈”的狀態)至藍牙Mesh網絡時,因為存在訂閱關系,所以電燈1號、2號、3號接收到開關1的消息,會執行其中表達的指令---將燈(1號、2號、3號)點亮。
當開關2發布消息(其模型中攜帶“關燈”的狀態)至藍牙Mesh網絡時,因為存在訂閱關系,所以電燈3號接收到開關2的消息,會執行其中表達的指令---將燈熄滅。其他電燈(1、2)雖然也會收到2的消息,但因為它們訂閱的消息地址并不包括客廳組地址,所以2的消息會被丟棄。
消息的發布/訂閱模式的使用,結合組地址和虛擬地址的配置,可以方便地在藍牙網絡中移除或添加節點,其它在網節點無需做任何配置。
5. 節點間的連接類型
各類節點之間形成各種類型的聯接,主要有4種:
(1)非中繼連接:普通節點之間的連接,兩節點之間可以收發數據,但是節點在收到信息后不會轉發。
(2)親友連接(也翻譯為“友誼”連接):低功耗節點和親友節點間的連接,在建立親友關系后,低功耗節點會定期向親友節點發送消息,詢問是否有自己的消息。親友節點如果有暫存的低功耗節點的消息,它會將該消息送還給低功耗節點。
(3)中繼連接:包括普通節點與中繼、代理、親友節點的連接,中繼、代理、親友節點的相互連接。在該類鏈接上,會傳遞普通的藍牙Mesh廣播消息。
(4)GATT連接:沒有藍牙Mesh組網能力的藍牙設備(具備GATT接口),需要通過代理節點幫其轉換連接模式轉發信息,這些節點和代理節點之間的連接就是GATT連接。
6. 消息轉發處理的機制
在藍牙Mesh中,當一個節點收到一個消息時,它會根據自身的節點角色(模式),與相鄰節點間的連接狀態、以及收到消息中的網絡參數,來決定是否丟棄、緩存、處理,還是轉發該消息。
在消息中,影響轉發的參數主要有:NID(網絡ID,從網絡密鑰-NetKey 派生而來的唯一公共標識符)、TTL(Time To Live,消息轉發最大允許“跳躍-Hop”次數)、SRC(Source Address,源地址)和DST(Destination Address,目的地址)。
接受消息后,轉發節點(中繼、代理、親友節點)在轉發消息前有兩部分的處理工作:消息健康檢測、消息轉發判定。
(1)健康檢測:
在收到消息后,節點先判斷該消息的發送源是否是一個已注冊節點(以NID作為判定條件),再對消息的數據包做完整性效驗(MIC),并對數據包中的源地址、目的地址進行有效性判斷,最后確認是存在重復收包的情況,即檢查轉發緩存(轉發隊列)中是否已經有該數據包。如果以上步驟中有一項未通過,則該消息會被節點丟棄,如果通過了,則進入下一個轉發判定的環節。
(2)轉發判定:
如果消息中的目的地址是本節點,則消息會被傳遞到應用層,不再轉發。如果目的地址非本節點,則根據自己的節點角色和數據包中的TTL值來確定是否轉發。非轉發類節點會將數據丟棄,轉發類節點則會檢查TTL值是否大等于2,如果滿足條件則轉發,否則也將數據丟棄。
(3)以圖例進行舉例:
- 親友節點L、M分別和低功耗節點X、Y建立了親友連接關系
- P為中繼節點
- Q為非中繼節點D的代理節點,它本身也是中繼節點。
A. 低功耗節點X發消息至普通節點A
a) 低功耗節點X在入網時,和親友節點L建立了“友誼連接”。他在發送消息中將TTL標識設置為“3”,然后發給L,L則會對該消息進行廣播,廣播前將TTL設置為“2”。
b) 非中繼節點B和中繼節點P離L很近,它們都能收到L的消息。在收到消息后,B發現消息中的目的地址不是它,而它又不是中繼節點,故它會將該消息丟棄。
c) 中繼節點P收到L的消息后,先完成健康檢測(確認數據包信息無異常),再進行轉發判斷:發現目的地址不是它,并且TTL值等于2,于是它將TTL改成“1”后廣播了該消息。
d) 中繼節點Q在作轉發判斷時,發現該消息的TTL等于1,且該消息的目的地址并不是它,于是就將該消息丟棄。非中繼節點B收到P發來的消息,它會采取和步驟2一樣的處理方式將數據丟棄。
e) 非中繼節點A收到P轉來的消息,發現該消息的目的地址是它自己,于是消息在經過通過傳輸層、接入層的預處理后,被A送到其應用層(模型層)。
B. 非轉發節點(不支持藍牙Mesh)D發消息至低功耗節點Y
f) 無Mesh協議棧的藍牙節點D在入網時,和中繼節點S建立了“代理連接”,S作為D在Mesh網絡中的代理節點。他將消息中的TTL標識設置為“3”,并發送給S。
g) S作為中繼節點,將信息(TTL=2)廣播出去,節點M和P都收到了該信息。
h) 中繼節點P繼續廣播該消息(TTL=1),節點A、B、L收到后確認消息的目的地址不是自己,且TTL=1,則就將消息丟棄。
i) 親友節點M收到該消息,發現消息的目的地址是低功耗節點Y,于是將該消息放進緩存。當Y向M發送“輪詢(Poll)”消息,查問是否有它的消息時,M會將緩存的消息傳給Y。
【本文是51CTO專欄作者王峰的原創文章,轉載請聯系作者本人獲取授權】