1. Wprowadzenie

Czym jest Thread i OTNS
Thread to oparty na protokole IP protokół bezprzewodowej sieci kratowej o niskim poborze mocy, który umożliwia bezpieczną komunikację między urządzeniami oraz między urządzeniami a chmurą. Sieci Thread mogą dostosowywać się do zmian topologii, aby uniknąć pojedynczego punktu awarii.
OpenThread to opublikowana przez Google implementacja protokołu Thread typu open source. Pomimo niewielkiego rozmiaru kodu i wykorzystania pamięci OpenThread obsługuje wszystkie funkcje zdefiniowane w specyfikacji Thread.
Symulator sieci OpenThread (OTNS) umożliwia symulowanie sieci Thread przez uruchamianie symulowanych węzłów OpenThread na platformach POSIX. OTNS udostępnia łatwy w obsłudze interfejs internetowy (OTNS-Web) do wizualizacji i obsługi symulowanych sieci Thread. Możliwe są też symulacje skryptowe (w Pythonie).
Czego się nauczysz
- Instalowanie OTNS i jego zależności
- Poznaj podstawy OTNS-CLI
- Jak dodawać, przenosić i usuwać węzły OpenThread w OTNS-Web
- Korzystaj z innych przydatnych funkcji OTNS-Web, aby sterować symulacją sieci.
- Weryfikacja braku pojedynczego punktu awarii w OpenThread
- Wyświetlanie ruchu danych między węzłami OpenThread w Wiresharku
To ćwiczenie koncentruje się na interaktywnym korzystaniu z OTNS-CLI i OTNS-Web. Nie obejmuje to innych funkcji OTNS, takich jak skrypty w Pythonie.
Czego potrzebujesz
- Podstawowe informacje o Thread Aby zrozumieć treści tego ćwiczenia, musisz znać podstawowe pojęcia związane z protokołem Thread.
- Najlepiej Linux x86_64 lub Mac OS z Homebrew. Ubuntu w wersji 24 lub nowszej w WSL2 w systemie Windows również powinna działać, ale może wymagać ręcznego dostosowania ustawień.
- Git
- przeglądarki internetowej, OTNS-Web używa przeglądarki do wyświetlania symulacji.
- Analizator protokołów sieciowych Wireshark (opcjonalnie).
- Go w wersji 1.23 lub nowszej.
- Skrypt instalacji sprawdzi zainstalowaną wersję Go.
- Jeśli Go nie jest zainstalowany, zainstaluje wersję ≥ 1.23, jeśli jest dostępna w menedżerze pakietów.
- Jeśli nie jest dostępny w menedżerze pakietów, wymagana jest ręczna instalacja.
- Pamiętaj, że Ubuntu w wersji 24.04 lub starszej nie obsługuje automatycznie Go 1.23. Szczegóły znajdziesz na stronie Dostępne wersje Golang w dokumentacji Ubuntu. Możliwa jest instalacja ręczna, przy użyciu
snaplub innych procedur.
- Python w wersji 3.9 lub nowszej.
- Skrypt instalacji sprawdzi zainstalowaną wersję Pythona.
- Jeśli Python 3 nie jest jeszcze zainstalowany, zainstaluje wersję >= 3.9, jeśli jest dostępna w menedżerze pakietów.
- Jeśli nie jest dostępny w menedżerze pakietów, wymagana jest ręczna instalacja.
Terminologia
Termin „router” jest używany jako określenie techniczne wzmacniacza sieci Thread Mesh, który początkowo był nazywany routerem Thread. „Węzeł” to dowolne symulowane urządzenie OpenThread w symulacji OTNS.
2. Instalacja
Pobieranie kodu OTNS
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
Wszystkie kolejne polecenia konsoli w tym laboratorium są uruchamiane z katalogu otns.
Wczytywanie początkowe i instalacja
bootstrap Skrypt zainstaluje zależności (w tym Python 3 i Go/Golang, jeśli to konieczne) oraz OTNS. Pamiętaj, że skrypt może się zatrzymać, jeśli nie będzie w stanie automatycznie zainstalować niektórych zależności, np. Pythona w wersji >= 3.9 lub Go w wersji >= 1.23. Automatyczna instalacja wymaga, aby pakiety znajdowały się w skonfigurowanym repozytorium pakietów systemu operacyjnego.
Skrypt tworzy też różne typy węzłów OT, które można wykorzystać bezpośrednio w symulacji, i przeprowadza podstawowe testy. Ze względu na tworzenie węzłów może to potrwać kilka minut.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
Podczas wykonywania skryptu może pojawić się prośba o wpisanie hasła do sudo.
Jeśli otns nie jest prawidłowo zainstalowana
Skrypt może zgłosić błąd, np.:
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
W takim przypadku musisz dodać $(go env GOPATH)/bin do zmiennej $PATH.
W przypadku innych błędów możesz utworzyć zgłoszenie w GitHubie.
3. Pierwsze uruchomienie OTNS
Uruchom otns:
$ otns >_ ← OTNS-CLI prompt
Po pomyślnym uruchomieniu OTNS otworzy konsolę CLI (OTNS-CLI) i przeglądarkę internetową do wizualizacji sieci i zarządzania nią (OTNS-Web):

Jeśli w przypadku OTNS-Web widzisz tylko pustą stronę, prawdopodobnie w Twojej przeglądarce nie jest włączona obsługa WebGL. Informacje o tym, jak włączyć WebGL, znajdziesz na stronie https://superuser.com/a/836833.
W kolejnych sekcjach dowiesz się, jak zarządzać symulacjami OTNS za pomocą OTNS-CLI i OTNS-Web.
4. Poznaj 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 laboratorium użyjesz tylko kilku z tych poleceń.
Wpisz polecenie help, aby wyświetlić przegląd poleceń interfejsu wiersza poleceń. Ta lista jest identyczna z informacjami w dokumentacji interfejsu wiersza poleceń.
> 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, np.:
> 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ą. Zawiera wizualizację węzłów, wiadomości i linków symulowanej sieci Thread. Zwróć uwagę na różne elementy OTNS-Web:

5. Dodawanie węzłów
Dodawanie węzłów za pomocą OTNS-CLI
Dodaj wzmacniacz sieci Mesh (używając typu węzła router) do symulacji:
> add router 1 Done
W OTNS-Web powinien być widoczny utworzony węzeł. Węzeł zaczyna działać jako wzmacniacz sieci Mesh i po kilku sekundach staje się węzłem głównym:

Aby ułatwić interaktywne rozpoczynanie symulacji, każdy nowy węzeł OpenThread jest domyślnie uruchamiany ze standardowym zestawem 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
Poczekaj kilka sekund, aż węzły zostaną połączone w jedną partycję. Węzły powinny być widoczne w OTNS-Web:

W OTNS-Web możesz też wybrać dowolny węzeł, aby wyświetlić panel z dodatkowymi informacjami o nim. Na przykład na rysunku poniżej wybrany jest węzeł 1. Wpis „Rola” w panelu potwierdza, że jest to najlepszy wariant.

Dodawanie węzłów przez OTNS-Web
Węzły możesz też dodawać za pomocą polecenia OTNS-Web. Kliknij przycisk New Router w sekcji Action Bar. Po prawej stronie wybranego węzła powinien pojawić się nowy węzeł. Nowy wzmacniacz Mesh powinien dołączyć do istniejącej partycji Thread:

Możesz też kliknąć przyciski FED, MED, SSED i BR na pasku działań, aby utworzyć inne typy węzłów. Łącznie powinno być teraz 9 węzłów. Jeśli chcesz, przeciągnij niektóre węzły w inne miejsca, aby utworzyć inną fizyczną topologię sieci.

Utworzono sieć Thread z 1 partycją zawierającą wiele węzłów. W następnej sekcji dostosujemy szybkość symulacji, aby ją przyspieszyć.
6. Dostosowywanie szybkości
Symulacja powinna obecnie działać z prędkością 1X, co oznacza, że czas symulacji, który upłynął do tej pory, jest taki sam jak rzeczywisty czas od utworzenia pierwszego węzła.
Dostosowywanie szybkości za pomocą OTNS-CLI
Szybkość symulacji możesz dostosować za pomocą OTNS-CLI.
Ustaw szybkość symulacji na 100X
> speed 100 Done
Węzły powinny wysyłać wiadomości znacznie częściej niż wcześniej.
Ustaw szybkość symulacji na MAX
> speed max Done
OTNS stara się teraz jak najszybciej przeprowadzić symulację, więc węzły powinny wysyłać dużą liczbę wiadomości.
Wstrzymanie symulacji
> speed 0 Done
Ustawienie szybkości symulacji na 0 powoduje wstrzymanie symulacji.
Przywracanie symulacji z normalną szybkością
> speed 1 Done
Ustawienie prędkości symulacji na wartość większą niż 0 spowoduje wznowienie symulacji.
Dostosowywanie szybkości za pomocą OTNS-Web
Przyciski sterowania szybkością
Znajdź przyciski sterowania prędkością
na Action Bar. Przyciski pokazują aktualną szybkość symulacji i można ich używać do dostosowywania szybkości symulacji oraz wstrzymywania i wznawiania symulacji.
Przyspieszanie symulacji
Możesz przyspieszyć symulację, klikając przycisk
, aż prędkość osiągnie MAX:
.
Zwolnij symulację
Aby spowolnić symulację, kliknij przycisk
.
Wstrzymanie symulacji
Aby wstrzymać symulację, kliknij przycisk
. Przycisk zmieni się na
.
Wznów symulację
Gdy symulacja jest wstrzymana, kliknij przycisk
, aby ją wznowić. Przycisk zostanie przywrócony do ustawienia
.
Ustaw szybkość symulacji na 10X
Aby zaoszczędzić czas, użyj
OTNS-CLI dostosować szybkość symulacji do
10X dzięki czemu możemy znacznie szybciej obserwować zmiany topologii sieci.
> speed 10 Done
7. Włączanie i wyłączanie radia
Symulacja powinna teraz zawierać co najmniej 2 wzmacniacze sieci Mesh (sześciokąty), prawdopodobnie router brzegowy (kwadrat) i wiele urządzeń podrzędnych. Działa ona z 10-krotną prędkością.
Znajdź bieżącego lidera (czerwona ramka) 2 wzmacniaczy Mesh i kliknij go raz, aby go wybrać:

Wyłącz radio
Kliknij przycisk
na pasku działań, aby wyłączyć radio węzła głównego. Gdy radio jest wyłączone, Lider nie może wysyłać ani odbierać wiadomości.
Poczekaj około 12 sekund (120 sekund w czasie symulacji), aż inny wzmacniacz sieci Mesh lub router brzegowy stanie się nowym liderem:

Sieć Thread automatycznie odzyskuje sprawność po awarii lidera, tworząc nową partycję z nowym liderem. Nowa partycja ma też nowy kolor.
Włącz radio
Wybierz urządzenie główne, w którym wyłączono radio. Kliknij przycisk
na urządzeniu Action Bar, aby przywrócić łączność radiową:

Po przywróceniu łączności radiowej urządzenie główne powinno ponownie połączyć się z siecią.
8. Przenoszenie węzłów
OTNS umożliwia użytkownikom łatwe przesuwanie węzłów za pomocą OTNS-CLI lub OTNS-Web.
Przenieś węzeł przez OTNS-CLI
Przenieś węzeł routera brzegowego 9 w nowe miejsce:
> move 9 50 50 Done
Przenoszenie węzła za pomocą OTNS-Web
Przesuń węzeł 5 do prawego dolnego rogu, przeciągając go. Ponieważ węzeł 5 jest teraz poza zasięgiem radiowym pozostałych wzmacniaczy Mesh, tworzy własną partycję z nowym identyfikatorem partycji. Identyfikatory partycji można sprawdzić w panelu informacji o węźle, klikając węzły.

Zwróć uwagę, że między węzłem 5 a węzłem 9 nadal jest narysowana jedna zielona linia. Często jest to spowodowane nieaktualnymi informacjami o dziecku, które są nadal przechowywane w tabeli dzieci byłego rodzica. Może to być nieaktualna informacja o poprzednim połączeniu wzmacniacza Mesh między węzłem 9 a węzłem 5. (A może w tym przypadku nawet błąd renderowania). Po upływie odpowiedniego czasu nieaktualne informacje są usuwane z węzłów.
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ł routera brzegowego 9 i kliknij przycisk
na Action Bar, aby usunąć węzeł 9:

Node 1 powinien stać się liderem nowej partycji, a wszystkie pozostałe węzły zostaną 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 programistom diagnozować ich stan. W tym trybie można też inicjować działania dotyczące węzłów.
Włącz tryb kontekstu węzła
Wpisz kontekst węzła 1:
> node 1 Done node 1>
Wiersz poleceń CLI zmienił się na node 1> , co oznacza bieżący kontekst węzła. Możesz wpisywać polecenia interfejsu wiersza poleceń OpenThread, które będą wykonywane na węźle tak, jakbyś wchodził(-a) z nim w bezpośrednią interakcję.
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 na wyjście z kontekstu węzła jest polecenie node 0.
11. Wyświetlanie logów węzłów i przechwytywania pakietów
Logi węzłów OpenThread
Domyślnie OTNS generuje szczegółowe pliki dziennika dla wszystkich symulowanych węzłów OpenThread. Możesz je wyświetlić w ./tmpkatalogu. 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 wyświetlany jest bezwzględny czas symulacji w mikrosekundach. hh:mm:ss sygnatura czasowa pokazuje sygnaturę czasową logu węzła OpenThread, która może się różnić od bezwzględnego czasu symulacji.
Przechwytywanie pakietów Wireshark
Domyślnie wszystkie przesyłane ramki IEEE 802.15.4 są rejestrowane w pliku PCAPcurrent.pcap. Ten plik może być odczytywany przez Wireshark podczas symulacji lub po jej zakończeniu. Ze względu na szyfrowanie warstwy łącza w Thread wymagane jest jednorazowe działanie konfiguracyjne w Wiresharku, aby prawidłowo ustawić klucz odszyfrowywania dla OTNS. Domyślnie używany jest jeden dobrze znany klucz sieciowy, co ułatwia odszyfrowywanie ramek przez Wireshark.
Na zrzucie ekranu poniżej znajdziesz przykład inspekcji pakietów OpenThread w programie Wireshark.

Aby skonfigurować klucz odszyfrowywania, w menu wybierz Edytuj –> Ustawienia. Następnie w oknie preferencji wybierz Protokoły -> IEEE 802.15.4. Kliknij przycisk Edytuj… obok pozycji „Klucze deszyfrujące”. Kliknij +, aby utworzyć nowy wpis, wpisz klucz 00112233445566778899aabbccddeeff (32 znaki) i w polu „Hash klucza” wybierz „Hash wątku”. Wartość „Indeks klucza deszyfrującego” można pozostawić jako 0. Następnie kliknij OK i ponownie OK. Teraz plik OTNS PCAP powinien być prawidłowo odszyfrowywany podczas wczytywania.
Sygnatury czasowe wyświetlane w kolumnie „Time” (w sekundach) odpowiadają bezwzględnym wartościom czasu symulacji wyświetlanym w logach węzła OpenThread. Ułatwia to powiązanie wiadomości z dziennika z transmitowanymi lub odbieranymi ramkami radiowymi. Wartości te nie są jednak zwykle identyczne z dokładnością do pojedynczej mikrosekundy: symulowany sprzęt radiowy IEEE 802.15.4 może dodać pewne dodatkowe opóźnienie po tym, jak stos OpenThread zażąda wysłania ramki radiowej.
12. Gratulacje
Gratulujemy! Udało Ci się przeprowadzić pierwszą symulację OTNS.
Wiesz już, jak zainstalować OTNS i jego zależności. Symulacja OTNS została rozpoczęta z użyciem symulowanych węzłów OpenThread. Wiesz już, jak na różne sposoby manipulować symulacją za pomocą OTNS-CLI i OTNS-Web.
Wiesz już, czym jest OTNS i jak możesz go używać do symulowania sieci OpenThread.
Co dalej?
Wypróbuj te ćwiczenia 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