Twórz sieć wątków za pomocą płyty ESP32H2 i ESP Thread Border Router

1. Wprowadzenie

26b7f4f6b3ea0700.png

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.

Espressif_hardware_setup.jpg

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:

  • 2 tablice ESP z modułami IEEE 802.15.4.
  • 1 płytka routera ESP Thread Border.

Oprogramowanie:

2. Pierwsze kroki

  1. Instalacja ESP-IDF.

Aby zainstalować środowisko programistyczne, postępuj zgodnie z przewodnikiem programowania ESP-IDF.

  1. 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
> 

esp_ot_tp_LR.jpg

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:

esp_ot_tp_LRR.jpg

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.

esp_ot_final_topology.jpg

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:

Materiały: