SIG 藍牙 mesh 組成
mesh網絡概述
藍牙mesh網絡是一種基於泛洪管理的mesh網絡,消息是通過廣播信道傳遞,收到消息的節點可以繼續轉發消息,這樣就可以實現更遠范圍的消息傳遞。為了防止出現消息不受限制的轉發傳遞,規定了以下兩種方法來避免:
- 節點不會轉發之前收到的消息,當收到新的消息時,會首先在緩存中檢查是否存在相同消息,若存在,則忽略新的消息。
- 每個消息都會包含一個TTL(Time to Live)的字段,這是用來限制消息中繼的次數,每次轉發消息后,TTL的值就會減1,當TTL的值到達1時,消息就不會再次被中繼。
網絡和子網
共享以下幾種網絡資源的節點組成一個mesh網絡:
- 用來identify消息源地址及目的地址的網絡地址
- Netwoek Key, 用來在網絡層加密
- Application Key, 用來在access layer加密
- IV index
IV Index 是一個32位的值,是一種共享網絡資源,比如一個mesh網中的所有節點都共享相同的IV Index值。
IV Index從
0x00000000
開始,在IV-Update-procedure過程中遞增,並由特定的進程維護,以保證整個mesh網內共享相同的IV。IV Index在網絡中通過Secure Network beacons 共享, 一個子網收到 IV-Update時,會處理並傳播該update。傳播是通過在子網中傳輸Secure Network beacons實現的。如果一個在主子網中的節點收到IV-update時,會將其傳播到其他所有的子網。
如果一個節點從網絡中消失一段時間,該節點會掃描Secure Network beacons ,或者是使用IV Index Recovery procedure來重新設置其IV-Index的值。
一個mesh網絡中可以存在一個或多個子網(比如一個賓館的所有節點構成一個mesh網絡,每個房間的節點都構成一個子網),子網中的節點有着同樣的Network Key,他們可以在網絡層相互通訊。一個節點可以屬於多個子網,即一個節點可以配置多個Network Key。在Provision階段,一個節點會被配到一個子網中,可以通過Configuration Model將節點陪孩子到多個子網中。
子網中有一類特殊的子網,被稱為主子網,主子網是基於主NetKey的。主子網中的節點參與IV更新操作,並將IV值傳遞給其他子網。與之相對的是,其他組網中 的設備只是向子網中傳播IV-Index。
包含Configureation Client Model的節點來配置網絡資源, 這類節點稱之為Configuration Client。通常情況下,Provisioner 負責在Provision階段給節點分配unicast address以保證不會有重復的地址。Configuration Client負責分配NetKey, AppKey以保證網絡中的節點可以在網絡層和access層通訊。
設備和節點 devices & nodes
加入mesh網絡的設備稱之為節點,未配網設備稱之為device。** Provisioner** 就是用來管理節點與未配網設備之間的消息傳輸。
未配網的設備不能收發mesh消息,但是它可以通過廣播消息告訴provisioner該設備的存在。provisioner可以將一個未配網設備接入網絡使之成為網絡節點。
網絡節點可以收發mesh消息,其是由Configuration Client來管理的(Configuration Client可以與Provisioner是同一個)。Configuration Client是配置節點之間如何傳遞消息。Configuration Client可以把節點從mesh網絡中移除,使之成為未配網設備。
入網
當設備被provisioner添加到網絡時,就成為網絡節點。設備的配網過程與傳統的藍牙點對點配對過程不同。設備配網過程是通過advertising bearer 或者point-to-point GATT-based bearer實現的。通過advertising bearer 配網的過程是被所有節點所支持的,而通過point-to-point GATT-based bearer配網允許智能手機這類設備成為配網者(provisioner)。
mesh中的幾個概念
mesh網絡結構使用以下幾個概念:states、messages、bindings、element、addressing、models、publish-subscribe、mesh keys、association。
States(狀態)
state是一個用來表示element狀態的一個值。
可以表現state的element稱之為server。比如,燈控中,燈節點一般為server,其開關狀態則是一個state, server根據收到的消息改變其狀態。
可以訪問state的element稱之為client。比如,燈控中的開關,可以通過發送開關消息給server,實現開關控制。
包含多個值得狀態稱之為復合狀態,比如燈的顏色會包含RGB等分量。
Bound states(關聯狀態)
當一個狀態關聯另一個狀態,其中一個改變,會導致另一個狀態改變,這種狀態就稱之為關聯狀態。關聯狀態可以存在於一個或多個element的不同models之間。在燈控中,較為常見的關聯狀態是電平狀態跟開關狀態的關聯,當電平變化到0時,會導致開關狀態也變為關。
Messages(消息)
消息會作用於狀態, 對於每個狀態(state)都會定義一系列消息,這些消息被server支持並且可以被client用來獲取並改變server的狀態。server也可以主動發送自身狀態的消息,比如狀態改變時。
消息包含操作碼、相關的參數以及行為。操作碼可以是1~3個字節,比如泰凌微的私有mesh就是用的三個字節(op[3])表示,其中op[0]為操作碼,op[1~2]表示廠商ID。一字節的操作碼用於某些特殊情況,比如需要將允許的參數個數設置為最大時;2個操作碼時標准的消息。
一條包含操作碼的消息的總長度是在下傳輸層決定的,這里可能會用的分段重組機制。為了最優化性能,我們應避免分段重組,最好將消息限制在一個分段長度以內。傳輸層允許最多11個字節的不分段消息,當使用一個字節操作碼時,參數個數最多允許10個。當操作碼為3個時,最多允許8個參數。
傳輸層的分段重組機制最多允許32個分段,因此消息的最大長度是384個字節。除去MIC檢驗的四個字節,一個操作碼的消息最多允許379個參數。
消息可以是需要回應的,也可以是無需回應的。
Element
element是節點中一個可尋址的實體,每個節點都至少有一個element,一個主element,多個附加element。element的數量和結構是固定的,在節點的生命周期中保持不變。
主element使用節點在配網時的唯一地址(unicast address)尋址,每個附加element都使用子序列地址尋址。這些element地址允許節點識別節點內的收發消息。
如果一個節點內,element的數量和結構發生了變化,比如在固件升級時,那么需要再次配網。
models中的消息是根據消息的操作碼和element地址來分發的。
一個element中不允許包含多個使用相同消息的model,當一個element中的多個model使用相同消息時,會造成過載。為了避免過載,一個節點內允許多個element存在,這樣具備相同消息的model放在不同element中就可以了。
比如,對於一個燈設備來說,可能存在兩個燈泡,每個都實現了亮度控制。這時就需要節點包含兩個element來分別表示兩個燈泡,當收到亮度命令時,節點會根據element的地址來決定哪個燈泡亮度應被修改。
Addresses 地址
有三種類型地址,唯一地址(unicast address)、虛擬地址、組地址。
唯一地址是在配網階段被分配給節點的主element,每個mesh網絡可以有32767個唯一地址。
虛擬地址可以代表多個element,每個虛擬地址表示一個標簽化的UUID。每個被發往UUID的消息都在完整檢驗值中包含可整個標簽UUID,以驗證消息。為了避免檢查每個已知的UUID,我們使用UUID的哈希值。共有16384個哈希值,每個都代表了一族虛擬地址。在虛擬地址中,只使用了16384個哈希值,因此每個哈希值都可以表示上百萬個UUID,因此虛擬地址的數量可以被認為很大。
組地址可以表示多個element,每個mesh網絡中共有16384個組地址。有一些固定的組地址用來訪問所有主element。共有256個固定組地址,16128個動態分配的組地址。
Models
Model定義了一個節點的基礎功能,一個節點可能包含多個Model。一個Model定義了其所需要的狀態、作用於狀態的消息、以及相關行為。
mesh應用使用了client-server結構,通訊使用“發布-訂閱”機制。鑒於mesh網絡的特點,以及配網的行為,應用不是簡單的“端到端”模式。應用是定義在client model、server model和control model之中。
-
Server model: 由一個或者多個element中的多個state組成。Server Model 定義了一族主消息,收發主消息時element的行為,還有收發消息之后的附加行為。
-
Client model:定義了一族消息,client可以用來請求、改變相關server的狀態。client沒有state.
-
Control model: 包含client功能用來與其他server通訊,也包含server功能用來與其他client通訊。一個control model可以包含控制邏輯,即與其他model相互作用時,該model的一些規則及表現。
一個簡單的設備可以包含server、client、control model。下圖表示了一個control model例子。
照明控制器是一個control model實現,照明控制器需要作為client來控制燈設備(或傳感器),也需要作為一個server被智能手機等設備控制。這樣一個照明控制器可以存在於傳感器中、燈設備中或者是一個獨立的設備中。
Models可以定義網絡節點的功能,比如秘鑰管理、地址分配、消息中繼燈。Models也定義了設備的表現,比如電源控制、照明控制、傳感器數據收集。有的節點只實現了中繼中能,比如代理節點。
一個消息可以應用於多個不同的models,消息的表現在每個model中都是相同的。
Model的特性是不可改變的,不能向一個model移除或者添加行為。如果一個新的行為必須要添加,則需要產生一個新的model。model支持擴展,新的model擴展原model時,會繼承原model的相關行為。
一個element所包含的的model決定了該element的表現。
Model可以被SIG定義(SIG Model)也可以被廠商(Vendor Model)定義,model被唯一的標識符所識別,可以是16bit(SIG Model)或者是32bi(Vendor Model)t的一個值。
下面的例子中,一個設備包含了兩個element,主element中包含了一個model,該model是擴展自附屬model的,在附屬model的基礎上添加了一個新的狀態。
由於State_X1與State_X2可以接收相同的消息,因此必須要放在兩個element中。
智能插座例子
如上圖所示,該設備由兩個插座組成,包含兩個element,分別代表兩個插座。每個element都分配一個唯一地址。
每個element的功能由Generic Power Level Server model定義,該model定義了一族狀態以及作用於狀態的消息。
Generic Power Level Set 消息被傳送到設備上用來控制電平,然后根據element的地址,來控制對應的插座。
插座也可以被實現了Generic Level Client model的設備控制,該model簡單的設置電平,插座的實際控制是通過狀態關聯實現的。在每個插座中,Generic Power Actual state ** 是與Generic Level state關聯的。Generic Level Client 向Generic Level Server 發送電平設置消息,然后Generic Level改變,與此同時Generic Power Actual state **也會改變,Power Actual state實際控制插座電源。
element可以報告狀態,在插座的例子中,每個插座都可以匯報電源狀態以統計耗電量。能耗是通過Sensor Server model定義的消息實現的,每個消息都有個element地址,這個地址唯一識別插座。