1. Wprowadzenie
Co to jest Thread i OTNS
Thread to protokół sieci bezprzewodowej typu mesh o niskim poborze mocy, który umożliwia bezpieczną komunikację między urządzeniami i między urządzeniami a chmurą. Sieci Thread mogą dostosowywać się do zmian topologii, aby uniknąć pojedynczego punktu awarii.
OpenThread, udostępniony przez Google, to implementacja Thread typu open source. Pomimo niewielkiego rozmiaru kodu i zajętego miejsca w pamięci OpenThread obsługuje wszystkie funkcje określone w specyfikacji Thread.
OpenThread Network Simulator (OTNS) może służyć do symulowania sieci Thread przez uruchamianie symulowanych węzłów OpenThread na platformach POSIX. OTNS udostępnia łatwy w użyciu interfejs internetowy (OTNS-Web) do wizualizacji i obsługi symulowanych sieci Thread. Możliwe są też symulacje z wykorzystaniem skryptów (w Pythonie).
Czego się nauczysz
- Instalowanie OTNS i jego zależności
- Poznaj podstawy programu OTNS-CLI
- Dodawanie, przenoszenie i usuwanie węzłów OpenThread w OTNS-Web
- Korzystanie z innych przydatnych funkcji OTNS-Web do kontrolowania symulacji sieci
- Sprawdzanie, czy OpenThread nie ma pojedynczego punktu awarii
- Wyświetlanie ruchu danych między węzłami OpenThread w Wireshark
To ćwiczenie z programowania koncentruje się na narzędziach OTNS-CLI i OTNS-Web do użytku interaktywnego. Inne funkcje OTNS, takie jak skrypty Pythona, nie są objęte.
Czego potrzebujesz
- Najlepiej Linux x86_64 lub Mac OS z Homebrew. Ubuntu 22/24 w Windows WSL2 też powinno działać, ale może wymagać ręcznego dostosowania ustawień.
- Git.
- przeglądarka internetowa, OTNS-Web używa przeglądarki internetowej do wyświetlania symulacji.
- Informacje podstawowe dotyczące wątku. Aby zrozumieć, czego dotyczy ten samouczek, musisz znać podstawowe pojęcia związane z wątkiem.
Terminologia
Termin „Router” jest używany jako termin techniczny dla rozszerzacza sieci Mesh Thread, który początkowo nazywał się routerem Thread. „Węzeł” odnosi się do dowolnego symulowanego urządzenia OpenThread w symulacji OTNS.
2. Instalacja
Uzyskiwanie kodu OTNS
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
Wszystkie kolejne polecenia konsoli w tym Codelab są wykonywane z katalogu otns
.
Wczytywanie i instalowanie
Skrypt bootstrap
zainstaluje zależności (w tym Pythona 3 i Go/Golang w razie potrzeby) oraz zainstaluje OTNS. Generuje też różne typy węzłów OT, które można używać bezpośrednio w symulacji, oraz wykonuje podstawowe testy. Ze względu na kompilację węzła może to potrwać kilka minut.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
Może pojawić się prośba o podanie hasła do sudo
.
Jeśli aplikacja otns
nie jest prawidłowo zainstalowana
Skrypt może zgłosić błąd:
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
W tym przypadku musisz dodać $(go env GOPATH)/bin
do $PATH.
W przypadku innych błędów możesz utworzyć problem na GitHubie.
3. Pierwsze uruchomienie usługi OTNS
Uruchamianie otns
:
$ otns >_ ← OTNS-CLI prompt
Po uruchomieniu OTNS otworzy konsolę wiersza poleceń (OTNS-CLI
) i uruchomi przeglądarkę internetową do wizualizacji sieci i zarządzania nią (OTNS-Web
):
Jeśli widzisz tylko pustą stronę w przypadku usługi OTNS-Web, prawdopodobnie WebGL nie jest włączony w Twojej przeglądarce. Aby dowiedzieć się, jak włączyć WebGL, odwiedź stronę https://superuser.com/a/836833.
W następnych sekcjach dowiesz się, jak zarządzać symulowanymi danymi OTNS za pomocą funkcji OTNS-CLI
i OTNS-Web
.
4. Poznaj narzędzia OTNS-CLI i OTNS-Web
OTNS-CLI
OTNS-CLI
to interfejs wiersza poleceń (CLI) do zarządzania symulacjami OTNS.
$ otns >_ ← OTNS-CLI prompt
Możesz wpisywać polecenia za pomocą OTNS-CLI
. Pełną listę poleceń znajdziesz w dokumentacji interfejsu wiersza poleceń OTNS. Nie martw się, w tym Codelab użyjesz tylko kilku z tych poleceń.
Aby uzyskać przegląd poleceń CLI, wpisz polecenie help
. Ta lista jest identyczna z listą referencyjną w CLI.
> help add Add a node to the simulation and get the node ID. .... .... Done >
Aby uzyskać więcej informacji o konkretnym poleceniu, użyj jego nazwy, na przykład:
> help add add Add a node to the simulation and get the node ID. Definition: .... .... >
OTNS-Web
OTNS-Web
to narzędzie OTNS do wizualizacji sieci i zarządzania nią. Pokazuje wizualnie węzły, wiadomości i połączenia symulowanej sieci Thread. Zwróć uwagę na różne elementy OTNS-Web
:
5. Dodawanie węzłów
Dodawanie węzłów za pomocą narzędzia OTNS-CLI
Dodaj router wątków do symulacji:
> add router 1 Done
Powinien zostać utworzony węzeł w OTNS-Web
. Węzeł zaczyna działać jako router i w ciągu kilku sekund staje się liderem:
Aby ułatwić interaktywne uruchamianie symulacji, każdy nowy węzeł OpenThread jest domyślnie konfigurowany za pomocą standardowego zestawu parametrów sieci.
Dodaj więcej węzłów za pomocą OTNS-CLI
Teraz dodamy kilka węzłów różnych typów.
> add fed 2 Done > add med 3 Done > add sed 4 Done
Zaczekaj kilka sekund, aż węzły połączą się w jedną partycję. W folderze OTNS-Web
powinny się wyświetlać węzły:
W panelu OTNS-Web
możesz też wybrać dowolny węzeł, aby wyświetlić więcej informacji o nim. Na przykład na rysunku poniżej wybrano węzeł 1. Wpis „Rola” w panelu potwierdza, że jest to lider.
Dodawanie węzłów przez OTNS-Web
Możesz też dodawać węzły za pomocą polecenia OTNS-Web
. Kliknij przycisk New Router
w sekcji Action Bar
. Po prawej stronie wybranego węzła powinien zostać utworzony węzeł. Nowy router powinien dołączyć do istniejącej partycji Thread:
Aby utworzyć inne typy węzłów, na pasku działań kliknij też przyciski FED, MED, SSED i BR. Teraz powinno być łącznie 9 węzłów. Jeśli chcesz, przeciągnij niektóre węzły w inne miejsca, aby utworzyć inną topologię fizycznej sieci.
Utworzono sieć Thread z 1 partycją zawierającą wiele węzłów. W następnej sekcji dostosujemy szybkość symulacji, aby przyspieszyć jej działanie.
6. Dostosowywanie szybkości
Obecnie symulacja powinna być uruchamiana z prędkością 1X
, co oznacza, że upłynął taki sam czas symulacji jak rzeczywisty czas od utworzenia pierwszego węzła.
Dostosowywanie szybkości za pomocą OTNS-CLI
Szybkość symulacji możesz dostosować w sekcji OTNS-CLI
.
Ustaw szybkość symulacji na 100X
> speed 100 Done
Powinny one wysyłać wiadomości znacznie częściej niż wcześniej.
Ustaw szybkość symulacji na MAX
> speed max Done
Teraz OTNS próbuje jak najszybciej symulować, więc powinieneś/powinnaś zobaczyć węzły wysyłające dużą liczbę wiadomości.
Wstrzymanie symulacji
> speed 0 Done
Ustawienie szybkości symulacji na 0
powoduje wstrzymanie symulacji.
Przywracanie symulacji do normalnej szybkości
> speed 1 Done
Ustawienie szybkości symulacji na wartość większą niż 0
powoduje wznowienie symulacji.
Dostosowywanie szybkości za pomocą OTNS-Web
Przyciski sterowania szybkością
Znajdź przyciski sterowania prędkością na
Action Bar
. Przyciski pokazują bieżącą szybkość symulacji i można ich używać do dostosowywania szybkości symulacji oraz do wstrzymywania i wznawiania symulacji.
przyspieszyć symulację,
Możesz przyspieszyć symulację, klikając przycisk , aż prędkość osiągnie wartość
MAX
: .
Symulacja spowolnienia
Możesz zwolnić symulację, klikając przycisk .
Wstrzymanie symulacji
Aby wstrzymać symulację, gdy jest uruchomiona, kliknij przycisk . Przycisk zmieni się na
.
Wznawianie symulacji
Aby wznowić symulację, gdy jest wstrzymana, kliknij przycisk . Przycisk zostanie przywrócony do ustawienia
.
Ustaw szybkość symulacji na 10X
Aby zaoszczędzić czas, użyj
OTNS-CLI
, aby dostosować prędkość symulacji do
10X
abyśmy mogli szybciej obserwować zmiany topologii w sieci.
> speed 10 Done
7. Włączanie i wyłączanie radia
Symulacja powinna zawierać co najmniej 2 Routery (w kształcie sześciokąta), ewentualnie Router graniczny (w kształcie kwadratu) i wiele elementów podrzędnych. Symulacja powinna działać z 10-krotnie większą prędkością.
Znajdź obecnego lidera (oznaczonego czerwoną obwódką) 2 routerów i kliknij go, aby go wybrać:
Wyłącz radio
Aby wyłączyć radio w węźle lider, kliknij przycisk na pasku działań. Gdy radio jest wyłączone, lider nie będzie mógł wysyłać ani odbierać wiadomości.
Zaczekaj około 12 s (120 s w czasie symulacji), aż inny router lub router brzegowy stanie się nowym liderem:
Sieć wątku automatycznie odzyskuje się po awarii lidera, tworząc nową partycję z nowym liderem. Nowa partycja ma też nowy kolor.
Włącz radio
Wybierz lidera, którego radio zostało wyłączone. Kliknij przycisk na
Action Bar
, aby przywrócić łączność radiową:
Po przywróceniu łączności radiowej lider powinien ponownie połączyć się z siecią.
8. Przenoszenie węzłów
OTNS umożliwia użytkownikom łatwe przenoszenie węzłów za pomocą OTNS-CLI
lub OTNS-Web
.
Przenieś węzeł przez OTNS-CLI
Przesuń węzeł 9 (Border Router) w nowe miejsce:
> move 9 50 50 Done
Przenoszenie węzła za pomocą interfejsu OTNS-Web
Przeciągnij węzeł 5 w prawy dolny róg. Ponieważ węzeł 5 jest teraz poza zasięgiem radiowym innych routerów, tworzy własną partycję z nowym identyfikatorem partycji. Identyfikatory partycji można sprawdzić w panelu informacji o węźle, klikając węzły.
Pamiętaj, że między węzłem 5 a węzłem 9 nadal jest rysowana pojedyncza zielona linia. Jest to często spowodowane nieaktualnymi informacjami o dziecku, które są nadal przechowywane w tabeli podrzędnej poprzedniego rodzica. Może to być też nieaktualna informacja o poprzednim połączeniu router-router między węzłem 9 a węzłem 5. (W tym przypadku może to być nawet błąd renderowania). Ostatecznie nieaktualne informacje są usuwane z węzłów po upływie odpowiedniego limitu czasu.
9. Usuwanie węzłów
Usuwanie węzłów za pomocą OTNS-CLI
Usuń węzeł 5:
> del 5 Done
Węzeł 5 powinien zniknąć z symulacji:
Usuwanie węzłów za pomocą OTNS-Web
Wybierz węzeł Border Router 9 i kliknij przycisk przy
Action Bar
, aby usunąć węzeł 9:
Node 1
powinien stać się liderem nowej partycji, a wszystkie pozostałe węzły powinny zostać dołączone jako węzły podrzędne do węzła 1.
10. Kontekst węzła OTNS-CLI
OTNS-CLI
udostępnia tryb kontekstu węzła, który ułatwia interakcję z węzłami i pomaga deweloperom w diagnozowaniu stanu węzła. W tym trybie można też inicjować działania węzła.
Włącz tryb kontekstu węzła
Wpisz kontekst węzła 1:
> node 1 Done node 1>
Prompt w CLI zmienił się na node 1>
, co wskazuje na bieżący kontekst węzła. Możesz wpisać polecenia OpenThread CLI, które zostaną wykonane na węźle tak, jakbyś bezpośrednio z nim współpracował.
Wykonywanie poleceń w kontekście węzła
node 1> state leader Done node 1> channel 11 Done node 1> panid 0xface Done node 1> networkname otns Done node 1> ipaddr fdde:ad00:beef:0:0:ff:fe00:fc00 fdde:ad00:beef:0:0:ff:fe00:b400 fd00:f00d:cafe:0:2505:8719:3685:ebfb fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb fe80:0:0:0:e86a:e07:ec97:777 Done
Przełączanie się na inny kontekst węzła
node 1> node 2 Done node 2>
Kontekst węzła wyjściowego
node 1> exit Done >
Alternatywnym sposobem wyjścia z kontekstu węzła jest komenda node 0
.
11. Wyświetlanie logów węzła i przechwyconych pakietów
Logi węzła OpenThread
Domyślnie OTNS generuje szczegółowe pliki dziennika dla wszystkich symulowanych węzłów OpenThread. Informacje te znajdziesz w katalogu ./tmp
. Nazwa pliku to 0_
. Poniżej znajduje się fragment pliku dziennika:
7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-: src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6 | ..&..!.eSZCN.Y. |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-: src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---: 12 0x3000 - me - leader
Po lewej stronie podany jest bezwzględny czas symulacji w mikrosekundach. Znak czasu hh:mm:ss
pokazuje własny znacznik czasu dziennika węzła OpenThread, który może różnić się od bezwzględnego czasu symulacji.
Przechwytywanie pakietów za pomocą Wireshark
Domyślnie wszystkie przesłane ramki IEEE 802.15.4 są rejestrowane w pliku PCAP current.pcap
. Plik ten może być odczytywany przez Wireshark podczas symulacji lub po jej zakończeniu. Ze względu na szyfrowanie na poziomie łącza w Thread konieczne jest jednorazowe skonfigurowanie w Wireshark, aby prawidłowo ustawić klucz odszyfrowywania dla OTNS. Domyślnie używany jest jeden dobrze znany klucz sieciowy, aby ułatwić odszyfrowywanie ramki przez Wireshark.
Poniżej znajdziesz zrzut ekranu pokazujący przykład kontroli pakietów OpenThread w Wireshark.
Aby skonfigurować klucz odszyfrowywania, w menu kliknij Edytuj -> Ustawienia. Następnie w oknie ustawień wybierz Protokoły > IEEE 802.15.4. Kliknij przycisk Edytuj… obok opcji „Klucze deszyfrujące”. Kliknij +, aby utworzyć nowy wpis, a następnie wpisz klucz 00112233445566778899aabbccddeeff
(32 znaki) i w polu „Hash klucza” wybierz „Hash wątku”. „Indeks klucza deszyfrującego” może pozostać ustawiony na 0
. Następnie kliknij OK, a następnie ponownie kliknij OK. Teraz plik PCAP OTNS powinien być prawidłowo odszyfrowany po załadowaniu.
Czasy stemplowania pokazane w kolumnie „Czas” (w sekundach) odpowiadają wartościom bezwzględnego czasu symulacji pokazanym w logach węzła OpenThread. Ułatwia to korelację komunikatów dziennika z ramkami radiowymi wysyłanymi lub odbieranymi. Wartości te nie są jednak zwykle identyczne z dokładnością do pojedynczej mikrosekundy: symulowane komponenty radiowe IEEE 802.15.4 mogą powodować dodatkowe opóźnienie po wysłaniu żądania przesłania ramki radiowej przez stos OpenThread.
12. Gratulacje
Gratulacje, udało Ci się wykonać pierwszą symulację OTNS.
Wiesz już, jak zainstalować OTNS i jego zależności. Symulacja OTNS została uruchomiona z węzłami symulowanymi OpenThread. Poznaliśmy już różne sposoby manipulowania symulacją za pomocą funkcji OTNS-CLI
i OTNS-Web
.
Wiesz już, czym jest OTNS i jak możesz go używać do symulowania sieci OpenThread.
Co dalej?
Zapoznaj się z tymi ćwiczeniami z programowania…
- Symulowanie sieci Thread za pomocą OpenThread
- Symulowanie sieci Thread za pomocą OpenThread w Dockerze
- Tworzenie sieci Thread za pomocą płytek nRF52840 i OpenThread