1. Wprowadzenie
Opublikowana przez zespół Google Nest usługa OpenThread to implementacja protokołu sieciowego Thread®, która ma na celu przyspieszenie rozwoju produktów i usług do domów inteligentnych. Specyfikacja Thread określa oparty na protokole IPv6 niezawodny, bezpieczny i mało wydajny protokół komunikacji bezprzewodowej między urządzeniami a urządzeniem przeznaczonym do użytku w budynkach domowych i komercyjnych.
Firma Espressif przeniosła stos OpenThread w oparciu o FreeRTOS i LwIP, umożliwiając programistom szybkie tworzenie sieci typu Thread. Powiązany kod źródłowy możesz uzyskać z usługi GitHub. W tym samym czasie firma Espressif wdrożyła też router obramowań wątków oparty na RTOS.
Dzięki tym ćwiczeniom z programowania nauczysz się programować OpenThread na rzeczywistym sprzęcie, utworzysz sieć typu Thread i będziesz nią zarządzać, a także przekażesz komunikaty między węzłami.
Czego się nauczysz
- Tworzenie i instalowanie plików binarnych interfejsu OpenThread CLI na płytach ESP.
- Router graniczny w budynku i migający do płyty ESP Thread Border Router.
- Ręczne zarządzanie węzłami Thread za pomocą Monitora ESP i interfejsu wiersza poleceń OpenThread.
- Tworzenie sieci typu Thread na routerze Thread Border Router.
- zabezpieczanie uruchamiania urządzeń w sieci Thread.
- Pingowanie adresu IPv6 między węzłami wątków.
- 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.
- Skopiuj pakiet ESP Thread Border Router SDK.
ESP-THREAD-BR to oficjalny pakiet SDK ESP Thread Border Router. Obsługuje wszystkie podstawowe funkcje sieciowe, aby stworzyć router Thread Border Router i integruje zaawansowane funkcje na poziomie produktu, co umożliwia szybką obsługę produktu.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Tworzenie i flashowanie
Aby utworzyć i przesłać plik binarny ot-cli-ftd na płytach ESP z użyciem modułów IEEE 802.15.4, zapoznaj się z przykładem ESP-IDF ot_cli, aby uzyskać więcej informacji:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
Włącz funkcję łączenia za pomocą menuconfig:
$ idf.py menuconfig
Konfiguracja komponentu > OpenThread > Włącz Joiner, a następnie kompiluj i błyskawicz.
$ idf.py -p <your-local-port> build flash monitor
Aby utworzyć i przesłać plik binarny ot-br na płytce ESP Thread Border Router, musisz najpierw utworzyć plik binarny RCP. Tego pliku binarnego RCP nie trzeba specjalnie zainstalować na urządzeniu na płytce ESP Thread Border Router. Będzie on zawarty w pliku binarnym routera Border Router i zostanie załadowany do układu 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ę komisarza za pomocą menuconfig:
$ idf.py menuconfig
Konfiguracja komponentu > OpenThread > Włącz komisję, a następnie kompiluj i błyskawicz.
$ idf.py -p <your-local-port> build flash monitor
4. Tworzenie sieci typu Thread na routerze Thread Border Router
Teraz możesz utworzyć sieć Thread, korzystając z wiersza poleceń OpenThread na płycie 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
Wyświetl 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 to być lider.
> state leader Done >
5. Połącz się z siecią Thread za pomocą klucza sieciowego
W tym ćwiczeniu z programowania 2 platformy ESP z modułami IEEE 802.15.4 są przygotowane do łączenia się z siecią utworzoną w BR. W tej sesji dodamy tablicę Board1 do sieci.
Pobierz klucz sieci z BR:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
Ustaw ten klucz sieciowy na jedną tablicę 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
Wyświetl 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łącz do sieci Thread przez bezpieczne uruchomienie
W ramach tej sesji dodamy Board2 do sieci w ramach uruchamiania zabezpieczeń:
Uzyskaj PSKc i panidę od komisarza BR:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Skonfiguruj informacje o sieci dla platformy Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Zatwierdź ten zbiór danych jako aktywny:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Wyświetl interfejs IPv6:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Pobierz eui64 z Board2:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
Na stronie Komisarz BR uruchom komisarza i podaj eui64
urządzenia, które może zostać połączone, oraz dane uwierzytelniające, np. J01NME
. Dane łączeniowe to specyficzny dla urządzenia ciąg zawierający wszystkie wielkie znaki alfanumeryczne (0–9 i A–Y, z wyłączeniem I, O, Q i Z w celu zapewnienia czytelności), 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
Otwórz Board2 Joiner. Rozpocznij rolę osoby dołączającej za pomocą danych logowania, które właśnie skonfigurowałeś na stronie komisarza BR:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
Po około minucie otrzymasz potwierdzenie udanego uwierzytelnienia:
## Board2 Joiner ## ---------------------- > Join success
Potem możesz rozpocząć sieć Thread utworzoną przez komisarza BR i dołączyć do niej.
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 >
W ten sposób uzyskasz sieć typu Thread o poniższej topologii:
7. Pingowanie adresu IPv6 między węzłami wątków
Do komunikacji między dowolnymi 2 tablicami możesz używać polecenia ping. Za pomocą polecenia ipaddr
wydrukuj adres IPv6 każdej tablicy:
## 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
Na przykład, aby wysłać ping Board2 MLE-ID od komisarza BR, możesz uruchomić to polecenie dla komisarza 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 wątków przez UDP
W tej sesji dowiesz się, jak wysyłać wiadomości między 2 urządzeniami Thread. Na przykład otwórz plik udp i powiąż go na porcie 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 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
Możesz zobaczyć wiadomość otrzymaną 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ą tablic ESP.
Teraz już wiesz:
- Tworzenie i instalowanie plików binarnych interfejsu OpenThread CLI na płytach ESP.
- Tworzę migający router graniczny z płytą ESP Thread Border Router.
- Ręczne zarządzanie węzłami Thread za pomocą Monitora ESP i interfejsu wiersza poleceń OpenThread.
- Tworzenie sieci typu Thread na routerze Thread Border Router.
- zabezpieczanie uruchamiania urządzeń w sieci Thread.
- Pingowanie adresu IPv6 między węzłami wątków.
- 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 zasoby OpenThread, takie jak:
- Obsługiwane platformy – poznaj wszystkie platformy obsługujące OpenThread
- Tworzenie OpenThread – więcej informacji o tworzeniu i konfigurowaniu OpenThread.
- Thread Primer – obejmuje wszystkie koncepcje związane z Thread opisane w tym ćwiczeniu z programowania;
Materiały: