Symulowanie sieci z wątkiem za pomocą OpenThread

1. Wstęp

26b7f4f6b3ea0700.png

OpenThread udostępniany przez Google to implementacja protokołu open source protokołu sieciowego Thread. Google Nest wprowadziła usługę OpenThread, aby umożliwić deweloperom szeroko dostępną technologię związaną z produktami Nest. Przyspiesza to tworzenie produktów dla domu inteligentnego.

Specyfikacja wątku definiuje w protokole komunikacyjnym między urządzeniami niezawodne, bezpieczne i bezprzewodowe protokół IPv6 na potrzeby aplikacji domowych. OpenThread wdraża wszystkie warstwy sieciowe Thread, w tym IPv6, 6LoWPAN, IEEE 802.15.4 z zabezpieczeniami MAC, ustanowieniem linku w sieci typu mesh i routingiem sieci typu mesh.

Dzięki nim dowiesz się, jak za pomocą symulowania sieci symulować sieć na urządzeniach symulowanych.

Czego się nauczysz

  • Jak skonfigurować łańcuch kompilacji OpenThread
  • Symulowanie sieci z wątkami
  • Jak uwierzytelnić węzły wątku
  • Jak zarządzać siecią z wątkami za pomocą demona OpenThread

Czego potrzebujesz

  • git
  • Podstawowa wiedza na temat systemu Linux i routingu sieci

2. Konfigurowanie systemu kompilacji

Git

Aby ukończyć to ćwiczenia z programowania, musisz mieć Gita. Pobierz ją i zainstaluj, zanim przejdziesz dalej.

Po zainstalowaniu postępuj zgodnie z instrukcjami dla Twojego systemu operacyjnego, aby pobrać i utworzyć OpenThread.

XCode na Mac OS X

Do zainstalowania i stworzenia narzędzia OpenThread na systemie Mac OS X jest wymagany kod XCode.

Po zainstalowaniu XCode uruchom narzędzia wiersza poleceń XCode:

$ xcode-select --install

Kompilacja w systemie Linux / Mac OS X

Te instrukcje instalacji zostały przetestowane na systemie Ubuntu Server 14.04 LTS i Mac OS X Sierra 10.12.6.

Zainstaluj OpenThread. Polecenia bootstrap zapewniają, że łańcuch narzędzi jest zainstalowany i że środowisko jest poprawnie skonfigurowane:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap
$ ./bootstrap

W systemie Windows

Jeśli wolisz system Windows, zalecamy wypróbowanie tej wersji ćwiczeń z Dockera.

3. Tworzenie aplikacji OpenThread

Po zakończeniu instalacji utwórz przykładową aplikację OpenThread. W tym ćwiczeniu z ćwiczeniami z programowania użyjemy przykładu symulacji.

$ cd ~/src/openthread
$ make -f examples/Makefile-simulation

Teraz skompiluj demona OpenThread:

$ cd ~/src/openthread
$ make -f src/posix/Makefile-posix DAEMON=1

4. Symulowanie sieci z wątkami

Przykładowa aplikacja, której użyjesz w ramach tego ćwiczenia z Ćwiczenia z programowania, pokaże minimalną aplikację OpenThread, która udostępnia interfejsy konfiguracji i zarządzania OpenThread za pomocą podstawowego interfejsu wiersza poleceń.

W tym ćwiczeniu trzeba wykonać minimalną liczbę kroków, by wykonać polecenie ping na symulowanym urządzeniu z wątku z innego symulowanego urządzenia.

Poniższa ilustracja przedstawia podstawową topologie sieci. W tym ćwiczeniu zasymulujemy te 2 węzły w zielonym okręgu: lidera w wątku i routera do nici. Między nimi zostanie utworzone połączenie.

6e3aa07675f902dc.png

Pingowanie węzła

1. Uruchom węzeł 1

Przejdź do katalogu openthread i utwórz proces interfejsu wiersza poleceń dla symulowanego urządzenia Thread za pomocą pliku binarnego ot-cli-ftd.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Uwaga: jeśli po uruchomieniu tego polecenia nie widzisz komunikatu >, naciśnij enter.

Ten plik binarny implementuje urządzenie OpenThread symulowane na POSIX. Przewód sterownika IEEE 802.15.4 jest zaimplementowany w połączeniu z protokołem UDP (ramki IEEE 802.15.4 są przekazywane w ładunkach UDP).

Argument 1 to deskryptor pliku reprezentujący najmniej istotne bity „przypisane do fabryki” wg IEEE EUI-64 dla symulowanego urządzenia. Ta wartość jest także używana podczas łączenia z portem UDP na potrzeby emulacji radiowej IEEE 802.15.4 (port = 9000 + deskryptor pliku). Każde wystąpienie symulowanego urządzenia z wątkiem w tym ćwiczeniu z programowania będzie korzystać z innego deskryptora pliku.

Uwaga: podczas tworzenia procesu na symulowanym urządzeniu używaj tylko deskryptorów plików 1 lub większych wymienionych w tym ćwiczeniu. Deskryptor pliku 0 jest zarezerwowany do innych celów.

Utwórz nowy zbiór danych operacyjnych i zatwierdź go jako aktywny. Zbiór danych operacyjnych to konfiguracja tworzonej sieci Thread.

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 20
Channel Mask: 07fff800
Ext PAN ID: d6263b6d857647da
Mesh Local Prefix: fd61:2344:9a52:ede0/64
Network Key: e4344ca17d1dca2a33f064992f31f786
Network Name: OpenThread-c169
PAN ID: 0xc169
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

Zatwierdź ten zbiór danych jako aktywny:

> dataset commit active
Done

Wyświetl interfejs IPv6

> ifconfig up
Done

Uruchom operację protokołu Thread:

> thread start
Done

Zaczekaj kilka sekund i sprawdź, czy urządzenie zostało liderem w wątku. Lider to urządzenie, które służy do zarządzania przypisywaniem identyfikatorów routerów.

> state
leader
Done

Wyświetl adresy IPv6 przypisane do interfejsu wątku 1 w węźle 1 (Twoje dane wyjściowe będą inne):

> ipaddr
fd61:2344:9a52:ede0:0:ff:fe00:fc00
fd61:2344:9a52:ede0:0:ff:fe00:5000
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
fe80:0:0:0:94da:92ea:1353:4f3b
Done

Zwróć uwagę na poszczególne typy adresów IPv6:

  • Zaczyna się od fd = mesh-local
  • Zaczyna się od fe80 = link-local

Rodzaje adresów sieci typu mesh są dodatkowo klasyfikowane:

  • Zawiera ff:fe00 = lokalizator routera (RLOC)
  • Nie zawiera ff:fe00 = identyfikator punktu końcowego (EID)

Zidentyfikuj identyfikator EID w danych wyjściowych w konsoli i zanotuj go do późniejszego użycia. W przykładowym wyniku powyżej identyfikator EID wygląda tak:

fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6

2. Uruchom węzeł 2

Otwórz nowy terminal, przejdź do katalogu openthread i uruchom proces interfejsu wiersza poleceń. To jest Twoje drugie symulowane urządzenie Thread:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

Uwaga: jeśli po uruchomieniu tego polecenia nie widzisz komunikatu >, naciśnij enter.

Skonfiguruj klucz sieciowy IDENTYFIKATOR i identyfikator PAN, korzystając z tych samych wartości, co źródłowy węzeł 1 i #39

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

Zatwierdź ten zbiór danych jako aktywny:

> dataset commit active
Done

Wyświetl interfejs IPv6

> ifconfig up
Done

Uruchom operację protokołu Thread:

> thread start
Done

Urządzenie zainicjuje się jako podmiot podrzędny. Jednostka podrzędna wątku jest odpowiednikiem urządzenia końcowego, które jest urządzeniem wysyłającym i odbierającym ruch jednostronny tylko za pomocą urządzenia nadrzędnego.

> state
child
Done

Zmiana stanu z child na router powinna pojawić się w ciągu 2 minut. Router Threader może kierować ruch między urządzeniami Thread. Nazywany także podmiotem nadrzędnym.

> state
router
Done

Weryfikowanie sieci

Łatwą metodą weryfikacji sieci typu mesh jest przyjrzenie się tabeli routerów.

1. Sprawdź połączenie

W węźle 2 pobierz RLOC16. RLOC16 to ostatnie 16 bitów adresu IPv6 urządzenia RLOC.

> rloc16
5800
Done

W węźle 1 sprawdź tabelę routera pod kątem węzła 2&RL36. Najpierw sprawdź, czy węzeł 2 został przełączony na stan routera.

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC  |
+----+--------+----------+----------+-------+---------+-----+------------------+
| 20 | 0x5000 |       63 |         0 |     0 |      0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |     3 |      3 |  23 | 5a4eb647eb6bc66c |

W tabeli znaleziono RLOC węzła 1 z 0xa800, co potwierdza, że jest ono połączone z siecią typu mesh.

2. Ping – węzeł 1 z węzła 2

Sprawdź połączenie między 2 symulowanymi urządzeniami Thread. W węźle 2 ping jest przypisany identyfikator EID przypisany do węzła 1:

> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
> 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1
hlim=64 time=12ms

Naciśnij enter, aby powrócić do wiersza poleceń >.

Testowanie sieci

Teraz, gdy możesz wykonywać pingi między 2 symulowanymi urządzeniami z wątkami, przetestuj sieć typu mesh, przełączając jeden węzeł offline.

Wróć do węzła 1 i zatrzymaj wątek:

> thread stop
Done

Przełącz się na węzeł 2 i sprawdź stan. W ciągu 2 minut węzeł 2 wykryje, że lider (węzeł 1) jest offline, a przejście węzła 2 powinno być leader sieci:

> state
router
Done
...
> state
leader
Done

Po potwierdzeniu zatrzymaj wątek Thread 2 i przywrócenie ustawień fabrycznych przed zamknięciem. Przywrócimy dane fabryczne, aby mieć pewność, że dane logowania do sieci używane przez ten wątek nie zostaną przeniesione do następnego ćwiczenia.

> thread stop
Done
> factoryreset
>
> exit

Przywróć też ustawienia fabryczne i zamknij węzeł 1:

> factoryreset
>
> exit

Wszystkie dostępne polecenia interfejsu wiersza poleceń znajdziesz w dokumentacji wiersza poleceń OpenThread.

5. Uwierzytelnianie węzłów za pomocą prowizji

W poprzednim ćwiczeniu udało nam się skonfigurować sieć w wątku z 2 symulowanymi urządzeniami i zweryfikowanym połączeniem. Umożliwia to jednak przekazywanie lokalnego urządzenia nieuwierzytelnionego ruchu IPv6 z linkiem. Aby kierować globalny ruch IPv6 między nimi (i z internetu przez router obramowania Thread), węzły muszą być uwierzytelnione.

Aby uwierzytelnić, jedno urządzenie musi działać jako komisarz. Commissioner jest obecnie wybranym serwerem uwierzytelniania w przypadku nowych urządzeń z wątkiem. Autoryzator udostępnia dane logowania do sieci wymagane przez urządzenia do dołączenia do sieci.

W tym ćwiczeniu użyjemy tej samej topologii z dwoma węzłami. W przypadku uwierzytelniania Threader będzie działać jako Komisarz, a router do nici jako połączenie.

d6a67e8a0d0b5dcb.png

1. Utworzenie sieci

Jeśli przejdziesz do poprzedniego ćwiczenia, masz już otwarte 2 okna terminala. Jeśli nie, upewnij się, że dwa są gotowe i gotowe do użycia. Jeden będzie pełnił funkcję węzła 1, a drugiego – węzła 2.

W węźle 1 tworzy proces interfejsu wiersza poleceń:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Uwaga: jeśli po uruchomieniu tego polecenia nie widzisz komunikatu >, naciśnij enter.

Utwórz nowy zbiór danych operacyjnych, zatwierdź go jako aktywny i uruchom wątek:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 12
Channel Mask: 07fff800
Ext PAN ID: e68d05794bf13052
Mesh Local Prefix: fd7d:ddf7:877b:8756/64
Network Key: a77fe1d03b0e8028a4e13213de38080e
Network Name: OpenThread-8f37
PAN ID: 0x8f37
PSKc: f9debbc1532487984b17f92cd55b21fc
Security Policy: 0, onrcb
Done

Zatwierdź ten zbiór danych jako aktywny:

> dataset commit active
Done

Wyświetl interfejs IPv6

> ifconfig up
Done

Uruchom operację protokołu Thread:

> thread start
Done

Zaczekaj kilka sekund i sprawdź, czy urządzenie zostało liderem w wątku:

> state
leader
Done

2. Rozpocznij rolę Komisarza

Nie wychodząc z węzła 1, uruchom rolę Komisarza:

> commissioner start
Done

Zezwalaj na dołączanie każdego uczestnika (z użyciem symbolu wieloznacznego *) za pomocą danych logowania J01NME w celu dołączenia do sieci. Łącznik to urządzenie, które jest dodawane przez zleconego administratora do zleconej sieci Thread.

> commissioner joiner add * J01NME
Done

3. Rozpoczynanie roli Łącznika

W nowym oknie terminalu utwórz nowy proces interfejsu wiersza poleceń. To jest węzeł 2.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

W węźle 2 włącz rolę Łącznik przy użyciu danych logowania J01NME.

> ifconfig up
Done
> joiner start J01NME
Done

... poczekaj kilka sekund w celu potwierdzenia ...

Join success

Urządzenie łączące (węzł 2) uwierzytelniło się w usłudze Komisarz (węzeł 1) i otrzymywało dane logowania do sieci Thread.

Po uwierzytelnieniu węzła 2 uruchom wątek:

> thread start
Done

4. Sprawdź uwierzytelnianie sieci

Sprawdź węzeł state w węźle 2, aby się upewnić, że został on już dołączony do sieci. W ciągu 2 minut węzeł 2 przechodzi z child na router:

> state
child
Done
...
> state
router
Done

5. Resetuj konfigurację

Aby przygotować się do kolejnego ćwiczenia, zresetuj konfigurację. W przypadku każdego węzła zatrzymaj wątek, przywróć ustawienia fabryczne i zamknij symulowane urządzenie Thread:

> thread stop
Done
> factoryreset
>
> exit

Być może trzeba będzie kilka razy nacisnąć enter, aby wyświetlić komunikat > po poleceniu factoryreset.

6. Zarządzanie siecią z demonem OpenThread

W tym ćwiczeniu zasymulujemy jedną instancję interfejsu wiersza poleceń (pojedyncze urządzenie osadzone SoC Thread) i jedno wystąpienie radiowego procesora (RCP).

ot-daemon to tryb aplikacji OpenThread Posix, który używa gniazda UNIX jako źródła danych wejściowych, aby można było uruchomić ją jako usługę. Klient może komunikować się z tą usługą przez połączenie z gniazdem przy użyciu interfejsu wiersza poleceń OpenThread.

ot-ctl to interfejs wiersza poleceń udostępniany przez ot-daemon do zarządzania i konfigurowania RCP. W ten sposób połączysz RCP z siecią utworzoną przez urządzenie Thread.

Użyj demotona

W tym ćwiczeniu zostaną użyte 3 okna terminala:

  1. Instancja CLI symulowanego urządzenia z wątkami (węzeł 1)
  2. ot-daemon proces
  3. ot-ctl instancja interfejsu wiersza poleceń

Jeśli przejdziesz do poprzedniego ćwiczenia, otwórz 2 okna terminala. Otwórz trzecią, aby mieć pewność, że dostępne są 3 okna terminala dla tego ćwiczenia.

1. Uruchom węzeł 1

W pierwszym oknie terminala wywołaj proces interfejsu wiersza poleceń dla symulowanego urządzenia Thread:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Uwaga: jeśli po uruchomieniu tego polecenia nie widzisz komunikatu >, naciśnij enter.

Utwórz nowy zbiór danych operacyjnych, zatwierdź go jako aktywny i uruchom wątek:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 07fff800
Ext PAN ID: 97d584bcd493b824
Mesh Local Prefix: fd55:cf34:dea5:7994/64
Network Key: ba6e886c7af50598df1115fa07658a83
Network Name: OpenThread-34e4
PAN ID: 0x34e4
PSKc: 38d6fd32c866927a4dfcc06d79ae1192
Security Policy: 0, onrcb
Done

Zatwierdź ten zbiór danych jako aktywny:

> dataset commit active
Done

Wyświetl interfejs IPv6

> ifconfig up
Done

Uruchom operację protokołu Thread:

> thread start
Done

Wyświetl adresy IPv6 przypisane do interfejsu wątku 1&#39s:

> ipaddr
fd55:cf34:dea5:7994:0:ff:fe00:fc00
fd55:cf34:dea5:7994:0:ff:fe00:d000
fd55:cf34:dea5:7994:460:872c:e807:c4ab
fe80:0:0:0:9cd8:aab6:482f:4cdc
Done
>

Jak wyjaśniliśmy w ramach kroku Symulowanie sieci wątków, jeden adres to „link lokalny” (fe80), a trzy to „siatka lokalna” (fd). Identyfikator EID to adres lokalny typu mesh, który nie zawiera ff:fe00 w adresie. W tym przykładowym pliku EID widać fd55:cf34:dea5:7994:460:872c:e807:c4ab.

Określ identyfikator EID z danych wyjściowych ipaddr, który będzie używany do komunikacji z węzłem.

2. Uruchom demoton

W 2 oknie terminala przejdź do katalogu openthread i uruchom ot-daemon dla węzła RCP, który nazywamy Node 2. Użyj flagi szczegółowej -v, aby wyświetlić dane wyjściowe dziennika i potwierdzić, że jest ono uruchomione:

$ cd ~/src/openthread
$ ./output/posix/bin/ot-daemon -v \
    'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'

Po udanym działaniu ot-daemon w trybie szczegółowego generuje dane wyjściowe podobne do tych:

ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun 7 2020 18:05:15
ot-daemon[228024]: Thread version: 2
ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun 7 2020 18:06:08

Zostaw ten terminal otwarty i działaj w tle. Nie będziesz już wpisywać żadnych poleceń.

3. Aby dołączyć do sieci, użyj OT-Ctrl

Jeszcze nie zleciliśmy węzła 2 (RCP ot-daemon) w żadnej sieci Thread. Tutaj zaczyna się ot-ctl. ot-ctl używa tego samego interfejsu wiersza poleceń co aplikacja OpenThread CLI. Dlatego możesz sterować ot-daemon węzłami tak samo jak inne symulowane urządzenia Thread.

W oknie trzeciego terminala uruchom ot-ctl:

$ ./output/posix/bin/ot-ctl
>

Do zarządzania węzłem 2 (węzłem RCP) rozpoczętym w drugim oknie terminalu z ot-daemon użyj ot-ctl. Sprawdź state węzła 2:

> state
disabled
Done

Aby ograniczyć dołączanie do określonego złącza, pobierz węzeł eui64 2 i 39:

> eui64
18b4300000000001
Done

W węźle 1 (okno pierwszego terminala) uruchom narzędzie Commissioner i ogranicz dostęp tylko do tego interfejsu API:

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

W węźle 2 (trzecim oknie terminala) wyświetl interfejs sieci i dołącz do sieci:

> ifconfig up
Done
> joiner start J01NME
Done

... poczekaj kilka sekund w celu potwierdzenia ...

Join success

RCP (Node 2) – organizacja łącząca się, uwierzytelniła się w usłudze Commissioner (Node 1) i odebrała dane logowania Thread Network.

Teraz połącz węzeł 2 z siecią Thread:

> thread start
Done

4. Sprawdź uwierzytelnianie sieci

Sprawdź węzeł state w węźle 2, aby się upewnić, że został on już dołączony do sieci. W ciągu 2 minut węzeł 2 przechodzi z child na router:

> state
child
Done
...
> state
router
Done

5. Sprawdź połączenie

Zamknij polecenie ot-ctl, używając polecenia Ctrl+D lub exit, a następnie z poziomu wiersza poleceń komputera hosta, pingując węzeł 1, podając jego identyfikator EID za pomocą polecenia ping6. Jeśli instancja RCP ot-daemon zostanie połączona z siecią Thread i komunikuje się z nią, ping się powiedzie:

$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab
PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms
--- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms

7. Gratulacje!

Udało Ci się zasymulować pierwszą sieć Threading za pomocą OpenThread. Świetnie!

Dzięki nim dowiesz się, jak:

  • Konfigurowanie łańcucha kompilacji OpenThread
  • Symulowanie sieci z wątkami
  • Uwierzytelnianie węzłów wątku
  • Zarządzanie siecią wątku z demonem OpenThread

Więcej informacji znajdziesz tutaj: