ESP-MESH

本指南提供有關 ESP-MESH 協議的介紹。更多有關 API 使用的信息,請見 MESH API 參考

引用:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/mesh.html

概述

ESP-MESH 是一套建立在 Wi-Fi 協議之上的網絡協議。ESP-MESH 允許分佈在大範圍區域內(室內和室外)的大量設備(下文稱節點)在同一個 WLAN(無線局域網)中相互連接。ESP-MESH 具有自組網和自修復的特性,也就是說 mesh 網絡可以自主地構建和維護。

本 ESP-MESH 指南分爲以下幾個部分:

  1. 簡介

  2. ESP-MESH 概念

  3. 建立網絡

  4. 管理網絡

  5. 數據傳輸

  6. 信道切換

  7. 性能

  8. 更多注意事項

簡介

傳統網絡架構示意圖

傳統 Wi-Fi 網絡架構

傳統基礎設施 Wi-Fi 網絡是一個“單點對多點”的網絡。這種網絡架構的中心節點爲接入點 (AP),其他節點 (station) 均與 AP 直接相連。其中,AP 負責各個 station 之間的仲裁和轉發,一些 AP 還會通過路由器與外部 IP 網絡交換數據。在傳統 Wi-Fi 網絡架構中,1)由於所有 station 均需與 AP 直接相連,不能距離 AP 太遠,因此覆蓋區域相對有限;2)受到 AP 容量的限制,因此網絡中允許的 station 數量相對有限,很容易超載。

ESP-MESH 網絡架構示意圖

ESP-MESH 網絡架構示意圖

ESP-MESH 與傳統 Wi-Fi 網絡的不同之處在於:網絡中的節點不需要連接到中心節點,而是可以與相鄰節點連接。各節點均負責相連節點的數據中繼。由於無需受限於距離中心節點的位置,所有節點仍可互連,因此 ESP-MESH 網絡的覆蓋區域更廣。類似地,由於不再受限於中心節點的容量限制,ESP-MESH 允許更多節點接入,也不易於超載。

ESP-MESH 概念

術語

術語

描述

節點

任何 屬於可以成爲 ESP-MESH 網絡一部分的設備

根節點

網絡頂部的節點

子節點

如節點 X 連接至節點 Y,且 X 相較 Y 與根節點的距離更遠(跨越的連接數量更多),則稱 X 爲 Y 的子節點。

父節點

與子節點對應的概念

後裔節點

任何可以從根節點追溯到的節點

兄弟節點

連接至同一個父節點的所有節點

連接

AP 和 station 之間的傳統 Wi-Fi 關聯。ESP-MESH 中的節點使用 station 接口與另一個節點的 SoftAP 接口產生關聯,進而形成連接。連接包括 Wi-Fi 網絡中的身份驗證和關聯過程。

上行連接

從節點到其父節點的連接

下行連接

從父節點到其一個子節點的連接

無線 hop

源節點和目標節點間無線連接路徑中的一部分。單跳 指遍歷單個連接的數據包,多跳 指遍歷多個連接的數據包。

子網

子網指 ESP-MESH 網絡的一部分,包括一個節點及其所有後代節點。因此,根節點的子網包括 ESP-MESH 網絡中的所有節點。

MAC 地址

在 ESP-MESH 網絡中用於區別每個節點或路由器的唯一地址

DS

分佈式系統(外部 IP 網絡)

樹型拓撲

ESP-MESH 建立在傳統 Wi-Fi 協議之上,可被視爲一種將多個獨立 Wi-Fi 網絡組合爲一個單一 WLAN 網絡的組網協議。在 Wi-Fi 網絡中,station 在任何時候都僅限於與 AP 建立單個連接(上行連接),而 AP 則可以同時連接到多個 station(下行連接)。然而,ESP-MESH 網絡則允許節點同時充當 station 和 AP。因此,ESP-MESH 中的節點可以使用 其 SoftAP 接口建立多個下行連接,同時使用 其 station 接口建立一個上行連接。這將自然產生一個由多層父子結構組成的樹型網絡拓撲結構。

ESP-MESH 樹型拓撲圖

ESP-MESH 樹型拓撲

ESP-MESH 是一個多跳網絡,也就是說網絡中的節點可以通過單跳或多跳向網絡中的其他節點傳送數據包。因此,ESP-MESH 中的節點不僅傳輸自己的數據包,而且同時充當其他節點的中繼。假設 ESP-MESH 網絡中的任意兩個節點存在物理層上連接(通過單跳或多跳),則這兩個節點可以進行通信。

註解

ESP-MESH 網絡中的大小(節點總數)取決於網絡中允許的最大層級,以及每個節點可以具有的最大下行連接數。因此,這兩個變量可用於配置 ESP-MESH 網絡的大小。

節點類型

ESP-MESH 節點類型圖

ESP-MESH 節點類型

根節點: 指網絡頂部的節點,是 ESP-MESH 網絡和外部 IP 網絡之間的唯一接口。根節點直接連接至傳統的 Wi-Fi 路由器,並在 ESP-MESH 網絡的節點和外部 IP 網絡之間中繼數據包。 ESP-MESH 網絡中只能有一個根節點,且根節點的上行連接只能是路由器。如上圖所示,節點 A 即爲該 ESP-MESH 網絡的根節點。

葉子節點: 指不允許擁有任何子節點(即無下行連接)的節點。因此,葉子節點只能傳輸或接收自己的數據包,但不能轉發其他節點的數據包。如果節點處於 ESP-MESH 網絡的最大允許層級,則該節點將成爲葉子節點。葉子節點不回再產生下行連接,這可以防止節點繼續生成下行連接,從而確保網絡層級不會超出限制。由於建立下行連接必須使用 SoftAP 接口,因此一些沒有 SoftAP 接口的節點(僅有 station 接口)也將被分配爲葉子節點。如上圖所示,位於網絡最外層的 L/M/N 節點即爲葉子節點。

中間父節點:既不是屬於根節點也不屬於葉子節點的節點即爲中間父節點。中間父節點必須有且僅有一個上行連接(即一個父節點),但可以具有 0 個或多個下行連接(即 0 個或多個子節點)。因此,中間父節點可以發送和接收自己的數據包,也可以轉發其上行和下行連接的數據包。如上圖所示,節點 B 到 J 即爲中間父節點。 注意,E/F/G/I/J 等沒有下行連接的中間父節點並不等同於葉子節點,原因在於這些節點仍允許形成下行連接。

空閒節點:尚未加入網絡的節點即爲空閒節點。空閒節點將嘗試與中間父節點形成上行連接,或者在有條件的情況下(參見 自動根節點選擇 )成爲一個根節點。如上圖所示,K 和 O 節點即爲空閒節點。

信標幀和 RSSI 閾值

ESP-MESH 中能夠形成下行連接的每個節點(即具有 SoftAP 接口)都會定期傳輸 Wi-Fi 信標幀。節點可以通過信標幀讓其他節點檢測自己的存在和狀態。空閒節點將偵聽信標幀以生成一個潛在父節點列表,並與其中一個潛在父節點形成上行連接。ESP-MESH 使用“供應商信息元素”來存儲元數據,例如:

  • 節點類型(根節點、中間父節點、葉子節點、空閒節點)

  • 節點當前所處的層級

  • 網絡中允許的最大層級

  • 當前子節點數量

  • 可接受的最大下行連接數量

潛在上行連接的信號強度可由潛在父節點信標幀的 RSSI 表示。爲了防止節點形成弱上行連接,ESP-MESH 採用了針對信標幀的 RSSI 閾值控制機制。如果節點檢測到某節點的信標幀 RSSI 過低(即低於預設閾值),則會在嘗試形成上行連接時忽略該節點。

RSSI 閾值效果圖

RSSI 閾值的影響

上圖(A 側) 展示了 RSSI 閾值將如何影響空閒節點的候選父節點數量。

上圖(B 側) 展示了 RF 屏蔽物將如何降低潛在父節點的 RSSI。由於存在 RF 屏蔽物,節點 X 的 RSSI 高於閾值的區域顯著減小。這會導致空閒節點忽略節點 X,即使從地理位置上看 X 就在空閒節點附近。相反,該空閒節點將從更遠的地方找到一個 RSSI 更強的節點 Y 形成上行連接。

註解

事實上,ESP-MESH 網絡中的節點在 MAC 層仍可以接收所有的信標幀,但 RSSI 閾值控制功能可以過濾掉所有 RSSI 低於預設閾值的信標幀。

首選父節點

當一個空閒節點有多個候選父節點(潛在父節點)時,空閒節點將與其中的 首選父節點 形成上行連接。首選父節點基於以下條件確定:

  • 候選父節點所處的層級

  • 候選父節點當前具有的下行連接(子節點)數量

在網絡中所處層級較淺的候選父節點(包括根節點)將優先成爲首選父節點。這有助於在形成上行連接時控制 ESP-MESH 網絡中的總層級使之最小。例如,在位於第二層和第三層的候選父節點間選擇時,位於第二層的候選父節點將始終優先成爲首選父節點。

如果同一層上存在多個候選父節點,則子節點最少的候選父節點將優先成爲首選父節點。這有助於平衡同一層節點的下行連接數量。

首選父節點選擇示意圖

首選父節點選擇

上圖(A 側) 展示了空閒節點 G 如何在 B/C/D/E/F 五個候選父節點中選擇首選父節點:首先,B/C 節點優於 D/E/F 節點,因爲這兩個節點所處的層級更淺。其次,C 節點優於 B 節點,因爲 C 節點的下行連接數量(子節點數量)更少。

上圖(B 側) 展示了空閒節點 G 如何在根節點 A 和其他候選父節點中選擇首選父節點,此時根節點 A 處於空閒節點 G 範圍之內(即空閒節點 G 接收到的根節點 A 信標幀 RSSI 強度高於預設閾值):由於根節點 A 處於網絡中最淺的層,因此將成爲首選父節點。

註解

用戶還可以自行定義首選父節點的選擇規則,也可以直接指定某個節點爲首選父節點(見 Mesh 手動配網示例 )。

路由表

ESP-MESH 網絡中的每個節點均會維護自己的路由表,並按路由表將數據包(請見 ESP-MESH 數據包)沿正確的路線發送至正確的目標節點。某個特定節點的路由表將包含 該節點的子網中所有節點的 MAC 地址,也包括該節點自己的 MAC 地址。每個路由表會劃分爲多個子路由表,與每個子節點的子網對應。

ESP-MESH 路由表示例圖

ESP-MESH 路由表示例

以上圖爲例,節點 B 的路由表中將包含節點 B 到節點 I 的 MAC 地址(即相當於節點 B 的子網)。節點 B 的路由表可劃分爲節點 C 和 G 的子路由表,分別包含節點 C 到節點 F 的 MAC 地址、節點 G 到節點 I 的 MAC 地址。

ESP-MESH 利用路由表來使用以下規則進行轉發,確定 ESP-MESH 數據包應根據向上行轉發還是向下行轉發。

1. 如果數據包的目標 MAC 地址處於當前節點的路由表中且不是當前節點本身,則選擇包含目標 MAC 地址的子路由表,並將數據包向下轉發給子路由表對應的子節點。

2. 如果數據包的目標 MAC 地址不在當前節點的路由表內,則將數據包向上轉發給當前節點的父節點,並重復執行該操作直至數據包達到目標地址。此步驟可重複至根節點(根節點包含整個網絡的全部節點)。

註解

用戶可以通過調用 esp_mesh_get_routing_table() 獲取一個節點的路由表,調用 esp_mesh_get_routing_table_size() 獲取一個路由表的大小,也可通過調用 esp_mesh_get_subnet_nodes_list() 獲取某個子節點的子路由表,調用 esp_mesh_get_subnet_nodes_num() 獲取子路由表的大小。

建立網絡

一般過程

警告

ESP-MESH 正式開始構建網絡前,必須確保網絡中所有節點具有相同的配置(見 mesh_cfg_t)。每個節點必須配置 相同 MESH 網絡 ID、路由器配置和 SoftAP 配置

ESP-MESH 網絡將首先選擇根節點,然後逐層形成下行連接,直到所有節點均加入網絡。網絡的佈局可能取決於諸如根節點選擇、父節點選擇和異步上電覆位等因素。但簡單來說,一個 ESP-MESH 網絡的構建過程可以概括爲以下步驟:

ESP-MESH 網絡構建過程示意圖

ESP-MESH 網絡構建過程

1. 根節點選擇

根節點直接進行指定(見 用戶指定根節點)或通過選舉由信號強度最強的節點擔任(見 自動根節點選擇)。一旦選定,根節點將與路由器連接,並開始允許下行連接形成。如上圖所示,節點 A 被選爲根節點,因此節點 A 上行連接到路由器。

2. 第二層形成

一旦根節點連接到路由器,根節點範圍內的空閒節點將開始與根節點連接,從而形成第二層網絡。一旦連接,第二層節點成爲中間父節點(假設最大允許層級大於 2 層),並進而形成下一層。如上圖所示,節點 B 到節點 D 都在根節點的連接範圍內。因此,節點 B 到節點 D 將與根節點形成上行連接,併成爲中間父節點。

3. 其餘層形成

剩餘的空閒節點將與所處範圍內的中間父節點連接,並形成新的層。一旦連接,根據網絡的最大允許層級,空閒節點成爲中間父節點或葉子節點。此後重複該步驟,直到網絡中的所有空閒節點均加入網絡或達到網絡最大允許層級。如上圖所示,節點 E/F/G 分別與節點 B/C/D 連接,併成爲中間父節點。

4. 限制樹深度

爲了防止網絡超過最大允許層級,最大允許層級上的節點將在完成連接後成爲葉子節點。這樣一來,其他空閒節點將無法與這些最大允許層上的葉子節點形成連接,因此不會超過最大允許層級。然而,如果空閒節點無法找到其他潛在父節點,則將無限期地保持空閒狀態。如上圖所示,網絡的最大允許層級爲四。因此,節點 H 在完成連接後將成爲葉子節點,以防止任何下行連接的形成。

自動根節點選擇

在自動模式下,根節點的選擇取決於相對於路由器的信號強度。每個空閒節點將通過 Wi-Fi 信標幀發送自己的 MAC 地址和路由器 RSSI 值。 MAC 地址可以表示網絡中的唯一節點,而 路由器 RSSI 值 代表相對於路由器的信號強度。

此後,每個節點將同時掃描來自其他空閒節點的信標幀。如果節點檢測到具有更強的路由器 RSSI 的信標幀,則節點將開始傳輸該信標幀的內容(相當於爲這個節點投票)。經過最小迭代次數(可預先設置,默認爲 10 次)將選舉出路由器 RSSI 值最強的信標幀。

在達到預設迭代次數後,每個節點將單獨檢查其 得票百分比得票數/總票數)以確定它是否應該成爲根節點。 如果節點的得票百分比大於預設的閾值(默認爲 90%),則該節點將成爲根節點

下圖展示了在 ESP-MESH 網絡中,根節點的自動選擇過程。

根節點選舉流程示例圖

根節點選舉示例

1. 上電覆位時,每個節點開始傳輸自己的信標幀(包括 MAC 地址和路由器 RSSI 值)。

2. 在多次傳輸和掃描迭代中,路由器 RSSI 最強的信標幀將在整個網絡中傳播。節點 C 具有最強的路由器 RSSI 值(-10 dB),因此它的信標幀將在整個網絡中傳播。所有參與選舉的節點均給節點 C 投票,因此節點 C 的得票百分比爲 100%。因此,節點 C 成爲根節點,並與路由器連接。

3. 一旦節點 C 與路由器連接,節點 C 將成爲節點 A/B/D/E 的首選父節點(即最淺的節點),並與這些節點連接。節點 A/B/D/E 將形成網絡的第二層。

4. 節點 F 和節點 G 分別連接節點 D 和節點 E,並完成網絡構建過程。

註解

用戶可以通過 esp_mesh_set_attempts() 配置選舉的最小迭代次數。用戶應根據網絡內的節點數量配置迭代次數(即 mesh 網絡越大,所需的迭代次數越高)。

警告

得票百分比閾值 也可以使用 esp_mesh_set_vote_percentage() 進行配置。得票百分比閾值過低 可能導致同一 mesh 網絡中兩個或多個節點成爲根節點,進而分化爲多個 mesh 網絡。如果發生這種情況,ESP-MESH 具有內部機制,可自主解決 根節點衝突。這些具有多個根節點的網絡將圍繞一個根節點形成一個網絡。然而,兩個或多個路由器 SSID 相同但路由器 BSSID 不同的根節點衝突尚無法解決。

用戶指定根節點

根節點也可以由用戶指定,即直接讓指定的根節點與路由器連接,並放棄選舉過程。當根節點指定後,網絡內的所有其他節點也必須放棄選舉過程,以防止根節點衝突的發生。下圖展示了在 ESP-MESH 網絡中,根節點的手動選擇過程。

根節點指定過程示例圖

根節點指定示例(根節點 = A,最大層級 = 4)

1. 節點 A 是由用戶指定的根節點,因此直接與路由器連接。此時,所有其他節點放棄選舉過程。

2. 節點 C 和節點 D 將節點 A 選爲自己的首選父節點,並與其形成連接。這兩個節點將形成網絡的第二層。

3. 類似地,節點 B 和節點 E 將與節點 C 連接,節點 F 將與節點 D 連接。這三個節點將形成網絡的第三層。

4. 節點 G 將與節點 E 連接,形成網絡的第四層。然而,由於該網絡的最大允許層級已配置爲 4,因此節點 G 將成爲葉子節點,以防止形成任何新層。

註解

一旦指定根節點,該根節點應調用 esp_mesh_set_parent() 使其直接與路由器連接。類似地,所有其他節點都應該調用 esp_mesh_fix_root() 放棄選舉過程。

選擇父節點

默認情況下,ESP-MESH 具有可以自組網的特點,也就是每個節點都可以自主選擇與其形成上行連接的潛在父節點。自主選擇出的父節點被稱爲首選父節點。用於選擇首選父節點的標準旨在減少 ESP-MESH 網絡的層級,並平衡各個潛在父節點的下行連接數(參見 首選父節點)。

不過,ESP-MESH 也允許用戶禁用自組網功能,即允許用戶自己定義父節點選擇標準,或直接指定某個節點爲父節點(見: Mesh 手動組網示例 )。

異步上電覆位

ESP-MESH 網絡構建可能會受到節點上電順序的影響。如果網絡中的某些節點爲異步上電(即相隔幾分鐘上電),網絡的最終結構可能與所有節點同步上電時的理想情況不同。延遲上電的節點將遵循以下規則:

規則 1:如果網絡中已存在根節點,則延遲節點不會嘗試選舉成爲新的根節點,即使自身的路由器 RSSI 更強。相反,延遲節點與任何其他空閒節點無異,將通過與首選父節點連接來加入網絡。如果該延遲節點爲用戶指定的根節點,則網絡中的所有其他節點將保持空閒狀態,直到延遲節點完成上電。

規則 2:如果延遲節點形成上行連接,併成爲中間父節點,則後續也可能成爲其他節點(即其他更淺的節點)的新首選父節點。此時,其他節點切換上行連接至該延遲節點(見 父節點切換)。

規則 3:如果空閒節點的指定父節點上電延遲了,則該空閒節點在沒有找到指定父節點前不會嘗試形成任何上行連接。空閒節點將無限期地保持空閒,直到其指定的父節點上電完成。

下方示例展示了異步上電對網絡構建的影響。

異步電源示例圖

網絡構建(異步電源)示例

1. 節點 A/C/D/F/G/H 同步上電,並通過廣播其 MAC 地址和路由器 RSSI 開始選舉根節點。節點 A 的 RSSI 最強,因此當選爲根節點。

2. 一旦節點 A 成爲根節點,其餘的節點就開始與其首選父節點逐層形成上行連接,並最終形成一個具有五層的網絡。

3. 節點 B/E 由於存在上電延遲,因此即使路由器 RSSI 比節點 A 更強(-20 dB 和 -10 dB)也不會嘗試成爲根節點。相反,這兩個上電延遲節點均將與對應的首選父節點 A 和 C 形成上行連接。加入網絡後,節點 B/E 均將成爲中間父節點。

4. 節點 B 由於所處層級變化(現爲第二層)而成爲新的首選父節點,因此節點 D/G 將切換其上行連接從而選擇新的首選父節點。由於切換的發生,最終的網絡層級從原來的五層減少至三層。

同步上電:如果所有節點均同步上電,節點 E (-10 dB)由於路由器 RSSI 最強而成爲根節點。此時形成的網絡結構將與異步上電的情況截然不同。但是,如果用戶手動切換根節點,則仍可以達到同步上電的網絡結構 (請見 esp_mesh_waive_root())。

註解

從某種程度上,ESP-MESH 可以自動修復部分因異步上電引起的父節點選擇的偏差(請見 父節點切換)

環路避免、檢測和處理

環路是指特定節點與其後代節點(特定節點子網中的節點)形成上行連接的情況。因此產生的循環連接路徑將打破 mesh 網絡的樹型拓撲結構。ESP-MESH 的節點在選擇父節點時將主動排除路由表(見 路由表)中的節點,從而避免與其子網中的節點建立上行連接並形成環路。

在存在環路的情況下,ESP-MESH 可利用路徑驗證機制和能量傳遞機制來檢測環路的產生。因與子節點建立上行連接而導致環路形成的父節點將通知子節點環路的存在,並主動斷開連接。

管理網絡

作爲一個自修復網絡,ESP-MESH 可以檢測並修正網絡路由中的故障。當具有一個或多個子節點的父節點斷開或父節點與其子節點之間的連接不穩定時,會發生故障。ESP-MESH 中的子節點將自主選擇一個新的父節點,並與其形成上行連接,以維持網絡互連。ESP-MESH 可以處理根節點故障和中間父節點故障。

根節點故障

如果根節點斷開,則與其連接的節點(第二層節點)將及時檢測到該根節點故障。第二層節點將主動嘗試與根節點重連。但是在多次嘗試失敗後,第二層節點將啓動新一輪的根節點選舉。 第二層中 RSSI 最強的節點將當選爲新的根節點,而剩餘的第二層節點將與新的根節點(如果不在範圍內的話,也可與相鄰父節點連接)形成上行連接。

如果根節點和下面多層的節點(例如根節點、第二層節點和第三層節點)同時斷開,則位於最淺層的仍在正常工作的節點將發起根節點選舉。下方示例展示了網絡從根節點斷開故障中進行自修復。

根節點故障的自修復示意圖

根節點故障的自修復示意

1. 節點 C 是網絡的根節點。節點 A/B/D/E 是連接到節點 C 的第二層節點。

2. 節點 C 斷開。在多次重連嘗試失敗後,第二層節點開始通過廣播其路由器 RSSI 開始新一輪的選舉。此時,節點 B 的路由器 RSSI 最強。

3. 節點 B 被選爲根節點,並開始接受下行連接。剩餘的第二層節點 A/D/E 形成與節點 B 的上行連接,因此網絡已經恢復,並且可以繼續正常運行。

註解

如果是手動指定的根節點斷開,則無法進行自動修復。任何節點不會在存在指定根節點的情況下開始選舉過程

中間父節點故障

如果中間父節點斷開,則與之斷開的子節點將主動嘗試與該父節點重連。在多次重連嘗試失敗後,每個子節點開始掃描潛在父節點(請見 信標幀和 RSSI 閾值)。

如果存在其他可用的潛在父節點,每個子節點將分別給自己選擇一個新的首選父節點(請見 首選父節點),並與它形成上行連接。如果特定子節點沒有其他潛在的父節點,則將無限期地保持空閒狀態。

下方示例展示了網絡從中間父節點斷開故障中進行自修復。

中間父節點故障的自修復示意圖

中間父節點故障的自修復

1. 網絡中存在節點 A 至 G。

2. 節點 C 斷開。節點 F/G 檢測到節點 C 的斷開故障,並嘗試與節點 C 重新連接。在多次重連嘗試失敗後,節點 F/G 將開始選擇新的首選父節點。

3. 節點 G 因其範圍內不存在任何父節點而暫時保持空閒。節點 F 的範圍中有 B 和 E 兩個節點,但節點 B 因爲所處層級更淺而當選新的父節點。節點 F 將與節點 B 連接後,併成爲一箇中間父節點,節點 G 將於節點 F 相連。這樣一來,網絡已經恢復了,但結構發生了變化(網絡層級增加了 1 層)。

註解

如果子節點的父節點已被指定,則子節點不會嘗試與其他潛在父節點連接。此時,該子節點將無限期地保持空閒狀態。

根節點切換

除非根節點斷開,否則 ESP-MESH 不會自動切換根節點。即使根節點的路由器 RSSI 降低至必須斷開的情況,根節點也將保持不變。根節點切換是指明確啓動新選舉過程的行爲,即具有更強路由器 RSSI 的節點選爲新的根節點。這可以用於應對根節點性能降低的情況。

要觸發根節點切換,當前根節點必須明確調用 esp_mesh_waive_root() 以觸發新的選舉。當下根節點將指示網絡中的所有節點開始發送並掃描信標幀(見 自動根節點選擇),但與此同時一直保持聯網(即不會變爲空閒節點)。如果另一個節點收到的票數超過當前根節點,則將啓動根節點切換過程,否則根節點將保持不變

新選出的根節點向當前的根節點發送 切換請求,而原先的根節點將返回一個應答通知,表示已經準備好切換。一旦接收到應答,新選出的根節點將與其父節點斷開連接,並迅速與路由器形成上行連接,進而成爲網絡的新根節點。原先的根節點將斷開與路由器的連接,並與此同時保持其所有下行連接 並進入空閒狀態。之前的根節點將開始掃描潛在的父節點並選擇首選父節點。

下圖說明了根節點切換的示例。

根節點切換示意圖

切換根節點示例

1. 節點 C 是當前的根節點,但路由器 RSSI 值 (-85 dB) 降低至較低水平。此時,新的選舉過程被觸發了。所有節點開始傳輸和掃描信標幀(此時仍保持連接)。

2. 經過多輪傳輸和掃描後,節點 B 被選爲新的根節點。節點 B 向節點 C 發送了一個 切換請求,節點 C 回覆一個應答。

3. 節點 B 與其父節點斷開連接,並與路由器連接,成爲網絡中的新根節點。節點 C 與路由器斷開連接,進入空閒狀態,並開始掃描並選擇新的首選父節點。 節點 C 在整個過程中仍保持其所有的下行連接

4. 節點 C 選擇節點 B 作爲其的首選父節點,與之形成上行連接,併成爲一個第二層節點。由於節點 C 仍保持相同的子網,因此根節點切換後的網絡結構沒有變化。然後,由於切換的發生,節點 C 子網中每個節點的所處層級均增加了一層。如果根節點切換過程中產生了新的根節點,則 父節點切換 可以隨後調整網絡結構。

註解

根節點切換必須要求選舉,因此只有在使用自組網 ESP-MESH 網絡時才支持。換句話說,如果使用指定的根節點,則不能進行根節點切換。

父節點切換

父節點切換是指一個子節點將其上行連接切換到更淺一層的另一個父節點。父節點切換是自動的,這意味着如果較淺層出現了可用的潛在父節點(因“異步上電覆位”產生),子節點將自動更改其上行連接。

所有潛在的父節點將定期發送信標幀(參見 信標幀和 RSSI 閾值),從而允許子節點掃描較淺層的父節點的可用性。由於父節點切換,自組網 ESP-MESH 網絡可以動態調整其網絡結構,以確保每個連接均具有良好的 RSSI 值,並且網絡中的層級最小。

數據傳輸

ESP-MESH 數據包

ESP-MESH 網絡使用 ESP-MESH 數據包傳輸數據。ESP-MESH 數據包 完全包含在 Wi-Fi 數據幀 中。ESP-MESH 網絡中的多跳數據傳輸將涉及通過不同 Wi-Fi 數據幀在每個無線跳上傳輸的單個 ESP-MESH 數據包。

下圖顯示了 ESP-MESH 數據包的結構及其與 Wi-Fi 數據幀的關係。

ESP-MESH 數據包示意圖

ESP-MESH 數據包

ESP-MESH 數據包的 報頭 包含源節點和目標節點的 MAC 地址。選項 (option) 字段包含有關特殊類型 ESP-MESH 數據包的信息,例如組傳輸或來自外部 IP 網絡的數據包(請參閱 MESH_OPT_SEND_GROUPMESH_OPT_RECV_DS_ADDR)。

ESP-MESH 數據包的 有效載荷 包含實際的應用數據。該數據可以爲原始二進制數據,也可以是使用 HTTP、MQTT 和 JSON 等應用層協議的編碼數據(請見:mesh_proto_t)。

註解

當向外部 IP 網絡發送 ESP-MESH 數據包時,報頭的目標地址字段將包含目標服務器的 IP 地址和端口號,而不是節點的 MAC 地址(請見:mesh_addr_t)。此外,根節點將處理外發 TCP/IP 數據包的形成。

組控制和組播

組播功能允許將單個 ESP-MESH 數據包同時發送給網絡中的多個節點。ESP-MESH 中的組播可以通過“指定一個目標節點列表”或“預配置一個節點組”來實現。這兩種組播方式均需調用 esp_mesh_send() 實現。

如果通過“指定目標節點列表”實現組播,用戶必須首先將 ESP-MESH 數據包的目標地址設置爲 組播組地址 (比如 01:00:5E:xx:xx:xx)。這表明 ESP-MESH 數據包是一個擁有一組地址的組播數據包,且該地址應該從報頭選項中獲得。然後,用戶必須將目標節點的 MAC 地址列爲選項(請見: mesh_opt_tMESH_OPT_SEND_GROUP)。這種組播方法不需要進行提前設置,但由於每個目標節點的 MAC 地址均需列爲報頭的選項字段,因此會產生大量開銷數據。

分組組播允許 ESP-MESH 數據包被髮送到一個預先配置的節點組。每個分組都有一個具有唯一性的 ID 標識。用戶可通過 esp_mesh_set_group_id() 將節點加入一個組。分組組播需要將 ESP-MESH 數據包的目標地址設置爲目標組的 ID,還必須設置 MESH_DATA_GROUP 標誌位。分組組播產生的開銷更小,但必須提前將節點加入分組中。

註解

在組播期間,網絡中的所有節點在 MAC 層都會收到 ESP-MESH 數據包。然而,不包括在 MAC 地址列表或目標組中的節點將簡單地過濾掉這些數據包。

廣播

廣播功能允許將單個 ESP-MESH 數據包同時發送給網絡中的所有節點。每個節點可以將一個廣播包轉發至其所有上行和下行連接,使得數據包儘可能快地在整個網絡中傳播。但是,ESP-MESH 利用以下方法來避免在廣播期間浪費帶寬。

1. 當中間父節點收到來自其父節點的廣播包時,它會將該數據包轉發給自己的各個子節點,同時爲自己保存一份數據包的副本。

2. 當中間父節點是廣播的源節點時,它會將該數據包向上發送至其父節點,並向下發送給自己的各個子節點。

3. 當中間父節點接收到一個來自其子節點的廣播包時,它會將該數據包轉發給其父節點和其餘子節點,同時爲自己保存一份數據包的副本。

4. 當葉子節點是廣播的源節點時,它會直接將該數據包發送至其父節點。

5. 當根節點是廣播的源節點時,它會將該數據包發送至自己的所有子節點。

6. 當根節點收到來自其子節點的廣播包時,它會將該數據包轉發給其餘子節點,同時爲自己保存一份數據包的副本。

7. 當節點接收到一個源地址與自身 MAC 地址匹配的廣播包時,它會將該廣播包丟棄。

8. 當中間父節點收到一個來自其父節點的廣播包時(該數據包最初來自該父節點的一個子節點),它會將該廣播包丟棄。

上行流量控制

ESP-MESH 依賴父節點來控制其直接子節點的上行數據流。爲了防止父節點的消息緩衝因上行傳輸過載而溢出,父節點將爲每個子節點分配一個稱爲 接收窗口 的上行傳輸配額。 每個子節點均必須申請接收窗口才允許進行上行傳輸。接收窗口的大小可以動態調整。完成從子節點到父節點的上行傳輸包括以下步驟:

1. 在每次傳輸之前,子節點向其父節點發送窗口請求。窗口請求中包括一個序號,與子節點的待傳輸數據包相對應。

2. 父節點接收窗口請求,並將序號與子節點發送的前一個數據包的序號進行比較,用於計算返回給子節點的接收窗口大小。

3. 子節點根據父節點指定的窗口大小發送數據包。如果子節點的接收窗口耗盡,它必須通過發送請求獲得另一個接收窗口,然後才允許繼續發送。

註解

ESP-MESH 不支持任何下行流量控制。

警告

由於 父節點切換,數據包可能會在上行傳輸期間丟失。

由於根節點是通向外部 IP 網絡的唯一接口,因此下行節點必須瞭解根節點與外部 IP 網絡的連接狀態。否則,節點可能會嘗試向一個已經與 IP 網絡斷開連接的根節點發送數據,從而造成不必要的傳輸和數據包丟失。ESP-MESH 可以基於監測根節點和外部 IP 網絡的連接狀態,提供一種穩定外發數據吞吐量的機制。根節點可以通過調用 esp_mesh_post_toDS_state() 將自身與外部 IP 網絡的連接狀態廣播給所有其他節點。

雙向數據流

下圖展示了 ESP-MESH 雙向數據流涉及的各種網絡層。

ESP-MESH 雙向數據流示意圖

ESP-MESH雙向數據流

由於使用 路由表ESP-MESH 能夠在 mesh 層中完全處理數據包的轉發。TCP/IP 層僅與 mesh 網絡的根節點有關,可幫助根節點與外部 IP 網絡的數據包傳送。

信道切換

背景

在傳統的 Wi-Fi 網絡中,信道 代表預設的頻率範圍。在基礎設施基本服務集 (BSS) 中,工作 AP 及與之相連的 station 必須處於傳輸信標的工作信道(1 到 14)中。物理上相鄰的 BSS 使用相同的工作信道會導致干擾產生和性能下降。

爲了允許 BSS 適應不斷變化的物理層條件並保持性能,Wi-Fi 網絡中增加了 網絡信道切換 的機制。網絡信道切換是將 BSS 移至新的工作信道,並同時最大限度地減少期間對 BSS 的影響。然而,我們應該認識到,網絡信道切換可能不會成功,無法將原信道中的所有 station 均移動至新的信道。

在基礎設施 Wi-Fi 網絡中,網絡信道切換由 AP 觸發,目的是將該 AP 及與之相連的所有 station 同步切換到新的信道。網絡信道切換是通過在 AP 的週期性發送信標幀內嵌入一個 信道切換公告 (CSA) 元素來實現的。在網絡信號切換前,該 CSA 元素用於向所有連接的 station 廣播有關即將發生的網絡信道切換,並且將包含在多個信標幀中。

一個 CSA 元素包含有關 新信道號信道切換計數 的信息。其中,信道切換計數 指示在網絡信道切換之前剩餘的信標幀間隔 (TBTT) 數量。因此,信道切換計數 依每個信標幀遞減,並且允許與之連接的 station 與 AP 同步進行信道切換。

ESP-MESH 網絡信道切換

ESP-MESH 網絡信道切換還利用包含 CSA 元素的信標幀。然而,ESP-MESH 作爲一個多跳網絡,其信標幀可能無法到達網絡中的所有節點(這點與單跳網絡不同),因此信道切換過程更加複雜。因此,ESP-MESH 網絡依賴於通過節點轉發 CSA 元素,從而實現在整個網絡中的傳播。

當具有一個或多個子節點的中間父節點接收到包含 CSA 元素的信標幀時,該節點會將該元素包含在其下一個發送的信標幀(即具有相同的 新信道號信道切換計數)中,從而實現該 CSA 元素的轉發。鑑於 ESP-MESH 網絡中的所有節點都接收到相同的 CSA 元素,這些節點可以使用 信道切換計數 來同步其信道切換,但也會經歷因 CSA 元素轉發造成的延遲。

ESP-MESH 網絡信道切換可以由路由器或根節點觸發。

根節點觸發

由根節點觸發的信道切換只能在 ESP-MESH 網絡未連接到路由器 時纔會發生。通過調用 esp_mesh_switch_channel(),根節點將設置一個初始 信道切換計數 值,並開始在其信標幀中包含 CSA 元素。接着,每個 CSA 元素將抵達第二層節點,並通過第二層節點自己的信標幀繼續進行向下轉發。

路由器觸發

當 ESP-MESH 網絡連接到路由器時,整個網絡必須與路由器採用同一個信道。因此,根節點在連接到路由器時無法觸發信道切換

當根節點從路由器接收到包含 CSA 元素的信標幀時,根節點將 CSA 元素中的信道切換計數值設置爲自定義值,然後再通過信標幀繼續向下轉發。此後,該 信道切換計數 將依轉發次數相對於自定義值依次遞減。該自定義值可以基於諸如網絡層級、當前節點數等因素。

ESP-MESH 網絡及其路由器可能具有不同且變化的信標間隔,因此需要將 信道切換計數 值設置爲自定義值。也就是說,路由器提供的 信道切換計數 值與 ESP-MESH 網絡無關。通過使用自定義值,ESP-MESH 網絡中的節點能夠相對於 ESP-MESH 網絡的信標間隔同步切換信道。也正因如此,ESP-MESH 網絡也會出現信道與路由器及其連接 station 的信道切換不同步的情況。

網絡信道切換的影響

  • 由於 ESP-MESH 網絡信道切換與路由器的信道切換不同步,ESP-MESH 網絡和路由器之間會出現 臨時信道差異

    • ESP-MESH 網絡的信道切換時間取決於 ESP-MESH 網絡的信標間隔和根節點的自定義 信道切換計數

    • 在 ESP-MESH 網絡切換期間,信道差異將阻止根節點和路由器之間的任何數據交換。

    • 在 ESP-MESH 網絡中,根節點和中間父節點將請求與其連接的子節點停止傳輸,直至信道切換髮生(通過將 CSA 元素的 信道切換模式 字段置爲 1)。

    • 頻繁的路由器觸發網絡信道切換可能會降低 ESP-MESH 網絡的性能。請注意,這可能是由 ESP-MESH 網絡本身造成的(例如由於 ESP-MESH 網絡的無線介質爭用等原因)。此時,用戶應該禁用路由器觸發的自主信道切換,並直接指定一個信道。

  • 當存在 臨時信道差異 時,根節點從技術上來說仍保持連接至路由器。

    • 如果根節點經過一定數量信標間隔仍無法接到信標幀或探測來自路由器的響應,則會斷開連接。

    • 斷開連接時,根節點將自動重新掃描所有信道以確定是否存在路由器。

  • 如果根節點無法接收任何路由器的 CSA 信標幀(例如短暫的路由器切換時間),則路由器將在沒有 ESP-MESH 網絡的情況下切換信道。

    • 在路由器切換信道後,根節點將不再能夠接收路由器的信標幀和探測響應,並導致在一定數量的信標間隔後斷開連接。

    • 在斷開連接後,根節點將重新所有信道,尋找路由器。

    • 根節點將在整個過程中維護與之相連的下行連接。

註解

雖然 ESP-MESH 網絡信道切換的目的是將網絡內的所有節點移動到新的工作信道,但也應該認識到,信道切換可能無法成功移動所有節點(比如由於節點故障等原因)。

信道和路由器切換配置

ESP-MESH 允許通過配置啓用或禁用自主信道切換。同樣,也可以通過配置啓用或禁用自主路由器切換(即當根節點自主連接到另一個路由器時)。自主信道切換和自主路由器切換取決於以下配置參數和運行時間條件。

允許信道切換:本參數決定是否允許 ESP-MESH 網絡進行自主信道切換,具體可通過 mesh_cfg_t 結構體中的 allow_channel_switch 字段進行配置。

預設信道:ESP-MESH 網絡可以將 mesh_cfg_t 結構體中的 channel 字段設置爲相應的信道號,而具備一個預設信道。如果未設置此字段,則 allow_channel_switch 的設置將被覆蓋,即始終允許信道切換。

允許路由器切換:本參數決定是否允許 ESP-MESH 網絡進行自主路由器切換,具體可通過 mesh_router_t 結構體中的 allow_router_switch 字段進行配置。

預設路由器 BSSID:ESP-MESH 網絡可以將 mesh_router_t 結構體的 bssid 字段設置爲 目標路由器的 BSSID,而預設一個路由器。如果未設置此字段,則 allow_router_switch 的設置將被覆蓋,即始終允許路由器切換。

存在根節點:根節點的存在也會影響是否允許信道或路由器切換。

下表說明了在不同參數/條件組合下是否允許信道切換和路由器切換。請注意,X 代表參數“不關心”。

預設信道

允許信道切換

預置路由器 BSSID

允許路由器切換

存在根節點

允許切換?

N

X

N

X

X

信道與路由器

N

X

Y

N

X

僅信道

N

X

Y

Y

X

信道與路由器

Y

Y

N

X

X

信道與路由器

Y

N

N

X

N

僅路由器

Y

N

N

X

Y

信道與路由器

Y

Y

Y

N

X

僅信道

Y

N

Y

N

N

Y

N

Y

N

Y

僅信道

Y

Y

Y

Y

X

信道與路由器

Y

N

Y

Y

N

僅路由器

Y

N

Y

Y

Y

信道與路由器

性能

ESP-MESH 網絡的性能可以基於以下多個指標進行評估:

組網時長:從頭開始構建 ESP-MESH 網絡所需的總時長。

修復時間:從網絡檢測到節點斷開到執行適當操作(例如生成新的根節點或形成新的連接等)以修復網絡所需的時間。

每跳延遲:數據每經過一次無線 hop 而經歷的延遲,即從父節點向子節點(或從子節點向父節點)發送一個數據包所需的時間。

網絡節點容量:ESP-MESH 網絡可以同時支持的節點總數。該指標取決於節點可以接受到的最大下行連接數和網絡中允許的最大層級。

ESP-MESH 網絡的常見性能指標如下表所示:

  • 組網時長:< 60 秒

  • 修復時間

    • 根節點斷開:< 10 秒

    • 子節點斷開:< 5 秒

  • 每條延遲:10 到 30 毫秒

註解

上述性能指標的測試條件見下。

  • 測試設備數量:100

  • 最大允許下行連接數量:6

  • 最大允許層級:6

註解

吞吐量取決於數據包錯誤率和 hop 數量。

註解

根節點訪問外部 IP 網絡的吞吐量直接受到 ESP-MESH 網絡中節點數量和路由器帶寬的影響。

註解

用戶應注意,ESP-MESH 網絡的性能與網絡配置和工作環境密切相關。

更多注意事項

  • 數據傳輸使用 Wi-Fi WPA2-PSK 加密

  • Mesh 網絡 IE 使用 AES 加密

本文圖片中使用的路由器與互聯網圖標來自 www.flaticon.comSmashicons

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章