W artykule zostanie zaprezentowany projekt prostej i taniej sieci zbudowanej w oparciu na komunikacji Wi-Fi, popularnych modułach ESP32[1] oraz protokole ESP-MESH[2]. Choć określenie „mesh” użyte w nazwie protokołu stanowi spore nadużycie (sieć pracuje w typowej topologii drzewa), to skalowalność, zaimplementowane mechanizmy autokonfiguracji (self-forming) oraz samouzdrawianie sieci (self-healing) pozwalają nam, w pewnym stopniu, rozpatrywać ją w charakterze typowej sieci kratowej.
Topologie sieci bezprzewodowych
Nie wchodząc w szczegóły, związane z budową oraz zaletami/wadami poszczególnych konfiguracji sieci, możemy wyróżnić topologie (rysunek 1):
- liniową (Linear Topology),
- gwiazdową (Star Topology),
- pierścieniową (Ring Topology),
- kratową (Mesh Topology),
- drzewa (Tree Topology).
Dochodzą jeszcze topologie hybrydowe, będące połączeniem ww. konfiguracji. Wymieniona lista nie wyczerpuje tematu, a każda z topologii może występować w kilku wariantach. Przykładowo, sieci Mesh mogą pracować w tzw. pełnej siatce (Full Mesh), w której każdy węzeł sieci ma fizyczne połączenie z dowolnym innym węzłem. Co innego w konfiguracji siatki częściowej (Partial Mesh), gdzie nie wszystkie węzły sieci mają tę samą liczbę połączeń do innych węzłów.
Jednym z najlepszych przykładów typowej sieci gwiazdowej jest połączenie pomiędzy punktem dostępowym (AP) a wszystkimi urządzeniami bezprzewodowymi, pracującymi w ramach jednej lokalnej sieci Wi-Fi. Rozwiązanie to – dobrze spisujące się w typowych zastosowaniach tworzenia sieci lokalnej w domach lub biurach – nie jest najlepszą architekturą dla obszernych sieci czujników pomiarowych (często do 1000 węzłów), rozmieszczonych na dużym obszarze (znacznie przekraczającym zasięg komunikacji na poziomie AP ↔ węzeł). W typowej konfiguracji gwiazdowej pojedynczy punkt dostępowy (koordynator) jednoznacznie ogranicza maksymalną liczbę węzłów, które mogą zostać podłączone do sieci (255 dla sieci Wi-Fi), jednocześnie definiuje obszar działania takiej sieci, wynikający z maksymalnego zasięgu komunikacji pomiędzy koordynatorem a najdalej oddalonym węzłem – rysunek 2.
Węzły oznaczone numerami 6, 7, 8 oraz 9 znajdują się poza zasięgiem komunikacji koordynatora i nie mogą zostać przyłączone do sieci.
Architektura sieci ESP-MESH
Jak łatwo zauważyć na rysunku 2, problemy i ograniczenia zasięgu występujące w typowej konfiguracji gwiazdowej mogą zostać rozwiązane poprzez wprowadzenie możliwości komunikacji na poziomie węzeł-węzeł, bez konieczności zestawienia bezpośredniego połączenia z koordynatorem sieci. Takie rozwiązanie nie tylko eliminuje problemy związane z ograniczeniem liczby węzłów, które mogą zostać podłączone bezpośrednio do sieci, ale pozwala jednocześnie uzyskać nieograniczony (teoretycznie) zasięg komunikacji – rysunek 3. Przy wykorzystaniu technologii Wi-Fi, protokołu ESP-MESH oraz modułów ESP32 maksymalna odległość, na jaką mogą zostać oddalone poszczególne węzły, wynosi około 200 metrów, co przy tysiącu węzłów w sieci pozwala na pokrycie zasięgiem bardzo dużego obszaru.
Protokół ESP-MESH bazuje na typowej komunikacji Wi-Fi. Jak zatem uzyskano połączenia na poziomie węzeł-węzeł? Idea rozwiązania jest dość prosta i najłatwiej zobrazować ją jako zestawienie wielu podsieci typu Star w jedną sieć. W takim rozwiązaniu każdy z węzłów, oprócz typowych funkcji (nadawanie/odbiór danych pomiarowych), pełni jednocześnie rolę punktu dostępowego (softAP) dla kolejnych węzłów oraz pośrednika w przekazywaniu wiadomości z niższych warstw. Schemat takiej sieci pokazuje rysunek 4, na którym widać także, że w przypadku frameworku ESP-MESH mamy do czynienia z typową architekturą drzewa.
Pokazana na rysunku 4 konfiguracja sieci pozwala nam zdefiniować cztery typy węzłów:
- Węzeł ROOT. W ramach sieci ESP-MESH może występować wyłącznie jeden węzeł tego typu, odpowiedzialny za ewentualne połączenie z bramą zewnętrzną i komunikację z siecią Internet. Wybór węzła ROOT może być realizowany automatycznie (poprzez formę wyborów opartych na sile sygnału) lub poprzez wybór użytkownika na etapie budowania i konfiguracji sieci.
- Węzły LEAF. Mogą wyłącznie wysyłać lub odbierać własne pakiety. Nie mają połączeń typu child, a tym samym nie pośredniczą w przekazywaniu pakietów danych w sieci. Tworzone są w momencie osiągnięcia przez sieć maksymalnej liczby warstw lub węzłów.
- Węzły PARENT. Podłączone są do węzła ROOT lub PARENT. Nawiązują jednocześnie 0 lub więcej połączeń typu child. Wysyłają lub odbierają komunikaty oraz pośredniczą w przekazywaniu komunikatów dla połączeń typu child.
- Węzły IDLE. Są to węzły, które nie dołączyły do sieci. Spróbują uzyskać połączenia do węzłów typu PARENT, działających w ramach ustalonego ID sieci lub, o ile nastąpi taka konieczność, uzyskać status węzła ROOT.
Formowanie sieci ESP-MESH
Zanim przejdziemy do praktycznej realizacji sieci, przyjrzyjmy się chwilę dwóm użytecznym funkcjom, udostępnianym przez protokół ESP-MESH:
- automatyczne formowanie i konfigurowanie sieci (self-forming),
- automatyczna naprawa sieci w przypadku odłączenia węzła typu ROOT lub PARENT (self-healing).
Proces automatycznego formowania sieci może zostać podzielony na cztery etapy:
- wybór węzła typu ROOT – realizowany w sposób automatyczny lub manualny,
- formowanie drugiej warstwy – proces podłączenia pierwszych węzłów do węzła typu ROOT,
- formowanie kolejnych warstw – proces podłączania kolejnych węzłów IDLE do węzłów PARENT,
- ograniczanie liczby warstw – tworzenie węzłów typu LEAF w przypadku osiągnięcia maksymalnej pojemności sieci lub liczby warstw.
W pierwszym etapie formowania sieci realizowany jest proces wyboru węzła ROOT. Na etapie konfiguracji i kompilacji programu użytkownik może zdecydować, czy proces ten powinien zostać zrealizowany automatycznie (w procesie „wyborów” bazujących na wartości współczynnika RSSI), czy poprzez wskazanie wybranego węzła na etapie kompilacji programu. W pierwszym z przypadków, za pomocą ramek Wi-Fi Beacon, każdy z węzłów IDLE rozsyła rozgłoszeniowo swój adres MAC (będący jednocześnie unikatowym identyfikatorem węzła) oraz wartość współczynnika RSSI, dla połączenia z routerem/bramą dostępową. Jeżeli węzeł stwierdzi, że wartość współczynnika RSSI dla sąsiadującego węzła jest wyższa, wówczas zaczyna przesyłać ramkę „silniejszego” sąsiada. Tak skonstruowane wybory kończą się w chwili osiągnięcia określonej liczby iteracji (bardziej rozbudowane sieci wymagają większej liczby iteracji) i po uzyskaniu przez jeden z węzłów zdefiniowanego „progu wyborczego”, określonego współczynnikiem – liczba zdobytych głosów/liczba głosujących.
Zarówno liczba iteracji, jak i próg mogą zostać skonfigurowane na etapie kompilacji programu. Użytkownik może również dokonać wyboru węzła typu ROOT samodzielnie, poprzez wywołanie w kodzie programu funkcji esp_mesh_set_parent() (dla węzła ROOT) oraz funkcji esp_mesh_fix_root() dla pozostałych węzłów, pomijając tym samym proces głosowania na etapie formowania sieci. Przykładowy wybór węzła ROOT w sposób automatyczny został pokazany na rysunku 5.
Kolejnymi etapami formowania sieci jest organizacja drugiej i kolejnych warstw połączeń. Całość procesu realizowana jest automatycznie w ramach protokołu ESP-MESH. Wybór węzłów PARENT, do których zostaną podłączone węzły IDLE, realizowany jest poprzez wskazanie tzw. Preferred Parent Node – a więc węzłów wybieranych na podstawie aktualnego numeru warstwy, jak i liczby już nawiązanych połączeń typu child. Węzły IDLE preferują węzły PARENT o niższej wartości numeru warstwy. Tak dobrane kryteria wyboru pozwalają zminimalizować liczbę warstw tworzonej sieci. Użytkownik może również w sposób programowy wykonać manualną konfigurację sieci w postaci określenia preferowanych węzłów typu PARENT. Przykład programowej realizacji takiej sieci został przedstawiony w Mesh Manual Networking Example [3]. Przedstawiony powyżej przypadek tworzenia sieci przyjmuje założenie, że wszystkie węzły sieci zostały włączone w tej samej chwili, a w momencie wyboru węzła typu ROOT pozostawały węzłami typu IDLE. W przypadku asynchronicznego dołączenia nowych węzłów do sieci nie jest przeprowadzany nowy proces wyborów nawet w przypadku, gdy nowe węzły mają lepszą wartość współczynnika RSSI. Nowy proces wyborów może zostać rozpoczęty wyłącznie po wywołaniu przez obecny węzeł ROOT funkcji esp_mesh_waive_root().
Piętą achillesową systemów komunikacji, zbudowanych w oparciu na topologii gwiazdy, jest awaria koordynatora, która jest jednoznaczna z utratą komunikacji w całym systemie. W przypadku sieci w architekturze drzewa awaria węzła typu PARENT powoduje utratę łączności wyłącznie z częścią systemu. Rozległość awarii zależy od warstwy, w której obecnie znajduje się węzeł. Natomiast awaria węzła typu ROOT uniemożliwia nawiązanie łączności z siecią przez bramę dostępową. Komunikacja typu węzeł-węzeł wciąż może być realizowana w wybranych fragmentach sieci. W praktycznych realizacjach sieci Mesh węzły często pełnią funkcję urządzeń mobilnych, które mogą okresowo znikać z zasięgu działania sieci. Tym samym programiści protokołu ESP-MESH zdecydowali się zaimplementować funkcje związane z naprawą sieci i udostępnili mechanizmy automatycznego przełączania węzłów typu ROOT oraz PARENT w przypadku ich awarii lub opuszczenia sieci. W przypadku awarii węzła typu ROOT węzły w drugiej warstwie sieci automatycznie wykryją brak koordynatora. Po kilku nieudanych próbach połączenia przeprowadzą wybory nowego węzła ROOT, analogicznie jak w procesie pierwszej konfiguracji sieci, bazując na wartościach współczynnika RSSI. Zbliżony mechanizm zastosowano w przypadku awarii węzłów typu PARENT.
W praktyce
W kolejnej części artykułu opiszemy, jak skonfigurować środowisko esp-idf oraz jak w praktyce realizować proces automatycznej konfiguracji sieci i wymiany danych pomiędzy węzłami w ramach protokołu ESP-MESH. Od strony sprzętowej wykorzystamy do tego celu zestawy deweloperskie ESP32-DEVKITC-32 [4], wyposażone w moduł ESP-WROOM-32D oraz konwerter USB-UART (bazujący na układzie Silabs CP2102).
Całość zmontowana jest na płytce PCB z rastrem wyprowadzeń 2,54 mm – fotografia 1.
Łukasz Skalski
contact@lukasz-skalski.com
Bibliografia:
https://bit.ly/3jO9Zqe
https://bit.ly/2XbOy8P
https://bit.ly/33boD54
Przypisy:
[1] ESP32, 22.07.2020, https://bit.ly/3gfQMvl
[2] ESP-Mesh Programming Guide, 22.07.2020, https://bit.ly/3jO9Zqe
[3] Mesh Manual Networking Example, 22.07.2020, https://bit.ly/2DguxHk
[4] kamami.pl, 22.07.2020, https://bit.ly/2D2n1Qr
[5] Espressif technical documents, 22.07.2020, https://bit.ly/338osY9