Crea una rete Thread con la scheda router di confine Thread ESP32H2 ed ESP

1. Introduzione

26b7f4f6b3ea0700.png

OpenThread, rilasciato dal team Google Nest, è un'implementazione open source del protocollo di rete Thread® progettata per accelerare lo sviluppo di prodotti per la casa connessa. La specifica Thread definisce un protocollo di comunicazione wireless da dispositivo a dispositivo affidabile, sicuro e a basso consumo basato su IPv6 per applicazioni domestiche ed edifici commerciali.

Espressif ha eseguito il porting dello stack OpenThread basato su FreeRTOS e LwIP, consentendo agli sviluppatori di creare rapidamente reti Thread. Il codice sorgente correlato può essere ottenuto da GitHub. Allo stesso tempo, Espressif ha implementato anche un Thread border router basato su RTOS.

In questo codelab, programmerai OpenThread su hardware reale, creerai e gestirai una rete Thread e trasmetterai messaggi tra i nodi.

Espressif_hardware_setup.jpg

Obiettivi didattici

  • Creare e caricare i file binari dell'interfaccia a riga di comando di OpenThread sulle schede ESP.
  • Creare e caricare il router di confine sulla scheda del router di confine Thread ESP.
  • Gestire manualmente i nodi Thread con ESP Monitor e l'interfaccia a riga di comando di OpenThread.
  • Formare una rete Thread sul router di confine Thread.
  • Proteggere la messa in servizio dei dispositivi su una rete Thread.
  • Eseguire il ping dell'indirizzo IPv6 tra i nodi Thread.
  • Trasmettere messaggi tra i nodi Thread con UDP.

Che cosa ti serve

Hardware:

  • 2 schede ESP con moduli IEEE 802.15.4.
  • 1 scheda Thread border router ESP.

Software:

2. Per iniziare

  1. Installazione di ESP-IDF.

Segui la guida alla programmazione ESP-IDF per installare l'ambiente di sviluppo software.

  1. Clona l'SDK del Thread border router ESP.

ESP-THREAD-BR è l'SDK ufficiale del Thread border router ESP. Supporta tutte le funzionalità di rete fondamentali per creare un Thread border router e integra funzionalità avanzate a livello di prodotto per una rapida commercializzazione.

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

3. Crea e carica

Per creare e caricare il file binario ot-cli-ftd sulle schede ESP con moduli IEEE 802.15.4, puoi consultare l'esempio ot_cli di ESP-IDF per ulteriori dettagli:

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

Attiva la funzionalità di joiner tramite menuconfig:

$ idf.py menuconfig

Configurazione componente > OpenThread > Abilita joiner, quindi crea e carica.

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

Per creare e caricare il file binario ot-br sulla scheda Thread border router ESP, devi prima creare il file binario RCP. Questo file binario RCP non deve essere caricato esplicitamente sul dispositivo sulla scheda del router di confine Thread ESP. Verrà incluso nel file binario del router di confine e caricato sul chip ESP32-H2 al primo avvio (o se il firmware RCP è stato modificato). Per ulteriori dettagli, consulta la documentazione del router di confine 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

Attiva la funzionalità di commissione tramite menuconfig:

$ idf.py menuconfig

Configurazione componente > OpenThread > Abilita commissione, quindi crea e carica.

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

4. Formare una rete Thread sul router di confine Thread

Ora puoi formare una rete Thread utilizzando la riga di comando OpenThread sulla scheda del router di confine Thread ESP (commissione del router di confine):

## 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

Esegui il commit di questo set di dati come quello attivo:

> dataset commit active
Done

Attiva l'interfaccia IPv6:

> ifconfig up
I (59329) OPENTHREAD: Platform UDP bound to port 49153
Done
I (59329) OT_STATE: netif up

Avvia l'operazione del protocollo 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

Dopo un po' di tempo, controlla lo stato del dispositivo. Dovrebbe essere il leader.

> state
leader
Done
> 

5. Connettersi alla rete Thread tramite networkkey

In questo codelab, due schede ESP con moduli IEEE 802.15.4 sono preparate per connettersi alla rete formata dal router di confine. In questa sessione aggiungeremo la scheda 1 alla rete.

Recupera la networkkey dal router di confine:

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

Imposta questa networkkey su una scheda ESP (joiner della scheda 1) con moduli IEEE 802.15.4:

## Board1 Joiner ##
----------------------
> dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01
Done

Esegui il commit di questo set di dati come quello attivo:

> dataset commit active
Done

Attiva l'interfaccia IPv6:

> ifconfig up
Done
I (20308) OT_STATE: netif up

Avvia l'operazione del protocollo 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

Dopo un po' di tempo, controlla lo stato del dispositivo. Dovrebbe essere il figlio.

> state
child
Done

Imposta il ruolo su Mesh Extender (denominato router nell'interfaccia a riga di comando e nei log).

> 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. Connettersi alla rete Thread tramite la messa in servizio sicura

In questa sessione aggiungeremo la scheda 2 alla rete tramite la messa in servizio di sicurezza:

Recupera PSKc e panid dal commissione del router di confine:

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

Configura le informazioni di rete per la scheda 2:

## Board2 Joiner ##
----------------------
> dataset pskc 54e7f18d2575014da94db09df29c5df0
Done
> dataset panid 0x1444
Done

Esegui il commit di questo set di dati come quello attivo:

## Board2 Joiner ##
----------------------
> dataset commit active 
Done

Attiva l'interfaccia IPv6:

## Board2 Joiner ##
----------------------
> ifconfig up
Done
I (29146) OT_STATE: netif up

Recupera eui64 dalla scheda 2:

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

Sul commissione del router di confine, avvia il commissione e specifica il eui64 del dispositivo che può connettersi, insieme alle credenziali del joiner, ad esempio J01NME. Le credenziali del joiner sono una stringa specifica del dispositivo composta da caratteri alfanumerici in maiuscolo (0-9 e A-Y, esclusi I, O, Q e Z per la leggibilità), con una lunghezza compresa tra 6 e 32 caratteri.

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

Passa al joiner della scheda 2. Avvia il ruolo di joiner con le credenziali del joiner che hai appena configurato sul commissione del router di confine:

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

Entro un minuto circa, riceverai una conferma dell'autenticazione riuscita:

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

Dopodiché, puoi avviare e connetterti alla rete Thread formata dal commissione del router di confine.

Avvia l'operazione del protocollo 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

Imposta il ruolo su Mesh Extender (denominato router nell'interfaccia a riga di comando e nei log).

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

Ora hai una rete Thread con la topologia mostrata di seguito:

esp_ot_tp_LRR.jpg

7. Eseguire il ping dell'indirizzo IPv6 tra i nodi Thread

Puoi utilizzare il comando ping per comunicare tra due schede qualsiasi. Utilizza il comando ipaddr per stampare l'indirizzo IPv6 di ogni scheda:

## 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

Ad esempio, per eseguire il ping dell'ID MLE della scheda 2 dal commissione del router di confine, puoi eseguire questo comando sul commissione del router di confine:

## 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. Trasmettere messaggi tra i nodi Thread con UDP

In questa sessione imparerai a inviare un messaggio tra due dispositivi Thread. Ad esempio, apri UDP, eseguine il binding sulla porta 20617 e ascolta tutti gli indirizzi sul router di confine:

## BR Commissioner ##
----------------------
> udp open
Done
> udp bind :: 20617
I (1298739) OPENTHREAD: Platform UDP bound to port 20617
Done

Poi invia un messaggio dalla scheda 1 all'indirizzo e alla porta 20617 dell'ID MLE del router di confine:

## Board1 Joiner ##
----------------------
> udp open
Done
> udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP

Puoi visualizzare il messaggio ricevuto sul router di confine:

## BR Commissioner ##
----------------------
3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP

9. Complimenti!

Hai creato una rete Thread fisica utilizzando le schede ESP.

esp_ot_final_topology.jpg

Ora sai:

  • Creare e caricare i file binari dell'interfaccia a riga di comando di OpenThread sulle schede ESP.
  • Creare e caricare il router di confine sulla scheda del router di confine Thread ESP.
  • Gestire manualmente i nodi Thread con ESP Monitor e l'interfaccia a riga di comando di OpenThread.
  • Formare una rete Thread sul router di confine Thread.
  • Proteggere la messa in servizio dei dispositivi su una rete Thread.
  • Eseguire il ping dell'indirizzo IPv6 tra i nodi Thread.
  • Trasmettere messaggi tra i nodi Thread con UDP.

Per approfondire

Consulta openthread.io e GitHub per una serie di risorse OpenThread, tra cui:

Riferimento: