1. Introduzione
OpenThread, rilasciato dal team di 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 tra dispositivi wireless affidabile, sicuro e a basso consumo energetico basato su IPv6 per applicazioni in edifici domestici e commerciali.
Espressif ha eseguito la portabilità 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 anche implementato un router di confine Thread basato su RTOS.
In questo codelab programmi OpenThread su hardware reale, creerai e gestirai una rete Thread e passerai messaggi tra nodi.
Obiettivi didattici
- Creazione e flashing dei programmi binari OpenThread CLI sulle schede ESP.
- Costruire e lampeggiare il router di confine sulla scheda del router di confine ESP Thread.
- Gestione manuale dei nodi Thread con ESP Monitor e OpenThread CLI.
- Creazione di una rete Thread sul router di confine Thread.
- Protezione della messa in servizio dei dispositivi su una rete Thread.
- Pinging dell'indirizzo IPv6 tra i nodi Thread.
- Passaggio di messaggi tra nodi Thread con UDP.
Che cosa ti serve
Articoli di ferramenta:
Software:
2. Per iniziare
- Installazione di ESP-IDF.
Segui la guida alla programmazione di ESP-IDF per installare l'ambiente di sviluppo software.
- Clona l'SDK ESP Thread Border Router.
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 prodottizzazione.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Creazione e flash
Per creare e eseguire il flashing del file binario ot-cli-ftd sulle schede ESP con moduli IEEE 802.15.4, fai riferimento all'esempio di 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à joiner tramite menuconfig:
$ idf.py menuconfig
Configurazione componenti > OpenThread > Abilita Joiner, quindi build e flash.
$ idf.py -p <your-local-port> build flash monitor
Per creare e eseguire il flashing del file binario ot-br sulla scheda del router di confine del Thread ESP, devi prima creare il file binario RCP. Non è necessario eseguire il flashing di questo file binario RCP sul dispositivo sulla scheda del router di confine ESP Thread. Verrà incluso nel file binario del router di confine e verrà eseguito il flashing del chip ESP32-H2 al primo avvio (o quando il firmware RCP è stato modificato). Per ulteriori dettagli, puoi consultare la documentazione relativa a 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 funzione commissario tramite menuconfig:
$ idf.py menuconfig
Configurazione componenti > OpenThread > Abilita Commissioner, quindi build e flash.
$ idf.py -p <your-local-port> build flash monitor
4. Creazione di una rete Thread sul router di confine Thread
Ora puoi formare una rete Thread utilizzando la riga di comando OpenThread sulla 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
Esegui il commit di questo set di dati come 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, vengono preparate due schede ESP con moduli IEEE 802.15.4 per l'unione della rete formata in BR. 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 (Board1 Joiner) con moduli IEEE 802.15.4:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
Esegui il commit di questo set di dati come 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. Dovrebbe essere il Bambino.
> 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 >
6. Connettiti alla rete Thread tramite messa in servizio sicura
In questa sessione, aggiungeremo Board2 alla rete tramite Security Commissioning:
Ricevi il PSKc e il panido dal commissario BR:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Configura le informazioni di rete su Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Esegui il commit di questo set di dati come attivo:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Visualizza l'interfaccia IPv6:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Scarica eui64 da Board2:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
In BR Commissioner, avvia il commissario e specifica il eui64
del dispositivo che può partecipare, insieme alla qualifica per il join, ad esempio J01NME
. La credenziale Joiner è una stringa specifica del dispositivo di tutti i caratteri alfanumerici maiuscoli (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 Board2. Inizia il ruolo di joiner con la credenziale Joiner che hai appena configurato per BR Commissioner:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
Entro un minuto circa, riceverai la conferma dell'avvenuta autenticazione:
## Board2 Joiner ## ---------------------- > Join success
Successivamente, puoi avviare e unirti alla rete Thread formata dal commissario BR.
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:
7. ping degli indirizzi IPv6 tra nodi Thread
Puoi utilizzare il comando ping per comunicare tra due qualsiasi scheda. Usa 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 inviare un ping a 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 l'udp e associalo alla 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 BR MLE-ID e alla porta 20617
:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Puoi vedere 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.
Ora sai:
- Creazione e flashing dei programmi binari OpenThread CLI sulle schede ESP.
- Costruire un router di confine lampeggiante sulla scheda del router di confine Thread ESP.
- Gestione manuale dei nodi Thread con ESP Monitor e OpenThread CLI.
- Creazione di una rete Thread sul router di confine Thread.
- Protezione della messa in servizio dei dispositivi su una rete Thread.
- Pinging dell'indirizzo IPv6 tra i nodi Thread.
- Passaggio di messaggi tra nodi Thread con UDP.
Per approfondire
Dai un'occhiata a openthread.io e GitHub per trovare una serie di risorse OpenThread, tra cui:
- Piattaforme supportate: scopri tutte le piattaforme che supportano OpenThread
- Creare OpenThread: ulteriori dettagli su come creare e configurare OpenThread.
- Thread Primer: tratta tutti i concetti relativi ai thread presentati in questo codelab
Riferimento: