藍牙mesh(二)

2 Mesh網絡補充介紹

2.1 承載層介紹

2.1.1 Advertising bearer

Mesh消息的任何廣播數據都應是不可連接和不可掃描的無定向廣播事件。如果一個節點收到了一個可連接或者可掃描的廣播事件,這個消息應該被忽略。

一個只支持廣播載體的設備應該執行被動掃描,其工作週期應儘可能接近100%,以避免丟失任何傳入的Mesh消息。
所有設備應同時支持GAP觀察者角色和GAP廣播者角色。

2.1.2 GATT bearer

Gatt承載層,包含一個GATT的客戶端與GATT的服務器,通過連接的方式進行消息的交互。
發送一個代理PDU,GATT承載層的client應該使用 Write without response去寫PDU數據。
接收一個代理PDU,GATT承載層的client會收到一些列的Notification。
收到中繼包時,是在網絡層判斷是都需要進行重傳發送。

2.2 Network Layer

2.2.1 設備地址

網絡層定義了四個基本的地址類型:未分配地址、單播地址、虛擬地址、組地址。地址爲16bits(2 bytes)長度。

在這裏插入圖片描述
當disabble一個model的publish時,可以通過設置這個model的pusblish address爲0x00。
在這裏插入圖片描述

2.2.2 Network PDU

在這裏插入圖片描述

2.2.3 Network Message Cache

爲了減少不必要的安全檢查和過度的中繼,節點應該包含所有最近看到的網絡pdu的消息緩存。如果一個消息已經在消息緩存中了,消息應該被立即丟掉。

節點不需要緩存整個網絡PDU,並且可以只緩存一部分用於跟蹤,例如NetMIC、SRC/SEQ或其他值。但是,只要在設備功能的限制下實現了多次不處理相同網絡PDU的條件,就可以實現這個功能。

如果網絡緩存滿了,這時候還有新的消息進入,這時需要替換掉最老的一個緩存消息。

網絡消息緩存應該能夠存儲至少兩個網絡pdu,但是強烈建議網絡消息緩存的大小與預期的網絡密度相適應。傳入消息處理過程的細節留給設備開發者實現。

2.3 Lower transport Layer

較低的傳輸層會進行分包和組包處理,會從較高的傳輸層拿數據進行分包發送,也會將收到的數據進行組包,然後傳遞給較高的傳輸層。

2.3.1 PDU數據格式

較低傳輸PDU的前八位的最重要的位是SEG字段,該字段用於確定較低傳輸PDU的格式是分段的還是未分段的消息。
根據網絡PDU中的CTL字段和較低傳輸PDU中的SEG字段的值,可以使用四種格式:
在這裏插入圖片描述
具體是數據格式可以查閱profile文檔的3.5.2章節。

2.3.2 分段和重組

爲了傳輸大於15個字節的較高傳輸層pdu,較低的傳輸層分段和重組這個pdu數據。使用塊確認方案將這些段交付給對等的較低傳輸層,以最小化需要由較低傳輸層傳輸的消息數量。
分段、重組的過程如下:
在這裏插入圖片描述
上層傳輸access PDU的每段長度爲12個字節,最後一段長度可以短一些。
上層傳輸control PDU的每段長度爲12個字節,最後一段長度可以短一些。

2.4 Upper transport Layer

較高的傳輸層從access層獲取數據,並加上自己的傳輸層控制信息,負責將這些信息傳遞給對端設備的upper transport layer。

對於來自access層的消息,使用應用程序密鑰執行消息的加密和身份驗證。這允許上層傳輸層收到消息時,對接收到的消息進行身份驗證。

傳輸的控制消息上層傳輸層能自身產生,並且加密和授權只在網絡層。

Mesh Profile中3.6.5章節定義了低功耗節點和Friend節點之間數據交互的格式。

2.4.1 friendship

Friendship主要包含三個參數:

  1. ReceiveDelay:這個時間是低功耗節點發送一個request信息查詢,到開始監聽的整個時間。
  2. ReceiveWindows:低功耗節點監聽一個response的時間,當低功耗節點從Friend node接收到消息後,它能夠停止監聽其它消息。
  3. PollTimeout:是低功耗節點連續發送request的間隔。
    在這裏插入圖片描述
    如果friend節點在收取分段消息時,只有在收到全部的分段後,纔會發送給低功耗節點。

2.5 Access layer

Access層定義了上層如何使用上層傳輸層,它定義了應用數據的格式,它定義和控制應用數據在上層應用層的加密和解密,並且判斷收到的應用數據是否來自正確的網絡。

2.6 Mesh beacons

2.6.1 未配置的設備beacon

數據格式:
在這裏插入圖片描述
在這裏插入圖片描述

2.6.2 Secure Network beacon

數據格式:
在這裏插入圖片描述

2.7 Mesh 網絡管理

2.7.1 Mesh網絡的創建過程

創建一個mesh網絡,一個provisioner是必須的。Provisioner需要產生網絡祕鑰,提供IV Index(被設置爲0x00000000),並且申請一個單播地址。

Provisioner通過主動掃描和被動掃描來發現未配置的設備。發現設備後分爲兩步(1)Provisioner去provision這些設備,使其變成mesh網絡的一個節點。(2)Configuration Client然後config這些節點,提供給節點application key,並設置發佈和訂閱地址,這樣使節點之間能夠相互通信。

Device key是爲了多個Provisioner之間通信使用的。

2.7.2 Key的刷新過程

Key的刷新包含三個過程: (1)第一個階段是分發新的key到每一個節點。這些節點會繼續使用舊的祕鑰發送數據,但是可以用新的和舊的祕鑰接收數據。 (2)第二階段包括傳輸一個安全的網絡beacon,該beacon向網絡發出信號,表明所有節點都擁有新密鑰。然後,節點將使用新key進行發送,但可以使用舊key和新key接收。 (3)第三階段涉及傳輸另一個安全網絡beacon,該beacon向網絡發出信號,所有節點都應該丟棄舊密鑰。節點將僅使用新祕鑰進行發送和接收。