1. Wprowadzenie
Czym są Thread i OTNS
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).
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 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
):
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-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 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
:
5. Dodawanie węzłów
Dodawanie węzłów za pomocą OTNS-CLI
Dodaj router Thread do symulacji:
> add router 1 Done
W 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:
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 Action Bar
. Po prawej stronie wybranego węzła powinien pojawić się nowy węzeł. Nowy router 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 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ą 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 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ć:
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 router 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 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.
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:
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ń 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 ./tmp
katalogu. Nazwa pliku to 0_
. 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.
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-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