Symulowanie sieci Threads przy użyciu OTNS

Informacje o tym ćwiczeniu (w Codelabs)
schedule30 minut
subjectOstatnia aktualizacja: 15 maja 2025
account_circleAutorzy: Simon Lin, Colin Tan, Esko Dijk

1. Wprowadzenie

Topologia sieci typu mesh Thread

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):

Okno OTNS-Web na początku

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-CLIOTNS-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:

OTNS-Web elements explained

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:

1 węzeł w roli lidera

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:

Sieć Thread z 4 węzłami

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.

Sieć Thread z 4 węzłami, węzeł 1 jest wybrany

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:

Dodano router, w sumie 5 węzłów

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.

Dodano kilka nowych węzłów, w sumie 9

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ą Przyciski sterowania szybkoś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 Przycisk zwiększania prędkości, aż prędkość osiągnie wartość MAX: Wskaźnik prędkości symulacji MAX.

Symulacja spowolnienia

Możesz zwolnić symulację, klikając przycisk Przycisk zmniejszania prędkości.

Wstrzymanie symulacji

Aby wstrzymać symulację, gdy jest uruchomiona, kliknij przycisk Przycisk wstrzymania. Przycisk zmieni się na Przycisk odtwarzania.

Wznawianie symulacji

Aby wznowić symulację, gdy jest wstrzymana, kliknij przycisk Przycisk odtwarzania. Przycisk zostanie przywrócony do ustawienia Przycisk wstrzymania.

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ć:

Sieć Thread z wybranym węzłem docelowym 1

Wyłącz radio

Aby wyłączyć radio w węźle lider, kliknij przycisk Przycisk Wyłącz 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:

Nowa partycja jest tworzona z węzłem 9 jako 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 Przycisk włączenia na Action Bar, aby przywrócić łączność radiową:

Węzeł 1 dołącza do partycji po ponownym włączeniu radia

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.

Węzeł 5 jest oddalany od pozostałych węzłów i tworzy nową partycję

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:

Węzeł 5 został usunięty z symulacji

Usuwanie węzłów za pomocą OTNS-Web

Wybierz węzeł Border Router 9 i kliknij przycisk Przycisk Usuń przy Action Bar, aby usunąć węzeł 9:

Węzeł Border Router 9 został usunięty

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_.log. 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.

Zrzut ekranu przedstawiający analizę 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-CLIOTNS-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…

Dokumenty referencyjne