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

1. Introduzione

26b7f4f6b3ea0700.png

OpenThread, rilasciato dal team di Google Nest, è un'implementazione open source del protocollo di rete Thread® progettato per accelerare lo sviluppo di prodotti per la casa connessa. La specifica Thread definisce un protocollo di comunicazione wireless affidabile, sicuro e a basso consumo basato su IPv6 per applicazioni domestiche e 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 router di confine Thread 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

  • Creazione e flashing dei file binari dell'interfaccia a riga di comando OpenThread sulle schede ESP.
  • Creazione e flashing del router di confine sulla scheda del router di confine ESP Thread.
  • Gestione manuale dei nodi Thread con ESP Monitor e l'interfaccia a riga di comando OpenThread.
  • Formare una rete Thread sul router di confine Thread.
  • Protezione del provisioning dei dispositivi su una rete Thread.
  • Ping dell'indirizzo IPv6 tra i nodi Thread.
  • Passaggio di messaggi tra nodi Thread con UDP.

Che cosa ti serve

Hardware:

  • 2 schede ESP con moduli IEEE 802.15.4.
  • 1 scheda del router di confine Thread 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 router di confine Thread ESP.

ESP-THREAD-BR è l'SDK ufficiale del router di confine Thread ESP. Supporta tutte le funzionalità di rete fondamentali per creare un router di confine Thread 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 fare riferimento all'esempio ESP-IDF ot_cli per maggiori dettagli:

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

Attiva la funzionalità di unione tramite menuconfig:

$ idf.py menuconfig

Configurazione componente > OpenThread > Attiva Joiner, quindi compila e carica.

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

Per creare e caricare il file binario ot-br sulla scheda del router di confine Thread ESP, devi prima creare il file binario RCP. Questo file binario RCP non deve essere flashato in modo esplicito 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 quando il firmware RCP viene modificato). Per ulteriori dettagli, consulta la documentazione 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

Attiva la funzionalità di provisioning tramite menuconfig:

$ idf.py menuconfig

Component config > OpenThread > Enable Commissioner, quindi compila 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 (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

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

> dataset commit active
Done

Visualizza 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 qualche istante, controlla lo stato del dispositivo. Dovrebbe essere il Leader.

> state
leader
Done
> 

5. Connettiti alla rete Thread tramite networkkey

In questo codelab, due schede ESP con moduli IEEE 802.15.4 vengono preparate per l'unione alla rete formata dal router di confine. In questa sessione aggiungeremo Board1 alla rete.

Ottieni la chiave di rete da BR:

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

Imposta questa chiave di rete su una scheda ESP (scheda 1 Joiner) 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

Visualizza 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 qualche istante, controlla lo stato del dispositivo. Deve essere il publisher secondario.

> state
child
Done

Imposta il ruolo su 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. Unirsi alla rete Thread tramite il provisioning sicuro

In questa sessione, aggiungeremo Board2 alla rete tramite il provisioning della sicurezza:

Recupera PSKc e panid dal commissario BR:

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

Configura le informazioni di rete per Board2:

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

Visualizza l'interfaccia IPv6:

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

Ottieni l'eui64 da Board2:

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

Su BR Commissioner, avvia il commissario e specifica il eui64 del dispositivo che può partecipare, insieme alle credenziali di Joiner, ad esempio J01NME. La credenziale di accoppiamento è una stringa specifica del dispositivo composta da caratteri alfanumerici maiuscoli (0-9 e A-Y, escluse I, O, Q e Z per 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 a Board2 Joiner. Inizia il ruolo di addetto alla giunzione con la credenziale di addetto alla giunzione che hai appena configurato sul BR Commissioner:

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

Entro un minuto circa, ricevi la conferma dell'autenticazione riuscita:

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

Dopodiché, puoi avviare e unirti alla rete Thread formata dal BR Commissioner.

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

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

esp_ot_tp_LRR.jpg

7. 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 di Board2 MLE-ID da BR Commissioner, puoi eseguire questo comando su 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. Passaggio di messaggi tra nodi Thread con UDP

In questa sessione, imparerai a inviare un messaggio tra due dispositivi Thread. Ad esempio, apri udp, associa la porta 20617 e ascolta tutti gli indirizzi su BR:

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

Quindi invia un messaggio da Board1 all'indirizzo e alla porta BR MLE-ID 20617:

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

Puoi visualizzare il messaggio ricevuto su BR:

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

  • Creazione e flashing dei file binari dell'interfaccia a riga di comando OpenThread sulle schede ESP.
  • Creazione di un router di confine lampeggiante sulla scheda ESP Thread Border Router.
  • Gestione manuale dei nodi Thread con ESP Monitor e l'interfaccia a riga di comando OpenThread.
  • Formare una rete Thread sul router di confine Thread.
  • Protezione del provisioning dei dispositivi su una rete Thread.
  • Ping dell'indirizzo IPv6 tra i nodi Thread.
  • Passaggio di messaggi tra nodi Thread con UDP.

Per approfondire

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

Riferimento: