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 implementacja OpenThread to implementacja protokołu sieciowego Thread® typu open source, która ma przyspieszyć prace nad produktami do inteligentnego domu. Specyfikacja Thread Specification definiuje oparty na protokole IPv6 niezawodny, bezpieczny i oszczędny protokół komunikacyjny między urządzeniami mobilnymi, przeznaczony do zastosowań domowych i komercyjnych.

Firma Espressif przeniosła stos OpenThread oparty na technologii FreeRTOS i LwIP, co umożliwia programistom szybkie tworzenie sieci Thread. Powiązany kod źródłowy znajdziesz w serwisie GitHub. Jednocześnie firma Espressif wdrożyła router granic wątków oparty na RTOS.

W ramach tego ćwiczenia w Codelabs zaprogramujesz OpenThread na prawdziwym sprzęcie, utworzysz sieć Thread i nią zarządzasz, a także przekażesz komunikaty między węzłami.

Espressif_hardware_setup.jpg

Czego się nauczysz

  • Tworzenie i flashowanie plików binarnych interfejsu wiersza poleceń OpenThread na płytki ESP.
  • Tworzę i migam router brzegowy do płytki routera granicznego ESP.
  • Ręczne zarządzanie węzłami Thread za pomocą Monitora ESP i interfejsu wiersza poleceń OpenThread.
  • Tworzę sieć Thread na routerze Thread Border.
  • Zabezpieczanie uruchamiania urządzeń w sieci Thread.
  • Pingowanie adresu IPv6 między węzłami Thread.
  • Przekazywanie wiadomości między węzłami wątków przy użyciu protokołu UDP.

Czego potrzebujesz

Sprzęt:

  • 2 płytki ESP z modułami IEEE 802.15.4.
  • 1 płytka graniczna z wątkami ESP.

Oprogramowanie:

2. Pierwsze kroki

  1. Instalacja ESP-IDF.

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

  1. Skopiuj pakiet SDK routera granic wątków ESP.

ESP-THREAD-BR to oficjalny pakiet SDK routera granic wątków ESP. Obsługuje wszystkie podstawowe funkcje sieciowe, pozwalając na tworzenie routerów granicowych typu Thread, i integruje zaawansowane funkcje na poziomie usługi, co przyspiesza produkcję.

$ cd <your-local-workspace>
$ git clone --recursive https://github.com/espressif/esp-thread-br.git

3. Tworzenie i flashowanie

Informacje o tworzeniu i flashowaniu pliku binarnego ot-cli-ftd na tablicach ESP z modułami IEEE 802.15.4 znajdziesz w przykładowym pliku ESP-IDF ot_cli:

$ cd <your-idf-path>/examples/openthread/ot_cli
$ idf.py set-target <your-board-type>

Włącz funkcję łączenia za pomocą konfiguracji menu:

$ idf.py menuconfig

Konfiguracja komponentu > OpenThread > Włącz Joiner, a potem skompiluj i Flash.

$ idf.py -p <your-local-port> build flash monitor

Jeśli chcesz utworzyć plik binarny ot-br na płytce routera granicznego Thread ESP i przeprowadzić aktualizację, musisz najpierw utworzyć plik binarny RCP. Ten plik binarny RCP nie musi być jawnie udostępniany na urządzeniu na płytce routera granicznego ESP. Zostanie on umieszczony w pliku binarnym routera Border Router i zostanie przesłany do układu ESP32-H2 przy pierwszym uruchomieniu (lub przy zmianie oprogramowania układowego RCP). Więcej informacji znajdziesz w dokumentacji BR Thread ESP:

$ 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ą konfiguracji menu:

$ idf.py menuconfig

Konfiguracja komponentu > OpenThread > Włącz funkcję komisarza, a następnie utwórz kompilację i Flash.

$ idf.py -p <your-local-port> build flash monitor

4. Tworzenie sieci Thread na routerze Thread Border

Teraz możesz utworzyć sieć Thread przy użyciu wiersza poleceń OpenThread na platformie ESP Thread Border Router Board (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

Rozpoczynanie operacji 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

Za chwilę sprawdź stan urządzenia. To powinien być lider.

> state
leader
Done
> 

5. Dołączanie do sieci Thread za pomocą klucza sieci

W ramach tego ćwiczenia w programie 2 płyty ESP z modułami IEEE 802.15.4 są przygotowane do połączenia z siecią utworzoną w BR. Podczas tej sesji dodamy do sieci kartę Board1.

Pobierz klucz sieci z BR:

## BR Commissioner ##
----------------------
> networkkey
731ab6a60a64a0a0b14b259b86b2be01
Done
> 

Ustaw ten klucz sieci na 1 płytkę ESP (złączenie 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

Rozpoczynanie operacji 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

Za chwilę sprawdź stan urządzenia. Powinien to być element podrzędny.

> 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 w ramach bezpiecznego uruchamiania

W tej sesji dodamy do sieci usługę Board2 w ramach uruchamiania zabezpieczeń:

Uzyskaj PSKc i panuj z komisarza Brazylii:

## BR Commissioner ##
----------------------
> pskc
54e7f18d2575014da94db09df29c5df0
Done
> panid
0x1444
Done

Skonfiguruj informacje o sieci na potrzeby 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 kartę eui64 z tablicy Board2:

## Board2 Joiner ##
----------------------
> eui64
4831b7fffec02be1
Done

W polu BR Commissioner (Komisarz Brazylii) uruchom funkcję komisarza i podaj eui64 urządzenia, które można dołączyć, wraz z danym uwierzytelniającym, na przykład J01NME. Dane logowania łączenia

## BR Commissioner ##
----------------------
> commissioner start
Commissioner: petitioning
Done
Commissioner: active
> commissioner joiner add 4831b7fffec02be1 J01NME
Done

Przejdź do opcji Board2 Joiner. Rozpocznij rolę łączenia za pomocą certyfikatu łączenia utworzonego na koncie komisarza BRA:

## Board2 Joiner ##
----------------------
> ifconfig up
Done
> joiner start J01NME
Done

Po około minucie otrzymasz potwierdzenie udanego uwierzytelnienia:

## Board2 Joiner ##
----------------------
>
Join success

Potem możesz utworzyć sieć Thread utworzoną przez komisarza BRA i do niej dołączyć.

Rozpoczynanie operacji 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 otrzymasz sieć Thread o topologii widocznej poniżej:

esp_ot_tp_LRR.jpg

7. Pingowanie adresu IPv6 między węzłami Thread

Polecenia ping można używać do komunikacji między dowolnymi 2 tablicami. Użyj polecenia ipaddr, aby wydrukować 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

Aby na przykład wysłać ping do Board2 MLE-ID od komisarza BRA, 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 przy użyciu protokołu UDP

Z tej sesji dowiesz się, jak wysyłać wiadomości między 2 urządzeniami Thread. Na przykład otwórz program udp i powiąż go na porcie 20617 oraz nasłuchuj dla 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 tablicy 1 na adres MLE-ID BR i na 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 przy użyciu tablic ESP.

esp_ot_final_topology.jpg

Wiesz już:

  • Tworzenie i flashowanie plików binarnych interfejsu wiersza poleceń OpenThread na płytki ESP.
  • Tworzę migający router graniczny do płytki routera granicznego ESP.
  • Ręczne zarządzanie węzłami Thread za pomocą Monitora ESP i interfejsu wiersza poleceń OpenThread.
  • Tworzę sieć Thread na routerze Thread Border.
  • Zabezpieczanie uruchamiania urządzeń w sieci Thread.
  • Pingowanie adresu IPv6 między węzłami Thread.
  • Przekazywanie wiadomości między węzłami wątków przy użyciu protokołu UDP.

Więcej informacji

Na stronach openthread.io i GitHub znajdziesz różne zasoby OpenThread, w tym:

Numer referencyjny: