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

1. Wprowadzenie

26b7f4f6b3ea0700.png

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.

Espressif_hardware_setup.jpg

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:

  • 2 płytki ESP z modułami IEEE 802.15.4.
  • 1 płytka ESP Thread Border Router.

Oprogramowanie:

2. Pierwsze kroki

  1. Instalacja ESP-IDF.

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

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

esp_ot_tp_LR.jpg

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:

esp_ot_tp_LRR.jpg

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.

esp_ot_final_topology.jpg

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:

Wersja referencyjna: