Tworzenie sieci Thread z kartami nRF52840 i OpenThread

1. Wprowadzenie

26b7f4f6b3ea0700.png

Opublikowana przez Google implementacja OpenThread to implementacja protokołu sieciowego Thread® typu open source. Firma Google Nest udostępniła rozwiązanie OpenThread, aby udostępnić deweloperom technologię wykorzystywaną w produktach Nest i przyspieszyć proces opracowywania produktów do domów inteligentnych.

Specyfikacja Thread definiuje oparty na protokole IPv6 niezawodny, bezpieczny i oszczędny, bezprzewodowy protokół komunikacyjny między urządzeniami domowymi. OpenThread implementuje wszystkie warstwy sieciowe Thread, w tym IPv6, 6LoWPAN, IEEE 802.15.4 z zabezpieczeniami MAC, ustanowieniem linku mesh i routingiem sieci typu mesh.

W ramach tego ćwiczenia w Codelabs zaprogramujesz OpenThread na prawdziwym sprzęcie, utworzysz sieć Thread i nią zarządzasz, a także przekażesz komunikaty między węzłami.

4806d16a8c137c6d.jpeg

Czego się nauczysz

  • Tworzenie i migracja plików binarnych interfejsu wiersza poleceń OpenThread do tablic deweloperskich
  • Tworzenie RCP składającego się z komputera z systemem Linux i płytki programistycznej
  • Komunikacja z RCP przy użyciu demona OpenThread i ot-ctl
  • Ręczne zarządzanie węzłami Thread za pomocą GNU Screen i interfejsu OpenThread CLI
  • Bezpieczne uruchamianie urządzeń w sieci Thread
  • Jak działa multicast IPv6
  • Przekazywanie wiadomości między węzłami wątków przy użyciu protokołu UDP

Czego potrzebujesz

Sprzęt:

  • 3 płytki deweloperskie Nordic Semiconductor nRF52840
  • 3 kable USB na micro USB do połączenia tablic
  • Komputer z systemem Linux i co najmniej 3 portami USB.

Oprogramowanie:

  • Łańcuch narzędzi GNU
  • Narzędzia wiersza poleceń Nordic nRF5x
  • Oprogramowanie Segger J-Link
  • OpenThread
  • Git

2. Pierwsze kroki

Symulacja OpenThread

Zanim zaczniesz, możesz zapoznać się z ćwiczeniem z programowania symulacji OpenThread, aby zapoznać się z podstawowymi pojęciami dotyczącymi Thread i interfejsem wiersza poleceń OpenThread.

Złącza portów szeregowych

Musisz wiedzieć, jak połączyć się z portem szeregowym przez terminal. Ćwiczenia z programowania korzystają z aplikacji GNU Screen i zawierają ogólne informacje o użytkowaniu aplikacji, ale można w nich używać dowolnego innego oprogramowania terminala.

Komputer z systemem Linux

To ćwiczenia z programowania zostały opracowane z myślą o użyciu maszyny z systemem i386 lub x86 z systemem Linux, która pełni funkcję hosta urządzenia z procesorem koprocesorowym (RCP) Thread i do obsługi we wszystkich płytach deweloperskich Thread. Wszystkie kroki zostały przetestowane w systemie Ubuntu 14.04.5 LTS (Trusty Tahr).

Płyty skandynawskie półprzewodnikowe nRF52840

W tym ćwiczeniu z programowania używane są 3 płyty PDK nRF52840.

a6693da3ce213856.png

Do programowania płyt nRF52840, które mają moduły JTAG, używamy SEGGER J-Link. Zainstaluj je na komputerze z systemem Linux.

Pobierz odpowiedni pakiet dla swojego komputera i zainstaluj go w odpowiednim miejscu. W Linuksie jest to /opt/SEGGER/JLink.

Zainstaluj narzędzia wiersza poleceń nRF5x

Narzędzia wiersza poleceń nRF5x umożliwiają flashowanie plików binarnych OpenThread na płytkach nRF52840. Zainstaluj odpowiednią wersję nRF5x-Command-Line-Tools-<OS> na komputerze z Linuksem.

Umieść wyodrębniony pakiet w folderze głównym ~/

Instalowanie łańcucha narzędzi ARM GNU Toolchain

Do tworzenia obiektów używa się łańcucha narzędzi ARM GNU Toolchain.

Zalecamy umieszczenie wyodrębnionego archiwum w folderze /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ na komputerze z systemem Linux. Aby przeprowadzić instalację, postępuj zgodnie z instrukcjami w pliku readme.txt archiwum.

Zainstaluj ekran (opcjonalnie)

Screen to proste narzędzie do uzyskiwania dostępu do urządzeń połączonych przez port szeregowy. Te ćwiczenia w Codelabs korzystają z aplikacji Screen, ale możesz użyć dowolnej aplikacji terminala z portami szeregowymi.

$ sudo apt-get install screen

3. Klonowanie repozytoriów

OpenThread

Skopiuj i zainstaluj OpenThread. Polecenia script/bootstrap pozwalają sprawdzić, czy łańcuch narzędzi jest zainstalowany, a środowisko jest prawidłowo skonfigurowane:

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

Skompiluj demona OpenThread:

$ script/cmake-build posix -DOT_DAEMON=ON

Teraz możesz utworzyć i zainstalować OpenThread na płytkach nRF52840.

4. Konfigurowanie łączenia RCP

Tworzenie i flashowanie

Utwórz przykład OpenThread nRF52840 z użyciem Joiner i natywnej funkcji USB. Urządzenie używa roli Łącznik, aby bezpiecznie uwierzytelniać się i wysyłać do sieci Thread. Natywny interfejs USB umożliwia używanie USB CDC ACM jako łącza szeregowego między nRF52840 a hostem.

Zawsze najpierw czyść repozytorium wcześniejszych kompilacji, uruchamiając rm -rf build.

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

Przejdź do katalogu z plikiem binarnym RCP OpenThread i przekonwertuj go na format szesnastkowy:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

Podłącz kabel USB do portu debugowania micro USB obok zewnętrznego styku zasilania na płytce nRF52840, a następnie do komputera z systemem Linux. Ustaw przełącznik źródła zasilania nRF na płytce nRF52840 na VDD. Po prawidłowym podłączeniu dioda LED5 się świeci.

20a3b4b480356447.png

Jeśli jest to pierwsza płyta podłączona do komputera z systemem Linux, będzie ona wyświetlana jako port szeregowy /dev/ttyACM0 (wszystkie płytki nRF52840 używają identyfikatora ttyACM jako identyfikatora portu szeregowego).

$ ls /dev/ttyACM*
/dev/ttyACM0

Zapisz numer seryjny płytki nRF52840 używanej na potrzeby RCP:

c00d519ebec7e5f0.jpeg

Przejdź do lokalizacji narzędzi wiersza poleceń nRFx i prześlij plik szesnastkowy OpenThread RCP na płytkę nRF52840, podając jej numer seryjny. Pamiętaj, że jeśli pominiesz flagę --verify, zobaczysz ostrzeżenie z informacją, że proces Flash może zakończyć się niepowodzeniem bez błędów.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

Po pomyślnym zakończeniu generowania zostaną wygenerowane te dane wyjściowe:

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

Oznacz tablicę jako „RCP”. aby później nie pomylić ról na tablicy.

Połącz z natywnym portem USB

Kompilacja RCP OpenThread umożliwia użycie natywnego interfejsu USB CDC ACM jako transportu szeregowego, dlatego do komunikowania się z hostem RCP (na komputerze z systemem Linux musisz używać portu nRF USB na płytce nRF52840).

Odłącz końcówkę micro USB kabla USB od portu debugowania płytki nRF52840, a następnie podłącz ją z powrotem do portu micro-USB nRF USB obok przycisku RESETUJ. Ustaw przełącznik źródła zasilania nRF na USB.

46e7b670d2464842.png

Uruchom demona OpenThread

W projekcie RCP używaj Demon OpenThread do komunikacji z urządzeniem Thread i zarządzania nim. Rozpocznij polecenie ot-daemon od flagi szczegółowej -v, aby wyświetlić dane wyjściowe dzienników i sprawdzić, czy są uruchomione:

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'

Jeśli operacja się uda, ot-daemon w trybie szczegółowym generuje dane wyjściowe podobne do tych:

ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05
ot-daemon[12463]: Thread version: 4
ot-daemon[12463]: Thread interface: wpan0
ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10

Pozostaw to okno terminala otwarte, aby można było wyświetlać logi z ot-daemon.

Użyj ot-ctl do komunikacji z węzłem RCP. ot-ctl używa tego samego interfejsu wiersza poleceń co aplikacja interfejsu wiersza poleceń OpenThread. Dlatego możesz sterować ot-daemon węzłami w taki sam sposób jak w przypadku innych symulowanych urządzeń Thread.

W drugim oknie terminala uruchom ot-ctl:

$ sudo ./build/posix/src/posix/ot-ctl
>

Sprawdź state w węźle 2 (węzła RCP), który został uruchomiony dla ot-daemon:

> state
disabled
Done

5. Konfiguracja punktów początkowych

Pozostałe 2 węzły Thread używane w tym ćwiczeniu to urządzenia w pełni wątkowe (FTD) w standardowej konstrukcji układu SOC. W środowisku produkcyjnym do sterowania instancjami NCP OpenThread można używać wpantund – sterownika interfejsu sieciowego klasy produkcyjnej. Jednak w tym ćwiczeniu z programowania użyjemy ot-ctl – interfejsu wiersza poleceń OpenThread.

Jedno urządzenie działa jako komisarz, który bezpiecznie uwierzytelnia i udostępnia urządzenia w tej sieci. Drugie urządzenie działa jako Joiner, którego komisarz może uwierzytelnić w sieci Thread.

Tworzenie i flashowanie

Utwórz przykładowy plik danych OpenThread FTD dla platformy nRF52840 z włączonymi rolami Komisarza i Łącznika:

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

Przejdź do katalogu z plikiem binarnym interfejsu wiersza poleceń OpenThread Full Thread Device (FTD) i przekonwertuj go na format szesnastkowy:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

Podłącz kabel USB do portu micro USB obok zewnętrznego styku zasilania na płytce nRF52840, a następnie do komputera z systemem Linux. Jeśli RCP jest nadal podłączony do komputera z systemem Linux, nowa płytka powinna być oznaczona jako port szeregowy /dev/ttyACM1 (wszystkie płytki nRF52840 używają identyfikatora ttyACM jako identyfikatora portu szeregowego).

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1

Tak jak wcześniej, zapisz numer seryjny płyty nRF52840 używanej na potrzeby FTD:

c00d519ebec7e5f0.jpeg

Przejdź do lokalizacji narzędzi wiersza poleceń nRFx i prześlij plik szesnastkowy FTD interfejsu wiersza poleceń OpenThread na płytkę nRF52840, używając jej numeru seryjnego:

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

Nadaj tablicy etykietę „Komisarz”.

Połącz z natywnym portem USB

Kompilacja OpenThread FTD umożliwia użycie natywnego interfejsu USB CDC ACM jako transportu szeregowego, dlatego do komunikowania się z hostem RCP (na komputerze z systemem Linux musisz używać portu nRF USB na płytce nRF52840).

Odłącz końcówkę micro USB kabla USB od portu debugowania płytki nRF52840, a następnie podłącz ją z powrotem do portu micro-USB nRF USB obok przycisku RESETUJ. Ustaw przełącznik źródła zasilania nRF na USB.

46e7b670d2464842.png

Zweryfikuj kompilację

Sprawdź udaną kompilację, otwierając interfejs wiersza poleceń OpenThread za pomocą narzędzia GNU Screen z okna terminala. W przypadku płyt nRF52840 szybkość transmisji bitów wynosi 115 200.

$ screen /dev/ttyACM1 115200

W nowym oknie naciśnij kilka razy Return na klawiaturze, aby wyświetlić prompt > interfejsu wiersza poleceń OpenThread. Otwórz interfejs IPv6 i sprawdź adresy:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

Naciśnij Ctrl + A →

d, aby odłączyć się od ekranu wiersza poleceń FTD Commissioner i wrócić do terminala Linuksa, aby można było wyświetlić następną tablicę. Aby w dowolnym momencie ponownie wpisać interfejs wiersza poleceń, użyj screen -r z poziomu wiersza poleceń. Aby zobaczyć listę dostępnych ekranów, użyj elementu screen -ls:

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

Konfigurowanie usługi łączenia FTD

Powtórz powyższy proces, aby wetknąć trzecią płytkę nRF52840, używając istniejącej kompilacji ot-cli-ftd.hex. Gdy skończysz, ponownie podłącz płytkę do komputera, używając portu USB nRF, i ustaw przełącznik źródła zasilania nRF na VDD.

Jeśli po podłączeniu tej trzeciej płytki do komputera z systemem Linux są podłączone pozostałe 2 węzły, powinny być one widoczne jako port szeregowy /dev/ttyACM2:

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

Oznacz tablicę jako „Łącznik”.

Jeśli przeprowadzasz weryfikację za pomocą aplikacji Screen, zamiast tworzyć nową instancję aplikacji Screen z poziomu wiersza poleceń, podłącz ją ponownie do istniejącej i utwórz w niej nowe okno (używane w przypadku komisarza FTD):

$ screen -r

Otwórz nowe okno na ekranie, naciskając Ctrl + A → c.

Pojawi się nowy wiersz poleceń. Uzyskaj dostęp do interfejsu wiersza poleceń OpenThread dla usługi łączenia FTD:

$ screen /dev/ttyACM2 115200

W nowym oknie naciśnij kilka razy Return na klawiaturze, aby wyświetlić prompt > interfejsu wiersza poleceń OpenThread. Otwórz interfejs IPv6 i sprawdź adresy:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

Interfejs wiersza poleceń FTD Joiner CLI znajduje się już w tym samym wystąpieniu Ekranu co komisarz FTD, więc możesz się między nimi przełączać, naciskając Ctrl + a → n.

Naciśnij Ctrl + A →

d w dowolnym momencie, aby zamknąć ekran.

6. Konfiguracja okna terminala

W przyszłości będziesz często przełączać się między urządzeniami Thread, więc upewnij się, że wszystkie działają i łatwo dostępne. Do tej pory korzystaliśmy z aplikacji Screen, aby uzyskać dostęp do 2 przyłączy FTD. To narzędzie umożliwia też podział ekranu w tym samym oknie terminala. Dzięki temu możesz zobaczyć, jak jeden węzeł reaguje na polecenia wydane w innym.

Najlepiej udostępnić cztery okna:

  1. ot-daemon – usługa lub logi
  2. Łącznik RCS przez ot-ctl
  3. Komisarz FTD przez interfejs wiersza poleceń OpenThread
  4. Łącznik FTD za pomocą interfejsu wiersza poleceń OpenThread

Jeśli chcesz użyć własnego terminala / portu szeregowego lub narzędzia, możesz przejść do następnego kroku. Skonfiguruj okna terminala na wszystkich urządzeniach w sposób, który najbardziej Ci odpowiada.

Używanie ekranu

Aby ułatwić sobie korzystanie z urządzenia, rozpocznij tylko jedną sesję ekranu. Jeden z nich powinien być już dostępny w momencie konfiguracji obydwu serwerów FTD.

Wszystkie polecenia na ekranie zaczynają się od Ctrl + A.

Podstawowe polecenia na ekranie:

Załącz ponownie do sesji ekranu (z poziomu wiersza poleceń)

screen -r

Opuść sesję ekranu

Ctrl + A → d

Utwórz nowe okno w ramach sesji ekranu

Ctrl + A → c

Przełączanie się między oknami w ramach tej samej sesji ekranu

Ctrl + A → n (do przodu) Ctrl + a → p (wstecz)

Wyłącz bieżące okno w sesji ekranu

Ctrl + A → k

Podzielony ekran

Za pomocą aplikacji Screen możesz podzielić terminal na kilka okien:

f1cbf1258cf0a5a.png

Do poleceń w usłudze screen otwiera się po naciśnięciu Ctrl + A. Każde polecenie powinno zaczynać się od tej kombinacji klawiszy dostępu.

Jeśli dokładnie wykonujesz ćwiczenia z Codelabs, powinny się w nim znajdować 2 okna (FTD Commissioner, FTD Joiner) w tej samej instancji ekranu. Aby podzielić ekran między te 2 ekrany, najpierw wprowadź bieżącą sesję ekranu:

$ screen -r

Musisz korzystać z jednego z urządzeń FTD. Wykonaj te czynności na ekranie Ekran:

  1. Ctrl+A → S, aby podzielić okno poziomo
  2. Ctrl + A → Tab, aby przenieść kursor do nowego pustego okna
  3. Ctrl + A → n, aby przełączyć nowe okno do następnego
  4. Jeśli jest to samo co w górnym oknie, naciśnij ponownie Ctrl + a → n, aby wyświetlić drugie urządzenie FTD.

Oba są widoczne. Możesz przełączać się między nimi, naciskając Ctrl + A → Tab. Zalecamy zmianę tytułu każdego okna za pomocą skrótu Ctrl + a → A, aby uniknąć pomyłek.

Zaawansowane użycie

Aby można było dalej podzielić ekran na ćwiartki i wyświetlić logi ot-daemon oraz narzędzie RCP Joiner ot-ctl, te usługi muszą być uruchomione w tej samej instancji ekranu. Aby to zrobić, zatrzymaj ot-daemon i zamknij ot-ctl. Uruchom je ponownie w nowych oknach ekranowych (Ctrl + A → c).

Ta konfiguracja nie jest wymagana i pozostaje jako ćwiczenie dla użytkownika.

Możesz dzielić okna i przechodzić między nimi za pomocą tych poleceń:

Utwórz nowe okno

Ctrl + A → c

Podziel okno w pionie

Ctrl + A →

Podziel okno poziomo

Ctrl + A → S

Przejdź do następnego wyświetlonego okna

Ctrl + A → Tab

Przełącz wyświetlane okno do przodu lub do tyłu

Ctrl+a → n lub p

Zmień nazwę bieżącego okna

Ctrl + A → A

W każdej chwili możesz opuścić ekran, naciskając Ctrl + a → d i dołączać go ponownie za pomocą polecenia screen -r z poziomu wiersza poleceń.

Więcej informacji o wyświetlaniu na ekranie znajdziesz w krótkim dokumencie GNU Screen.

7. Tworzenie sieci Thread

Masz już skonfigurowane wszystkie okna i ekrany terminali, czas utworzyć sieć Thread. Na stronie FTD Commissioner utwórz nowy zbiór danych operacyjnych i zatwierdź go jako aktywny. Działający zbiór danych to konfiguracja tworzonej sieci Thread.

## FTD Commissioner ##
----------------------

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 11
Channel Mask: 07fff800
Ext PAN ID: c0de7ab5c0de7ab5
Mesh Local Prefix: fdc0:de7a:b5c0/64
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

Zanotuj klucz sieci 1234c0de7ab51234c0de7ab51234c0de, którego użyjesz później.

Zatwierdź ten zbiór danych jako aktywny:

> dataset commit active
Done

Wyświetl interfejs IPv6:

> ifconfig up
Done

Rozpoczynanie operacji protokołu Thread:

> thread start
Done

Za chwilę sprawdź stan urządzenia. To powinien być lider. Pobierz też RLOC16 – do użytku w przyszłości.

## FTD Commissioner ##
----------------------

> state
leader
Done
> rloc16
0c00
Done

Sprawdź adresy IPv6 urządzenia:

## FTD Commissioner ##
----------------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:c00         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a    # Mesh-Local EID (ML-EID)
fe80:0:0:0:1cd6:87a9:cb9d:4b1d         # Link-Local Address (LLA)

Ćwiczenia z programowania Sieć jest teraz widoczna podczas skanowania z innych urządzeń Thread.

Źródło: ot-ctl w narzędziu RCP Joiner:

## RCP Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

W interfejsie wiersza poleceń OpenThread w narzędziu FTD Joiner:

## FTD Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

Jeśli „laboratorium” sieci nie ma na liście, spróbuj jeszcze raz uruchomić skanowanie.

8. Dodawanie łącznika RCP

Przekazywanie wątków nie jest aktywne w sieci, co oznacza, że musimy dodać narzędzie RCP Joiner do sieci Thread, którą właśnie utworzyliśmy, w ramach procesu uruchamiania poza zakresem.

Na stronie komisarza FTD zanotowaliśmy klucz sieci, na przykład 1234c0de7ab51234c0de7ab51234c0de. Jeśli chcesz ponownie wyszukać klucz sieci, uruchom to polecenie na stronie FTD Commissioner (komisarza FTD):

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

Następnie w narzędziu RCP Joiner ustaw aktywny klucz sieciowy zbioru danych na klucz sieciowy komisarza FTD:

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Sprawdź, czy zbiór danych jest prawidłowo skonfigurowany.

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Wywołaj Thread, aby łącznik RCP dołączył do „laboratorium” Zaczekaj kilka sekund, sprawdź stan RLOC16 i jego adresy IPv6:

## RCP Joiner ##
----------------

> ifconfig up
Done
> thread start
Done
> state
child
Done
> rloc16
0c01
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:0c01         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f    # Mesh-Local EID (ML-EID)
fe80:0:0:0:18e5:29b3:a638:943b          # Link-Local Address (LLA)
Done

Zanotuj lokalny adres IPv6 sieci typu mesh (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f tutaj), którego użyjesz później.

Na stronie FTD Commissioner sprawdź w tabelach routera i podrzędnych, czy oba urządzenia należą do tej samej sieci. Do identyfikacji osoby łączącej RCP użyj parametru RLOC16.

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  35 | 1ed687a9cb9d4b1d |

Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|VER| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|  2| 1ae529b3a638943b |
Done

Wyślij ping na lokalny adres sieci typu mesh osoby łączącej RCP (adres lokalny w sieci typu mesh uzyskany z danych wyjściowych ipaddr narzędzia RCP), aby sprawdzić połączenie:

## FTD Commissioner ##
----------------------

> ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
> 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms

Sieć Thread składa się z 2 węzłów, co przedstawiono na tym schemacie topologii:

otcodelab_top01C_2nodes.png

Diagramy topologii

W trakcie wykonywania pozostałych ćwiczeń z programowania w Codelabs będziemy wyświetlać nowy diagram topologii wątków. Role węzłów są oznaczone w ten sposób:

b75a527be4563215.png

Routery to zawsze pięciokąty, a urządzenia końcowe zawsze są okręgami. Liczby w każdym węźle odpowiadają identyfikatorowi routera lub identyfikatorowi podrzędnemu wyświetlanemu w danych wyjściowych interfejsu wiersza poleceń, w zależności od bieżącej roli i stanu każdego węzła w danym momencie.

9. Zlecenie połączenia FTD

Dodajmy teraz trzecie urządzenie Thread do ćwiczenia w programowaniu. Tym razem użyjemy bezpieczniejszego procesu uruchamiania w paśmie i umożliwimy dołączenie tylko osobie, która dołączyła do FTD.

Na stronie FTD Joiner znajdź identyfikator eui64, by komisarz FTD mógł go zidentyfikować:

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

Na stronie FTD Commissioner uruchom konto komisarza i podaj eui64 urządzenia, które może dołączyć, oraz dane logowania komisarza, na przykład J01NME. Dane logowania łączenia

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

Przełącz się na panel FTD Joiner. Rozpocznij rolę łączenia za pomocą danych logowania skonfigurowanych przed chwilą na stronie komisarza FTD:

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

Po około minucie otrzymasz potwierdzenie udanego uwierzytelnienia:

## FTD Joiner ##
----------------

>
Join success

Wyświetl Thread, aby łącznik FTD dołączył do ćwiczenia z programowania i natychmiast sprawdź stan oraz RLOC16:

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

Sprawdź adresy IPv6 urządzenia. Zwróć uwagę, że brakuje parametru ALOC. Dzieje się tak, ponieważ to urządzenie nie jest liderem ani nie ma przypisanej roli typu Anycast, która wymaga ALOC.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:c02         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)

Natychmiast przełącz się na poziom FTD Commissioner (komisarz FTD) i sprawdź tabele routera i tabele podrzędne, aby upewnić się, że w „ćwiczeniu z programowania” istnieją 3 urządzenia. sieć:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   2 | 0x0c02 |        240 |         15 |     3 |   44 |1|1|1|1| e6cdd2d93249a243 |
Done

Zgodnie z zasadą RLOC16 narzędzie FTD Joiner połączyło się z siecią jako urządzenie końcowe (element podrzędny). Oto zaktualizowana topologia:

otcodelab_top01C_ed01.png

10. Wątek w akcji

Urządzenia Thread tego ćwiczenia to specyficzny rodzaj urządzenia z pełnym wątkiem (FTD), który jest nazywany urządzeniem końcowym uprawnionym do routera (REED). Oznacza to, że mogą one działać zarówno jako router, jak i urządzenie końcowe, a także przenieść się z urządzenia końcowego do routera.

Thread może obsługiwać do 32 routerów, ale stara się utrzymać ich liczbę między 16 a 23. Jeśli REED podłącza się jako urządzenie końcowe (element podrzędny), a liczba routerów jest mniejsza niż 16, po losowym przedziale czasu w ciągu dwóch minut automatycznie zmieni się w router.

Jeśli po dodaniu elementu FTD Joiner w sieci Thread 2 elementy podrzędne były aktywne, odczekaj co najmniej 2 minuty, a następnie sprawdź tabele routera i podrzędne w komisarzu FTD:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

Łącznik FTD (rozszerzony MAC = e6cdd2d93249a243) awansował się na router. Pamiętaj, że RLOC16 jest inny (b800 zamiast 0c02). Wynika to z faktu, że wartość RLOC16 opiera się na identyfikatorze routera i identyfikatorze podrzędnym urządzenia. Podczas przenoszenia z urządzenia końcowego do routera zmieniają się jego wartości identyfikatora routera i identyfikatora podrzędnego, a także wartość RLOC16.

otcodelab_top01C.png

Potwierdź nowy stan i wartość RLOC16 w narzędziu FTD Joiner:

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

Zmiana poziomu połączenia FTD

Możesz przetestować to zachowanie, ręcznie zmieniając ustawienie FTD Joiner z routera z powrotem na urządzenie końcowe. Zmień stan na podrzędne i sprawdź RLOC16:

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

W sekcji Komisarz FTD element łączący FTD powinien pojawić się w tabeli podrzędnej (identyfikator = 3). Podczas przenoszenia może nawet znajdować się w obu tych miejscach:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   3 | 0x0c03 |        240 |         16 |     3 |   94 |1|1|1|1| e6cdd2d93249a243 |
Done

Po pewnym czasie urządzenie przełączy się z powrotem na router z wartością RLOC b800.

otcodelab_top01C.png

Usuń lidera

Lider jest wybierany samodzielnie spośród wszystkich routerów wątków. Oznacza to, że jeśli obecny lider zostanie usunięty z sieci Thread, jeden z pozostałych routerów stanie się nowym routerem.

Na stronie FTD Commissioner wyłącz usługę Thread, aby usunąć ją z sieci Thread:

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

W ciągu 2 minut FTD Joiner stanie się nowym liderem wątku. Sprawdź stan i adresy IPv6 narzędzia do łączenia FTD:

## FTD Joiner ##
----------------

> state
leader
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00       # Now it has the Leader ALOC!
fdc0:de7a:b5c0:0:0:ff:fe00:b800
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd
fe80:0:0:0:e4cd:d2d9:3249:a243
Done

otcodelab_top02C_01.png

Sprawdź tabelę podrzędną. Zwróć uwagę, że pojawiła się nowa wersja RLOC16. Jest to łącznik RCP, na który wskazują jego identyfikator i rozszerzony adres MAC. Aby utrzymać sieć Thread, przełączała routery nadrzędne z komisarza FTD na łącznik FTD. Powoduje to zmianę wartości RLOC16 dla połączenia RCP (ponieważ identyfikator routera zmienił się z 3 na 46).

## FTD Joiner ##
----------------

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |         27 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

Może być konieczne odczekanie kilku minut na dołączenie elementu RCP Joiner do dołączenia do FTD Joiner jako użytkownik podrzędny. Sprawdź stan i wskaźnik RLOC16, aby potwierdzić, że:

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

Dołącz ponownie komisarza FTD

Sieć Thread z 2 węzłami nie jest fajna. Wróćmy do trybu online komisarza FTD.

Na stronie FTD Commissioner uruchom ponownie Thread:

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

W ciągu 2 minut automatycznie powtarza się do ćwiczenia w roli urządzenia końcowego, a potem promuje się jako router.

## FTD Commissioner ##
----------------------

> state
router
Done

Sprawdź tabele routera i podrzędne w narzędziu FTD Joiner, aby upewnić się, że:

## FTD Joiner ##
----------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |       63 |         0 |     3 |      3 |   0 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       46 |         0 |     0 |      0 |  15 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |        184 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

otcodelab_top02C_02.png

Nasza sieć Thread znów składa się z 3 węzłów.

11. Rozwiązywanie problemów

Zarządzanie siecią Thread z kilkoma urządzeniami na różnych terminalach lub oknami ekranowymi może być skomplikowane. Skorzystaj z tych wskazówek, aby „zresetować” stan sieci lub obszaru roboczego, jeśli występują problemy.

Ekran

Jeśli zgubisz się w konfiguracji (za dużo okien lub ekranów na ekranie), zamykaj okna ekranowe, naciskając Ctrl + a → k, aż żaden nie istnieje, a screen -ls w wierszu poleceń wyświetli No Sockets found. Następnie utwórz ponownie okna ekranów na każdym urządzeniu. Stany urządzenia są zachowywane nawet po wyłączeniu ekranu.

Węzły wątków

Jeśli topologia sieci Thread nie jest zgodna z opisem w tym ćwiczeniu lub węzły z jakiegoś powodu rozłączają się (na przykład komputer z systemem Linux, na którym zostały uśpione), najlepiej wyłączyć usługę Thread, wyczyścić dane logowania do sieci i zacząć od nowa od kroku Tworzenie sieci Thread.

Aby zresetować punkty wyjścia:

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

RCP można zresetować w ten sam sposób za pomocą ot-ctl:

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. Używanie multiemisji

Multicast służy do przekazywania informacji do grupy urządzeń jednocześnie. W sieci Thread określone adresy są zarezerwowane do użytku w trybie multicast z różnymi grupami urządzeń w zależności od zakresu.

Adres IPv6

Zakres

Dostarczono do

ff02::1

Link lokalny

Wszystkie FTD i MED

ff02::2

Link lokalny

Wszystkie FTD i routery graniczne

ff03::1

Sieć typu mesh – lokalna

Wszystkie FTD i MED

ff03::2

Sieć typu mesh – lokalna

Wszystkie FTD i routery graniczne

Ponieważ w tym ćwiczeniach z programowania nie korzystamy z routera granicznego, skupmy się na 2 adresach grupowych FTD i MED.

Zakres połączenia lokalnego obejmuje wszystkie interfejsy Thread, do których można dotrzeć za pomocą pojedynczej transmisji radiowej lub pojedynczego przeskoku. Topologia sieci określa, które urządzenia reagują na ping na adres multiemisji ff02::1.

Ping ff02::1 od komisarza FTD:

## FTD Commissioner ##
----------------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms

W sieci są jeszcze 2 inne urządzenia (FTD Joiner i RCP Joiner), ale komisarz FTD otrzymał tylko jedną odpowiedź z połączenia z lokalnym adresem firmy FTD Joiner's Link-Local Address (LLA). Oznacza to, że komisarz FTD Joiner jest jedynym urządzeniem, do którego może dotrzeć z jednym przeskokiem.

otcodelab_top02C_02_LL.png

Teraz wyślij ping do użytkownika ff02::1 od osoby, która łączy FTD:

## FTD Joiner ##
----------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms
8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms

Dwie odpowiedzi! Po sprawdzeniu adresów IPv6 pozostałych urządzeń widzimy, że pierwszy z nich (kończący się na 4b1d) to LLA komisarza FTD, a drugi (kończący się na 943b) to LLA połączenia RCP.

otcodelab_top02C_02_LL02.png

Oznacza to, że usługa FTD Joiner jest bezpośrednio połączona z komisarzem FTD i RCP Joiner, co potwierdza naszą topologię.

Sieć typu mesh – lokalna

Zakres sieci typu mesh-Local obejmuje wszystkie interfejsy Thread dostępne w tej samej sieci Thread. Zobaczmy odpowiedzi na ping na adres transmisji grupowej ff03::1.

Ping ff03::1 od komisarza FTD:

## FTD Commissioner ##
----------------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms

Tym razem komisarz FTD otrzymał 2 odpowiedzi: jedną od Lokalizatora routingu FTD Joiner's Routing Locator (RLOC z końcówką b800), a drugą z identyfikatora EID usługi mesh-Local Mesh (ML-EID o numerze kończącym się cyframi d55f) osoby RCP. Dzieje się tak, ponieważ zakres sieci typu mesh obejmuje całą sieć Thread. Urządzenie będzie subskrybowane z adresu ff03::1 niezależnie od tego, w którym miejscu w sieci się znajduje.

otcodelab_top02C_02_ML.png

Wyślij ping na konto ff03::1 z konsoli FTD Joiner, aby potwierdzić to samo zachowanie:

## FTD Joiner ##
----------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms

otcodelab_top02C_02_LL02.png

Zwróć uwagę na czas odpowiedzi narzędzia RCP Joiner w obu danych wyjściowych pingu. Osoba łącząca RCP zajęła dużo więcej czasu na dotarcie do komisarza FTD (68 ms) niż do połączenia z FTD Joiner (23 ms). Wynika to z faktu, że aby dotrzeć do komisarza FTD, trzeba wykonać dwa przeskoki, a nie jeden przeskok dla komisarza FTD.

Być może zauważyłeś również, że ping lokalnego multiemisji w sieci typu mesh odpowiadał przy użyciu RLOC tylko dla dwóch FTD, a nie RCP Joiner. Dzieje się tak, ponieważ FTD to routery w sieci, a RCP – urządzeniem końcowym.

Sprawdź stan narzędzia RCP Joiner, aby potwierdzić:

## RCP Joiner ##
----------------

> state
child

13. Wysyłaj wiadomości przy użyciu UDP

Jedną z usług aplikacji udostępnianych przez OpenThread jest protokół User Datagram Protocol (UDP), czyli protokół Transport Layer. Aplikacja utworzona w OpenThread może używać interfejsu UDP API do przekazywania wiadomości między węzłami w sieci Thread lub do innych urządzeń w sieci zewnętrznej (np. do internetu, jeśli sieć Thread obsługuje router graniczny).

Gniazda UDP są udostępniane przez interfejs wiersza poleceń OpenThread. Użyjmy go do przekazywania wiadomości między dwoma serwerami FTD.

Uzyskaj lokalny adres EID sieci typu mesh dla elementu FTD Joiner. Używamy tego adresu, ponieważ jest on osiągalny z dowolnego miejsca w sieci Thread.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:b800        # Routing Locator (RLOC)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
Done

Uruchom UDP i powiąż go z gniazdem dla dowolnego adresu IPv6:

## FTD Joiner ##
----------------

> udp open
Done
> udp bind :: 1212

Przełącz się na poziom FTD Commissioner, uruchom UDP i połącz się z gniazdem skonfigurowanym w FTD Joiner, używając jego identyfikatora ML-EID:

## FTD Commissioner ##
----------------------

> udp open
Done
> udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212
Done

Między 2 węzłami powinno być aktywne połączenie UDP. Wyślij wiadomość od komisarza FTD:

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

W narzędziu FTD Joiner otrzymano komunikat UDP.

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

14. Gratulacje!

Udało Ci się utworzyć fizyczną sieć Thread.

b915c433e7027cc7.png

Wiesz już:

  • różnica między typami, rolami i zakresami urządzeń Thread
  • jak urządzenia Thread zarządzają stanami w sieci
  • jak przekazywać proste komunikaty między węzłami przy użyciu UDP

Dalsze kroki

Opierając się na tym ćwiczeniu z programowania, spróbuj wykonać następujące ćwiczenia:

  • Ponownie utwórz tablicę FTD Joiner jako MTD, używając pliku binarnego ot-cli-mtd, i obserwuj, że nigdy nie zmienia się ona na router ani nie próbuje zostać liderem.
  • Dodaj do sieci więcej urządzeń (spróbuj użyć innej platformy) i szkicuj topologię, korzystając z tabel routerów i podrzędnych oraz pingów dotyczących adresów grupowania.
  • Używaj pyspinel do sterowania NCP.
  • Przekonwertuj NCP na router graniczny za pomocą routera granic OpenThread i połącz swoją sieć Thread z internetem.

Więcej informacji

Na stronach openthread.io i GitHub znajdziesz różne zasoby OpenThread, w tym:

Numer referencyjny: