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

1. Wprowadzenie

26b7f4f6b3ea0700.png

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.

Espressif_hardware_setup.jpg

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:

  • 2 płytki ESP z modułami IEEE 802.15.4.
  • 1 płytka routera granicznego Thread ESP.

Oprogramowanie:

2. Pierwsze kroki

  1. Instalacja ESP-IDF.

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

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

esp_ot_tp_LR.jpg

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:

esp_ot_tp_LRR.jpg

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.

esp_ot_final_topology.jpg

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.ioGitHub znajdziesz różne materiały dotyczące OpenThread, w tym:

Źródło: