Mesh消息的任何廣播數據都應是不可連接和不可掃描的無定向廣播事件。如果一個節點收到了一個可連接或者可掃描的廣播事件,這個消息應該被忽略。
一個只支持廣播載體的設備應該執行被動掃描,其工作週期應儘可能接近100%,以避免丟失任何傳入的Mesh消息。
所有設備應同時支持GAP觀察者角色和GAP廣播者角色。
Gatt承載層,包含一個GATT的客戶端與GATT的服務器,通過連接的方式進行消息的交互。
發送一個代理PDU,GATT承載層的client應該使用 Write without response去寫PDU數據。
接收一個代理PDU,GATT承載層的client會收到一些列的Notification。
收到中繼包時,是在網絡層判斷是都需要進行重傳發送。
網絡層定義了四個基本的地址類型:未分配地址、單播地址、虛擬地址、組地址。地址爲16bits(2 bytes)長度。
當disabble一個model的publish時,可以通過設置這個model的pusblish address爲0x00。
爲了減少不必要的安全檢查和過度的中繼,節點應該包含所有最近看到的網絡pdu的消息緩存。如果一個消息已經在消息緩存中了,消息應該被立即丟掉。
節點不需要緩存整個網絡PDU,並且可以只緩存一部分用於跟蹤,例如NetMIC、SRC/SEQ或其他值。但是,只要在設備功能的限制下實現了多次不處理相同網絡PDU的條件,就可以實現這個功能。
如果網絡緩存滿了,這時候還有新的消息進入,這時需要替換掉最老的一個緩存消息。
網絡消息緩存應該能夠存儲至少兩個網絡pdu,但是強烈建議網絡消息緩存的大小與預期的網絡密度相適應。傳入消息處理過程的細節留給設備開發者實現。
較低的傳輸層會進行分包和組包處理,會從較高的傳輸層拿數據進行分包發送,也會將收到的數據進行組包,然後傳遞給較高的傳輸層。
較低傳輸PDU的前八位的最重要的位是SEG字段,該字段用於確定較低傳輸PDU的格式是分段的還是未分段的消息。
根據網絡PDU中的CTL字段和較低傳輸PDU中的SEG字段的值,可以使用四種格式:
具體是數據格式可以查閱profile文檔的3.5.2章節。
爲了傳輸大於15個字節的較高傳輸層pdu,較低的傳輸層分段和重組這個pdu數據。使用塊確認方案將這些段交付給對等的較低傳輸層,以最小化需要由較低傳輸層傳輸的消息數量。
分段、重組的過程如下:
上層傳輸access PDU的每段長度爲12個字節,最後一段長度可以短一些。
上層傳輸control PDU的每段長度爲12個字節,最後一段長度可以短一些。
較高的傳輸層從access層獲取數據,並加上自己的傳輸層控制信息,負責將這些信息傳遞給對端設備的upper transport layer。
對於來自access層的消息,使用應用程序密鑰執行消息的加密和身份驗證。這允許上層傳輸層收到消息時,對接收到的消息進行身份驗證。
傳輸的控制消息上層傳輸層能自身產生,並且加密和授權只在網絡層。
Mesh Profile中3.6.5章節定義了低功耗節點和Friend節點之間數據交互的格式。
Friendship主要包含三個參數:
Access層定義了上層如何使用上層傳輸層,它定義了應用數據的格式,它定義和控制應用數據在上層應用層的加密和解密,並且判斷收到的應用數據是否來自正確的網絡。
數據格式:
數據格式:
創建一個mesh網絡,一個provisioner是必須的。Provisioner需要產生網絡祕鑰,提供IV Index(被設置爲0x00000000),並且申請一個單播地址。
Provisioner通過主動掃描和被動掃描來發現未配置的設備。發現設備後分爲兩步(1)Provisioner去provision這些設備,使其變成mesh網絡的一個節點。(2)Configuration Client然後config這些節點,提供給節點application key,並設置發佈和訂閱地址,這樣使節點之間能夠相互通信。
Device key是爲了多個Provisioner之間通信使用的。
Key的刷新包含三個過程: (1)第一個階段是分發新的key到每一個節點。這些節點會繼續使用舊的祕鑰發送數據,但是可以用新的和舊的祕鑰接收數據。 (2)第二階段包括傳輸一個安全的網絡beacon,該beacon向網絡發出信號,表明所有節點都擁有新密鑰。然後,節點將使用新key進行發送,但可以使用舊key和新key接收。 (3)第三階段涉及傳輸另一個安全網絡beacon,該beacon向網絡發出信號,所有節點都應該丟棄舊密鑰。節點將僅使用新祕鑰進行發送和接收。