Symulowanie sieci Threads przy użyciu OTNS

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

Ilustracja topologii sieci mesh Thread

Thread to oparty na protokole IP bezprzewodowy protokół sieciowy 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 to udostępniona przez Google implementacja protokołu Thread typu open source. Mimo niewielkiego rozmiaru kodu i zajętości 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).

  • 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 Wireshark

Te ćwiczenia z programowania koncentrują 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 Threads Aby zrozumieć, czego nauczysz się w tym module, 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ż powinien 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 instalacja ręczna.
    • Pamiętaj, że Ubuntu 24.04 lub starsze nie obsługują automatycznie Go 1.23. Szczegółowe informacje znajdziesz na stronie Dostępne wersje Golang w dokumentacji Ubuntu. Możliwa jest instalacja ręczna, przy użyciu snap lub 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 instalacja ręczna.

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

Uzyskiwanie kodu OTNS

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

Wszystkie kolejne polecenia konsoli w tym Codelabie są uruchamiane z katalogu otns.

Wczytywanie początkowe i instalacja

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

Okno OTNS-Web na początku

Jeśli w przypadku OTNS-Web widzisz tylko pustą stronę, prawdopodobnie w 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-CLIOTNS-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 OTNS CLI. Nie martw się, w tym laboratorium użyjesz tylko kilku z nich.

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:

Objaśnienie elementów OTNS-Web

5. Dodawanie węzłów

Dodawanie węzłów za pomocą OTNS-CLI

Dodaj router Thread do symulacji:

> add router
1
Done

OTNS-Web powinien być widoczny utworzony węzeł. Węzeł zaczyna działać jako router i po kilku sekundach staje się węzłem głównym:

Jeden węzeł w roli lidera

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:

Sieć Thread z 4 węzłami

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.

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

Dodawanie węzłów przez OTNS-Web

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

Dodano router, łącznie 5 węzłów

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.

Dodano kilka nowych węzłów, łącznie 9 węzłów

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 będą wysyłać wiadomości znacznie częściej niż wcześniej.

Ustaw szybkość symulacji na MAX

> speed max
Done

OTNS stara się symulować jak najszybciej, więc węzły powinny wysyłać dużą liczbę wiadomości.

Wstrzymanie symulacji

> speed 0
Done

Ustawienie prędkości symulacji na 0 wstrzymuje symulację.

Przywracanie symulacji z normalną szybkością

> speed 1
Done

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

Zwolnij symulację

Aby spowolnić symulację, kliknij przycisk Przycisk zmniejszania szybkości.

Wstrzymanie symulacji

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

Wznów symulację

Gdy symulacja jest wstrzymana, kliknij przycisk Przycisk odtwarzania, aby ją wznowić. Przycisk zostanie przywrócony do ustawienia Przycisk wstrzymania.

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 routery (sześciokąty), ewentualnie router graniczny (kwadrat) i wiele urządzeń podrzędnych, a jej szybkość powinna być 10-krotnie większa.

Znajdź obecnego lidera (czerwona ramka) spośród 2 routerów i kliknij go raz, aby go wybrać:

Wybrano sieć Thread z węzłem Leader 1

Wyłącz radio

Kliknij przycisk Przycisk Wyłącz radio 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 router lub router brzegowy stanie się nowym liderem:

Nowa partycja z węzłem 9 jako 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 Przycisk włączania radia na urządzeniu 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 urządzenie główne powinno 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

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 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 oddala się od pozostałych węzłów i tworzy nową partycję.

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ć też nieaktualna informacja o poprzednim połączeniu między routerami węzła 9 i węzła 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:

Węzeł 5 zostaje usunięty z symulacji

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

Wybierz węzeł routera brzegowego 9 i kliknij przycisk Przycisk Usuń na Action Bar, aby usunąć węzeł 9:

Węzeł routera brzegowego 9 został usunięty

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ń interfejsu CLI zmienił się na node 1> , co oznacza bieżący kontekst węzła. Możesz wpisywać polecenia interfejsu OpenThread, które będą wykonywane na węźle tak, jakbyś wchodził z nim w interakcję bezpośrednio.

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ła OpenThread

Domyślnie OTNS generuje szczegółowe pliki logów dla wszystkich symulowanych węzłów OpenThread. Możesz je wyświetlić w ./tmpkatalogu. Nazwa pliku to 0_.log. Poniżej znajduje się przykładowy 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ą dziennika 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ą zapisywane w pliku PCAP current.pcap. Ten plik może być odczytywany przez Wireshark w trakcie symulacji lub po jej zakończeniu. Ze względu na szyfrowanie warstwy łącza w Thread konieczne jest jednorazowe skonfigurowanie Wiresharka, 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.

Zrzut ekranu analizy 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ć na poziomie 0. Następnie kliknij OK i ponownie OK. Teraz plik PCAP OTNS 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 korelowanie wiadomości z dziennika z transmitowanymi lub odbieranymi ramkami radiowymi. Wartości te nie są jednak zwykle identyczne z dokładnością do 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

Gratulacje, udało Ci się przeprowadzić pierwszą symulację OTNS.

Wiesz już, jak zainstalować OTNS i jego zależności. Rozpoczęto symulację OTNS z symulowanymi węzłami OpenThread. Wiesz już, jak na różne sposoby manipulować symulacją za pomocą OTNS-CLIOTNS-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:

Dokumentacja