1. Wprowadzenie

OpenThread to wydana przez zespół Google Nest implementacja open source protokołu sieciowego Thread®, która ma przyspieszyć rozwój produktów do inteligentnego domu. Specyfikacja Thread definiuje niezawodny, bezpieczny i energooszczędny protokół komunikacji bezprzewodowej między urządzeniami oparty na IPv6, który jest przeznaczony do zastosowań domowych i komercyjnych.
Firma Espressif przeniosła stos OpenThread oparty na FreeRTOS i LwIP, co umożliwia programistom szybkie tworzenie sieci Thread. Powiązany kod źródłowy można pobrać z GitHub. Firma Espressif wdrożyła też router graniczny Thread oparty na RTOS.
W tym ćwiczeniu zaprogramujesz OpenThread na prawdziwym sprzęcie, utworzysz sieć Thread i będziesz nią zarządzać oraz przesyłać wiadomości między węzłami.

Czego się nauczysz
- Tworzenie i flashowanie plików binarnych interfejsu wiersza poleceń OpenThread na płytach ESP.
- Kompilowanie i flashowanie routera granicznego na płytce ESP Thread Border Router.
- Ręczne zarządzanie węzłami Thread za pomocą ESP Monitor i interfejsu wiersza poleceń OpenThread.
- Tworzenie sieci Thread na routerze granicznym Thread.
- Zapewnienie bezpieczeństwa procesu wprowadzania urządzeń do sieci Thread.
- Pingowanie adresu IPv6 między węzłami Thread.
- Przekazywanie wiadomości między węzłami Thread za pomocą protokołu UDP.
Czego potrzebujesz
Sprzęt:
Oprogramowanie:
2. Pierwsze kroki
- Instalacja ESP-IDF.
Aby zainstalować środowisko programistyczne, postępuj zgodnie z przewodnikiem programowania ESP-IDF.
- Sklonuj pakiet ESP Thread Border Router SDK.
ESP-THREAD-BR to oficjalny pakiet SDK routera granicznego ESP Thread. Obsługuje wszystkie podstawowe funkcje sieciowe do tworzenia routera brzegowego Thread i integruje bogate funkcje na poziomie produktu, co umożliwia szybkie wprowadzenie produktu na rynek.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Kompilowanie i flashowanie
Więcej informacji o tworzeniu i wgrywaniu pliku binarnego ot-cli-ftd na płytki ESP z modułami IEEE 802.15.4 znajdziesz w przykładzie ESP-IDF ot_cli:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
Włącz funkcję dołączania za pomocą menuconfig:
$ idf.py menuconfig
Konfiguracja komponentu > OpenThread > Włącz urządzenie dołączające, a następnie skompiluj i zapisz.
$ idf.py -p <your-local-port> build flash monitor
Aby skompilować i wgrać plik binarny ot-br na płytę routera brzegowego ESP Thread, musisz najpierw skompilować plik binarny RCP. Ten plik binarny RCP nie musi być jawnie wgrywany na urządzenie na płycie routera granicznego ESP Thread. Zostanie on uwzględniony w binarnym pliku routera granicznego i zapisany w pamięci układu ESP32-H2 przy pierwszym uruchomieniu (lub po zmianie oprogramowania RCP). Więcej informacji znajdziesz w dokumentacji ESP Thread BR:
$ cd <your-idf-path>/examples/openthread/ot_rcp $ idf.py set-target esp32h2 $ idf.py build $ cd <your-esp-thread-br-path>/examples/basic_thread_border_router $ idf.py set-target esp32s3
Włącz funkcję komisarza za pomocą menuconfig:
$ idf.py menuconfig
Konfiguracja komponentu > OpenThread > Włącz Commissioner, a następnie skompiluj i wgraj.
$ idf.py -p <your-local-port> build flash monitor
4. Tworzenie sieci Thread na routerze granicznym Thread
Teraz możesz utworzyć sieć Thread za pomocą wiersza poleceń OpenThread na płycie routera brzegowego ESP Thread (BR Commissioner):
## BR Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 21 Channel Mask: 0x07fff800 Ext PAN ID: 151975d11bea97b5 Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64 Network Key: 731ab6a60a64a0a0b14b259b86b2be01 Network Name: OpenThread-1444 PAN ID: 0x1444 PSKc: 54e7f18d2575014da94db09df29c5df0 Security Policy: 672 onrc 0 Done
Zatwierdź ten zbiór danych jako aktywny:
> dataset commit active Done
Włącz interfejs IPv6:
> ifconfig up I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
Rozpocznij operację protokołu Thread:
> thread start I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11 I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00 I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 I (69099) OPENTHREAD: Platform UDP bound to port 49154
Po chwili sprawdź stan urządzenia. Powinien być liderem.
> state leader Done >
5. Dołączanie do sieci Thread za pomocą klucza sieciowego
W tym laboratorium przygotowawczym 2 płytki ESP z modułami IEEE 802.15.4 są przygotowywane do dołączenia do sieci utworzonej przez router graniczny. W tej sesji dodamy Board1 do sieci.
Pobierz klucz sieciowy z BR:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
Ustaw ten klucz sieciowy na jednej płytce ESP (Board1 Joiner) z modułami IEEE 802.15.4:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
Zatwierdź ten zbiór danych jako aktywny:
> dataset commit active Done
Włącz interfejs IPv6:
> ifconfig up Done I (20308) OT_STATE: netif up
Rozpocznij operację protokołu Thread:
> thread start I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01 I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child
Po chwili sprawdź stan urządzenia. To powinno być Dziecko.
> state child Done
Ustaw rolę na Router.
> state router Done I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800 I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >

6. Dołączanie do sieci Thread za pomocą bezpiecznego wdrażania
Podczas tej sesji dodamy urządzenie Board2 do sieci za pomocą bezpiecznego wdrażania:
Pobierz PSKc i panid od komisarza BR:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Skonfiguruj informacje o sieci na urządzeniu Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Zatwierdź ten zbiór danych jako aktywny:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Włącz interfejs IPv6:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Pobierz eui64 z płytki Board2:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
Na urządzeniu BR Commissioner uruchom usługę Commissioner i określ eui64 urządzenia, które może dołączyć, wraz z poświadczeniami Joiner Credential, np. J01NME. Klucz dostępu urządzenia to ciąg znaków alfanumerycznych składający się z samych wielkich liter (0–9 i A–Y, z wyłączeniem I, O, Q i Z ze względu na czytelność) o długości od 6 do 32 znaków.
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
Przełącz się na Narzędzie złączające tablicę 2. Uruchom rolę dołączającego za pomocą danych logowania dołączającego, które zostały skonfigurowane na urządzeniu BR Commissioner:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
Po około minucie otrzymasz potwierdzenie pomyślnego uwierzytelnienia:
## Board2 Joiner ## ---------------------- > Join success
Następnie możesz rozpocząć i dołączyć do sieci Thread utworzonej przez komisarza BR.
Rozpocznij operację protokołu Thread:
> thread start I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801 I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child
Ustaw rolę na Router.
> state router Done I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400 I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
Teraz masz sieć Thread o topologii pokazanej poniżej:

7. Pingowanie adresu IPv6 między węzłami Thread
Za pomocą polecenia ping możesz komunikować się między dowolnymi 2 tablicami. Aby wydrukować adres IPv6 każdej tablicy, użyj polecenia ipaddr:
## BR Commissioner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 # Mesh-Local EID (ML-EID) fe80:0:0:0:687c:7248:cc14:9c4d # Link-Local Address (LLA) Done >
## Board1 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:2800 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 # Mesh-Local EID (ML-EID) fe80:0:0:0:18ac:df04:4671:6a45 # Link-Local Address (LLA) Done
## Board2 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:4400 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc # Mesh-Local EID (ML-EID) fe80:0:0:0:a8cc:1483:f696:91a2 # Link-Local Address (LLA) Done
Aby na przykład wysłać ping do identyfikatora MLE Board2 z komisji BR, możesz uruchomić to polecenie na komisji BR:
## BR Commissioner ## ---------------------- > ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc 16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms. Done
8. Przekazywanie wiadomości między węzłami Thread za pomocą protokołu UDP
Z tego szkolenia dowiesz się, jak wysyłać wiadomości między dwoma urządzeniami Thread. Na przykład otwórz UDP, powiąż go z portem 20617 i nasłuchuj wszystkich adresów w BR:
## BR Commissioner ## ---------------------- > udp open Done > udp bind :: 20617 I (1298739) OPENTHREAD: Platform UDP bound to port 20617 Done
Następnie wyślij wiadomość z urządzenia Board1 na adres BR MLE-ID i port 20617:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Wiadomość otrzymana w BR:
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
9. Gratulacje!
Udało Ci się utworzyć fizyczną sieć Thread za pomocą płytek ESP.

Wiesz już:
- Tworzenie i flashowanie plików binarnych interfejsu wiersza poleceń OpenThread na płytach ESP.
- Tworzenie routera granicznego do płyty ESP Thread Border Router.
- Ręczne zarządzanie węzłami Thread za pomocą ESP Monitor i interfejsu wiersza poleceń OpenThread.
- Tworzenie sieci Thread na routerze granicznym Thread.
- Zapewnienie bezpieczeństwa procesu wprowadzania urządzeń do sieci Thread.
- Pingowanie adresu IPv6 między węzłami Thread.
- Przekazywanie wiadomości między węzłami Thread za pomocą protokołu UDP.
Więcej informacji
Na stronach openthread.io i GitHub znajdziesz różne materiały dotyczące OpenThread, w tym:
- Obsługiwane platformy – poznaj wszystkie platformy, które obsługują OpenThread.
- Kompilowanie OpenThread – więcej informacji o kompilowaniu i konfigurowaniu OpenThread.
- Podstawy protokołu Thread – omówienie wszystkich koncepcji protokołu Thread, które pojawiają się w tym ćwiczeniu z programowania.
Źródło: