1. Wprowadzenie

OpenThread, udostępniony przez zespół Google Nest, to implementacja open source protokołu sieciowego Thread® zaprojektowana w celu przyspieszenia tworzenia produktów dla domu inteligentnego. Specyfikacja Thread określa niezawodny, bezpieczny i energooszczędny protokół bezprzewodowej komunikacji między urządzeniami oparty na IPv6, który jest przeznaczony do zastosowań w domach i budynkach komercyjnych.
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 zaimplementowała też router graniczny Thread oparty na RTOS.
W tym ćwiczeniu z programowania 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łytkach ESP.
- Tworzenie 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.
- Zabezpieczanie procesu dodawania urządzeń do sieci Thread.
- Pingowanie adresu IPv6 między węzłami Thread.
- Przesyłanie wiadomości między węzłami Thread za pomocą UDP.
Czego potrzebujesz
Sprzęt:
Oprogramowanie:
2. Pierwsze kroki
- Instalacja ESP-IDF.
Aby zainstalować środowisko programistyczne, postępuj zgodnie z instrukcjami w przewodniku programowania ESP-IDF.
- Sklonuj pakiet ESP Thread Border Router SDK.
ESP-THREAD-BR to oficjalny pakiet SDK routera granicznego Thread ESP. Obsługuje wszystkie podstawowe funkcje sieciowe, które umożliwiają utworzenie routera granicznego Thread, oraz integruje bogate funkcje na poziomie produktu, które przyspieszają jego wprowadzenie na rynek.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Tworzenie i flashowanie
Aby utworzyć i flashować plik binarny ot-cli-ftd na płytkach ESP z modułami IEEE 802.15.4, możesz zapoznać się ze szczegółami w przykładzie ot_cli ESP-IDF:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
Włącz funkcję joiner za pomocą menuconfig:
$ idf.py menuconfig
Component config > OpenThread > Enable Joiner (Konfiguracja komponentu > OpenThread > Włącz joiner), a następnie utwórz i flashuj.
$ idf.py -p <your-local-port> build flash monitor
Aby utworzyć i flashować plik binarny ot-br na płytce ESP Thread Border Router, musisz najpierw utworzyć plik binarny RCP. Tego pliku binarnego RCP nie trzeba flashować na urządzeniu na płytce ESP Thread Border Router. Zostanie on dołączony do pliku binarnego routera granicznego i flashowany na chipie ESP32-H2 przy pierwszym uruchomieniu (lub po zmianie oprogramowania układowego 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ę commissioner za pomocą menuconfig:
$ idf.py menuconfig
Component config > OpenThread > Enable Commissioner (Konfiguracja komponentu > OpenThread > Włącz commissioner), a następnie utwórz i flashuj.
$ 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łytce ESP Thread Border Router (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
Uruchom interfejs IPv6:
> ifconfig up I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
Uruchom 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 to być lider.
> state leader Done >
5. Dołączanie do sieci Thread za pomocą networkkey
W tym ćwiczeniu z programowania przygotowaliśmy 2 płytki ESP z modułami IEEE 802.15.4, które mają dołączyć do sieci utworzonej przez BR. W tej sesji dodamy do sieci płytkę Board1.
Pobierz networkkey z BR:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
Ustaw ten networkkey 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
Uruchom interfejs IPv6:
> ifconfig up Done I (20308) OT_STATE: netif up
Uruchom 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. Powinien to być element podrzędny.
> state child Done
Ustaw rolę na Mesh Extender (w interfejsie wiersza poleceń i dziennikach nazywany 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 procesu dodawania
W tej sesji dodamy do sieci płytkę Board2 za pomocą bezpiecznego procesu dodawania:
Pobierz PSKc i panid z BR Commissioner:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Skonfiguruj informacje o sieci na płytce Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Zatwierdź ten zbiór danych jako aktywny:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Uruchom 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 BR Commissioner uruchom commissioner i określ eui64 urządzenia, które może dołączyć, oraz Joiner Credential, np. J01NME. Joiner Credential to ciąg znaków alfanumerycznych (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 Board2 Joiner. Uruchom rolę joiner za pomocą Joiner Credential, którą właśnie skonfigurowałeś(-aś) na BR Commissioner:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
W ciągu minuty otrzymasz potwierdzenie pomyślnego uwierzytelnienia:
## Board2 Joiner ## ---------------------- > Join success
Następnie możesz uruchomić sieć Thread utworzoną przez BR Commissioner i do niej dołączyć.
Uruchom 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 Mesh Extender (w interfejsie wiersza poleceń i dziennikach nazywany 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
Do komunikacji między dowolnymi 2 płytkami możesz użyć polecenia ping. Aby wyświetlić adres IPv6 każdej płytki, 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 np. pingować MLE-ID płytki Board2 z BR Commissioner, możesz uruchomić to polecenie na BR Commissioner:
## 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. Przesyłanie wiadomości między węzłami Thread za pomocą UDP
W tej sesji dowiesz się, jak wysłać wiadomość między 2 urządzeniami Thread. Otwórz np. UDP i powiąż go z portem 20617 oraz nasłuchuj wszystkich adresów na 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 płytki Board1 na adres MLE-ID BR i port 20617:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Na BR zobaczysz otrzymaną wiadomość:
## 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.

Teraz wiesz, jak:
- tworzyć i flashować pliki binarne interfejsu wiersza poleceń OpenThread na płytkach ESP;
- tworzyć i flashować router graniczny na płytce ESP Thread Border Router;
- ręcznie zarządzać węzłami Thread za pomocą ESP Monitor i interfejsu wiersza poleceń OpenThread;
- tworzyć sieć Thread na routerze granicznym Thread;
- zabezpieczać proces dodawania urządzeń do sieci Thread;
- pingować adres IPv6 między węzłami Thread;
- przesyłać wiadomości między węzłami Thread za pomocą 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.
- Tworzenie OpenThread – więcej informacji o tworzeniu i konfigurowaniu OpenThread.
- Podstawy Thread – omówienie wszystkich koncepcji Thread przedstawionych w tym ćwiczeniu z programowania.
Wersja referencyjna: