網絡層定義了四種地址類型,地址長度為16位。
如下圖所示:
單播地址範圍從0x0001到0x7FFF,可以有32767個單播地址。
虛擬地址的範圍從0x8000到0xBFFF,可以有16384個虛擬地址。
多播地址範圍從0xC000到0xFFFF,可以有16384個多播地址。多播地址包括256個固定多播地址和16128個可動態分配的多播地址。
藍牙mesh沒有並發限制或對節點的限制。
當與低功率藍牙傳輸壹起使用時,本規範中沒有拓撲限制或約束。
這是什麽意思?可以分配多少單播地址,就可以分配多少設備。虛擬地址、組播地址和單播地址可以共存,因此只能通過單播地址來計算設備數量。例如,壹臺設備可以同時屬於組1和組2,並且該設備也有單播地址。壹次使用三個地址,但只有壹個設備。因此壹個網絡中可以有32,767個有效地址。
未分配地址的意義在於,您可以通過將模型的發布地址設置為未分配地址來禁用模型的消息發布。然後有壹個問題。當網絡層發現未分配地址的消息時會怎麽做?未分配地址的消息是在網絡層還是在承載層被攔截?meshNetworkManager。
單播地址可用於消息的源地址字段或目的地址字段。發送到單播地址的消息最多只能由壹個元素處理。在網絡分配階段,網絡分配器將在其生命周期內為網絡節點的每個元素分配單播地址。該地址可以由網絡分配器重新分配以允許重用。
虛擬地址代表壹組目的地址。每個虛擬地址在邏輯上代表壹個標簽UUID,其值為128位,不需要集中管理。壹個或多個元素可以被配置為發布或訂閱相同的標簽UUID。標簽UUID將不被發送,並且應該被用作上部消息層中的消息完整性校驗值的附加數據字段。虛擬地址涉及哈希值的計算。(這裏不用對虛擬地址做太多研究,後面就清楚了。)
0xFF00至0xFFFF的組播地址保留用於固定目的,0xC000至0xFEFF的組播地址可用於其他目的。多播地址只能在消息的目標地址中使用。發送到多播地址的消息將被訂閱該多播地址的所有模型實體接收。
這句話是否正確,那麽任何BLE設備都可以加入網狀網絡?如何解讀?
網絡層支持通過多個載體發送和接收消息。壹個運營商可能有多個實例。承載的每個實例可以通過網絡接口連接到網絡層。例如,壹個節點可能有三個載波:壹個廣播載波和兩個GATT載波的接口。
如果壹個網絡中有兩個分銷商會發生什麽?壹鍵分銷網絡和多網分銷商是兩個概念。
接口輸入過濾器確定傳入的網絡消息是被傳送到網絡層進行進壹步處理還是被刪除。
接口輸出過濾器決定是將消息傳遞到承載層還是將其刪除。接口輸出過濾器刪除TTL值為1的所有消息。
本地網絡接口允許在同壹節點內的元素之間發送消息。每個節點都應該實現壹個本地網絡接口。通過本地網絡接口接收消息後,所有消息都應發送到節點的所有元件進行處理。
廣播承載的網絡接口,允許廣播承載用於發送消息。APP端不做調研。
中繼功能用於中繼節點或轉發節點通過廣播承載接收的網絡PDU。此功能是可選的,如果支持它,可以單獨啟用和禁用它。如果支持代理功能,則必須支持GATT承載和廣播承載。
代理功能是指節點在GATT承載網和廣播承載網之間中繼或轉發網絡層PDU,實現GATT承載網和廣播承載網之間的消息互通。此功能是可選的,如果支持它,可以單獨啟用和禁用它。如果支持代理功能,則GATT和廣播承載都受支持。
從承載層接收到消息後,節點檢查NID字段值是否與壹個或多個已知的NIDs匹配。如果NID字段的值與已知的NID不匹配,該消息將被忽略。如果NID字段的值與已知的NID匹配,節點將根據每個已知的匹配網絡密鑰來驗證消息。如果該消息沒有驗證任何已知的網絡密鑰,則該消息將被忽略。如果消息確實根據網絡密鑰進行了身份驗證,SRC和DST字段被視為有效,並且消息不在網絡消息緩存中,則消息將由較低的傳輸層處理。
當消息被重新傳輸時,其定義如下。重傳中使用的IV索引應該與接收中使用的IV索引相同。
如果壹個節點的網絡層接收到廣播承載分發的消息並通過驗證,並將其報告給較低的傳輸層進行處理,如果該節點啟用了中繼功能,TTL字段值為2或更大,並且該元素的目標地址不是該節點的任何單播地址,則TTL字段值應減少1,並將網絡層PDU標記為中繼PDU並轉發給連接到廣播承載層的所有網絡接口。建議在接收網絡PDU和中繼網絡PDU之間設置壹個小的隨機延遲,以避免同時接收同壹網絡PDU的多個中繼消息造成的沖突。
如果節點的網絡層接收到來自GATT承載(如果是廣播承載)的消息並通過驗證,並且將其報告給較低的傳輸層進行處理,如果該節點支持代理功能並且代理功能已打開,並且TTL字段值為2或更大,並且目標地址不是該節點的任何元素的單播地址, 然後將消息的TTL值設置為減壹,並將消息轉發到所有網絡層接口(連接到GATT承載的所有網絡層接口)。
參考網絡層PDU格式生成數據包,然後調用承載層進行傳輸。
網絡消息緩存
為了減少不必要的安全檢查和過多的中繼,節點應該包括所有最近看到的網絡PDU的網絡消息緩存。如果收到的網絡PDU已經在網絡消息緩存中,則不會處理該網絡PDU(即立即將其丟棄)。如果收到網絡PDU並且它不在網絡消息緩存中,則可以對其進行處理(例如,根據網絡安全性進行檢查),如果它是有效的網絡PDU,則應該將其存儲在網絡消息緩存中。
節點不需要緩存整個網絡PDU,而是可以只緩存壹部分用於跟蹤,例如NetMIC、SRC/SEQ或其他值。只要同壹個網絡PDU在設備容量的限制下不能被多次處理,過濾條件就可以定制。
當網絡消息緩存已滿並且需要緩存新的網絡PDU時,新的網絡PDU將替換網絡消息緩存中最舊的網絡PDU。
網絡消息緩存應該能夠存儲至少兩個網絡PDU,盡管強烈建議網絡消息緩存的大小適合預期的網絡密度。傳入消息處理過程的細節仍然由開發人員來實現。
復制《-0x 003 ebb 5242 C5 f 1 E3 fdfb 18251c 5942 bfe 8 EC 25 cc 767d 1e 1ae 1 FDD 9 c 73 cc 0
網絡密鑰:F9 b 024 f 55 b 95 EFA 75 f 6 B2 b8d 8 D3 a3 f 5c
network PDU . PDU = 0x 3 ebb 5242 C5 f 1 E3 fdfb 18251c 5942 bfe 8 EC 25 cc 767d 1e 1ae 1 FDD 9 c 73 cc 0
ivi==== 0
NID = = = 0x3e(10十進制62)
鑰匙。消歧中的私鑰:a 212c 7601572 f72c 15eba 9179775 d9d 0。
消除0的歧義時的I index:0
消除歧義的結果:050000030003
===ctl:0,
===ttl:5,
= = =序列:3,
= = =來源:三、
===netMicSize:4
= = = mi offset:25,
= = = destAndTransportPdu:fdfb 18251c 5942 bfe 8 EC 25 cc 767d 1e 1ae 1FD,
===mic:D9C73CC0
= = = = nonce:00050000030003000000000000000000,
keys . encryption key:da33d 708 b9d 25 ede 5 FDE 26 BBC 1ec 848 a
解密數據:0001800008034458 CCC 398 FD 700 cf 04 e7c 05,
目的地:1,
運輸PDU:800008034458 CCC 398 FD 700 cf 04 e7c 05
復制《-0x 003 EDC 3 eefd 43 c 51766 AE 52 ce 58 BD 0969 f 312c 144 a 14753 c 9 b 28 ea 5bb 8 b
網絡密鑰:F9 b 024 f 55 b 95 EFA 75 f 6 B2 b8d 8 D3 a3 f 5c
network PDU . PDU = 3 EDC 3 eefd 43 c 51766 AE 52 ce 58 BD 0969 f 312c 144 a 14753 c 9 b 28 ea 5bb 8 b
ivi==== 0
NID = = = 0x3e(10十進制62)
鑰匙。消歧中的私鑰:a 212c 7601572 f72c 15eba 9179775 d9d 0。
消除0的歧義時的I index:0
消除歧義的結果:050000040003
===ctl:0,
===ttl:5,
= = =序列:4,
= = =來源:三、
===netMicSize:4
= = = mi offset:25,
= = = destAndTransportPdu:766 AE 52 ce 58 BD 0969 f 312c 144 a 14753 C9 b 28,
===mic:EAA5BB8B
= = = = nonce:00050000040003000000000000000,
keys . encryption key:da33d 708 b9d 25 ede 5 FDE 26 BBC 1ec 848 a
decrypted data:0001800008231 CDC 2 fcb 23 CD 2 EB 4c 47 D8 be 8,
目的地:1,
transport PDU:800008231 CDC 2 fcb 23 CD 2 EB 4c 47 D8 be 8