1. Introduzione

OpenThread rilasciato da Google è un'implementazione open source del protocollo di rete Thread. Google Nest ha rilasciato OpenThread per rendere la tecnologia utilizzata nei prodotti Nest ampiamente disponibile agli sviluppatori, in modo da 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 le applicazioni domestiche. OpenThread implementa tutti i livelli di rete Thread, inclusi IPv6, 6LoWPAN, IEEE 802.15.4 con sicurezza MAC, Mesh Link Establishment e Mesh Routing.
Questo codelab ti guiderà nella simulazione di una rete Thread su dispositivi emulati utilizzando Docker.
Obiettivi didattici
- Come configurare la toolchain di compilazione OpenThread
- Come simulare una rete Thread
- Come autenticare i nodi Thread
- Come gestire una rete Thread con OpenThread Daemon
Che cosa ti serve
- Docker
- Conoscenza di base di Linux e del routing di rete
2. Configura Docker
Questo Codelab è progettato per utilizzare Docker su una macchina Linux, Mac OS X o Windows. Linux è l'ambiente consigliato.
Installa Docker
Installa Docker sul sistema operativo che preferisci.
Esegui il pull dell'immagine Docker
Una volta installato Docker, apri una finestra del terminale ed esegui il pull dell'immagine Docker openthread/environment. Questa immagine include OpenThread e OpenThread Daemon precompilati e pronti all'uso per questo codelab.
$ docker pull openthread/environment:latest
Tieni presente che il download completo potrebbe richiedere alcuni minuti.
In una finestra del terminale, avvia un container Docker dall'immagine e connettiti alla relativa shell bash:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
L'opzione --rm elimina il container quando esci. Non utilizzare questa opzione se non vuoi che il contenitore venga eliminato.
Prendi nota dei flag, che sono obbligatori per questo codelab:
--sysctl net.ipv6.conf.all.disable_ipv6=0: attiva l'IPv6 all'interno del contenitore--cap-add=net_admin: abilita la funzionalità NET_ADMIN, che consente di eseguire operazioni correlate alla rete, ad esempio l'aggiunta di route IP
Una volta nel contenitore, dovresti visualizzare un prompt simile a questo:
root@c0f3912a74ff:/#
Nell'esempio precedente, c0f3912a74ff è l'ID contenitore. L'ID contenitore per la tua istanza del contenitore Docker sarà diverso da quello mostrato nei prompt di questo Codelab.
Utilizzo di Docker
Questo codelab presuppone che tu conosca le basi dell'utilizzo di Docker. Devi rimanere nel container Docker per tutta la durata del codelab.
3. Simulare una rete Thread
L'applicazione di esempio che utilizzerai per questo codelab mostra un'applicazione OpenThread minima che espone le interfacce di configurazione e gestione di OpenThread tramite un'interfaccia a riga di comando (CLI) di base.
Questo esercizio illustra i passaggi minimi necessari per eseguire il ping di un dispositivo Thread emulato da un altro dispositivo Thread emulato.
La figura seguente descrive una topologia di rete Thread di base. Per questo esercizio, emuleremo i due nodi all'interno del cerchio verde: un leader Thread e un router Thread con una singola connessione tra loro.

Crea la rete
1. Avvia nodo 1
Se non l'hai ancora fatto, in una finestra del terminale avvia il container Docker e connettiti alla relativa shell bash:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
Nel container Docker, genera il processo CLI per un dispositivo Thread emulato utilizzando il binario ot-cli-ftd.
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
Nota:se non vedi il prompt > dopo aver eseguito questo comando, premi enter.
Questo file binario implementa un dispositivo OpenThread. Il driver radio IEEE 802.15.4 è implementato sopra UDP (i frame IEEE 802.15.4 vengono passati all'interno dei payload UDP).
L'argomento di 1 è un descrittore di file che rappresenta i bit meno significativi dell'EUI-64 IEEE "assegnato dalla fabbrica" per il dispositivo emulato. Questo valore viene utilizzato anche per il binding a una porta UDP per l'emulazione della radio IEEE 802.15.4 (porta = 9000 + descrittore di file). Ogni istanza di un dispositivo Thread emulato in questo Codelab utilizzerà un descrittore di file diverso.
Nota: utilizza solo descrittori di file 1 o superiori, come indicato in questo codelab, quando generi il processo per un dispositivo emulato. Un descrittore di file di 0 è riservato per altri usi.
Crea un nuovo set di dati operativo e eseguine il commit come attivo. Il set di dati operativo è la configurazione della rete Thread che stai creando.
> dataset init new Done > dataset Active Timestamp: 1 Channel: 20 Channel Mask: 07fff800 Ext PAN ID: d6263b6d857647da Mesh Local Prefix: fd61:2344:9a52:ede0/64 Network Key: e4344ca17d1dca2a33f064992f31f786 Network Name: OpenThread-c169 PAN ID: 0xc169 PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
Esegui il commit di questo set di dati come quello attivo:
> dataset commit active Done
Visualizza l'interfaccia IPv6:
> ifconfig up Done
Avvia l'operazione del protocollo Thread:
> thread start Done
Attendi qualche secondo e verifica che il dispositivo sia diventato il leader della rete Thread. Il leader è il dispositivo responsabile della gestione dell'assegnazione dell'ID router.
> state leader Done
Visualizza gli indirizzi IPv6 assegnati all'interfaccia Thread del nodo 1 (l'output sarà diverso):
> ipaddr fd61:2344:9a52:ede0:0:ff:fe00:fc00 fd61:2344:9a52:ede0:0:ff:fe00:5000 fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 fe80:0:0:0:94da:92ea:1353:4f3b Done
Prendi nota dei tipi di indirizzi IPv6 specifici:
- Inizia con
fd= mesh-local - Inizia con
fe80= locale rispetto al collegamento
I tipi di indirizzi locali della mesh sono ulteriormente classificati:
- Contiene
ff:fe00= Router Locator (RLOC) - Non contiene
ff:fe00= Endpoint Identifier (EID)
Identifica l'EID nell'output della console e annotalo per utilizzarlo in un secondo momento. Nell'output di esempio riportato sopra, l'EID è:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Avvio nodo 2
Apri un nuovo terminale ed esegui una shell bash nel contenitore Docker attualmente in esecuzione da utilizzare per il nodo 2.
$ docker exec -it codelab_otsim_ctnr bash
In questo nuovo prompt bash, avvia il processo CLI con l'argomento 2. Questo è il secondo dispositivo Thread emulato:
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
Nota:se non vedi il prompt > dopo aver eseguito questo comando, premi enter.
Configura la chiave di rete Thread e l'ID PAN utilizzando gli stessi valori del set di dati operativo del nodo 1:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
Esegui il commit di questo set di dati come quello attivo:
> dataset commit active Done
Visualizza l'interfaccia IPv6:
> ifconfig up Done
Avvia l'operazione del protocollo Thread:
> thread start Done
Il dispositivo verrà inizializzato come dispositivo per bambini. Un nodo secondario Thread è equivalente a un dispositivo finale, ovvero un dispositivo Thread che trasmette e riceve traffico unicast solo con un dispositivo principale.
> state child Done
Entro 2 minuti dovresti vedere lo stato passare da child a router. Un router Thread è in grado di instradare il traffico tra i dispositivi Thread. È anche chiamato genitore.
> state router Done
Verificare la rete
Un modo semplice per verificare la rete mesh è esaminare la tabella del router.
1. Verifica la connettività
Sul nodo 2, recupera RLOC16. RLOC16 sono gli ultimi 16 bit dell'indirizzo IPv6 RLOC del dispositivo.
> rloc16 5800 Done
Sul nodo 1, controlla la tabella del router per l'RLOC16 del nodo 2. Assicurati che il nodo 2 sia passato allo stato di router.
> router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+--------+-------+---+--------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
L'RLOC di 0x5800 del nodo 2 si trova nella tabella, a conferma che è connesso alla mesh.
2. Esegui il ping del nodo 1 dal nodo 2
Verifica la connettività tra i due dispositivi Thread emulati. Nel nodo 2, ping l'EID assegnato al nodo 1:
> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 > 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms
Premi enter per tornare al prompt della CLI >.
Testare la rete
Ora che puoi eseguire il ping tra due dispositivi Thread emulati, testa la rete mesh mettendo offline un nodo.
Torna al nodo 1 e interrompi il thread:
> thread stop Done
Passa al nodo 2 e controlla lo stato. Entro due minuti, il nodo 2 rileva che il leader (nodo 1) è offline e dovresti vedere il nodo 2 diventare il leader della rete:
> state router Done ... > state leader Done
Una volta confermato, arresta Thread e ripristina i dati di fabbrica di Node 2 prima di tornare al prompt di Docker bash. Il ripristino dei dati di fabbrica viene eseguito per garantire che le credenziali di rete Thread utilizzate in questo esercizio non vengano trasferite all'esercizio successivo.
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
Potresti dover premere enter alcune volte per visualizzare di nuovo il prompt > dopo un comando factoryreset. Non uscire dal container Docker.
Ripristina i dati di fabbrica ed esci dal nodo 1:
> factoryreset > > exit root@c0f3912a74ff:/#
Consulta la documentazione di riferimento per l'interfaccia a riga di comando di OpenThread per esplorare tutti i comandi CLI disponibili.
4. Autenticare i nodi con il provisioning
Nell'esercizio precedente hai configurato una rete Thread con due dispositivi simulati e verificato la connettività. Tuttavia, ciò consente solo il passaggio del traffico link-local IPv6 non autenticato tra i dispositivi. Per instradare il traffico IPv6 globale tra loro (e internet tramite un router di confine Thread), i nodi devono essere autenticati.
Per l'autenticazione, un dispositivo deve fungere da commissario. Il commissario è il server di autenticazione attualmente eletto per i nuovi dispositivi Thread e l'autorizzatore per la fornitura delle credenziali di rete necessarie per consentire ai dispositivi di accedere alla rete.
In questo esercizio, utilizzeremo la stessa topologia a due nodi di prima. Per l'autenticazione, il leader Thread fungerà da commissario, il router Thread da joiner.

Docker
Per ogni nodo (finestra del terminale) negli esercizi rimanenti, assicurati di eseguire il container Docker con la build OpenThread. Se continui dall'esercizio precedente, dovresti avere ancora due prompt bash aperti nello stesso container Docker. In caso contrario, consulta il passaggio Risoluzione dei problemi di Docker o ripeti l'esercizio Simula una rete Thread.
1. Crea una rete
Nel nodo 1, genera il processo CLI:
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
Nota:se non vedi il prompt > dopo aver eseguito questo comando, premi enter.
Crea un nuovo set di dati operativi, eseguine il commit come attivo e avvia il thread:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 12 Channel Mask: 07fff800 Ext PAN ID: e68d05794bf13052 Mesh Local Prefix: fd7d:ddf7:877b:8756/64 Network Key: a77fe1d03b0e8028a4e13213de38080e Network Name: OpenThread-8f37 PAN ID: 0x8f37 PSKc: f9debbc1532487984b17f92cd55b21fc Security Policy: 0, onrcb Done
Esegui il commit di questo set di dati come quello attivo:
> dataset commit active Done
Visualizza l'interfaccia IPv6:
> ifconfig up Done
Avvia l'operazione del protocollo Thread:
> thread start Done
Attendi qualche secondo e verifica che il dispositivo sia diventato un leader Thread:
> state leader Done
2. Avviare il ruolo di Commissario
Mentre ti trovi ancora sul nodo 1, avvia il ruolo di Commissario:
> commissioner start Done
Consenti a qualsiasi tecnico (utilizzando il carattere jolly *) con la credenziale di tecnico J01NME di ricevere commissioni sulla rete. Un Joiner è un dispositivo aggiunto da un amministratore umano a una rete Thread commissionata.
> commissioner joiner add * J01NME Done
3. Avviare il ruolo di Joiner
In una seconda finestra del terminale, nel container Docker, genera un nuovo processo CLI. Questo è il nodo 2.
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
Sul nodo 2, attiva il ruolo Joiner utilizzando la credenziale Joiner J01NME.
> ifconfig up Done > joiner start J01NME Done
... attendi qualche secondo per la conferma…
Join success
In qualità di dispositivo di unione, il dispositivo (nodo 2) si è autenticato correttamente con il commissario (nodo 1) e ha ricevuto le credenziali della rete Thread.
Ora che il nodo 2 è autenticato, avvia Thread:
> thread start Done
4. Convalida l'autenticazione di rete
Controlla state sul nodo 2 per verificare che sia stato aggiunto alla rete. Entro due minuti, il nodo 2 passa da child a router:
> state child Done ... > state router Done
5. Reimposta configurazione
Per prepararti all'esercizio successivo, reimposta la configurazione. Su ogni nodo, arresta Thread, esegui un ripristino dei dati di fabbrica ed esci dal dispositivo Thread emulato:
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
Potresti dover premere enter alcune volte per visualizzare di nuovo il prompt > dopo un comando factoryreset.
5. Gestire la rete con OpenThread Daemon
Per questo esercizio, simuleremo un'istanza CLI (un singolo dispositivo SoC Thread incorporato) e un'istanza RCP (Radio Co-Processor).
ot-daemon è una modalità dell'app OpenThread Posix che utilizza un socket UNIX come input e output, in modo che il core di OpenThread possa essere eseguito come servizio. Un client può comunicare con questo servizio connettendosi al socket utilizzando la CLI OpenThread come protocollo.
ot-ctl è una CLI fornita da ot-daemon per gestire e configurare RCP. In questo modo, collegheremo il RCP alla rete creata dal dispositivo Thread.
Docker
Per ogni nodo (finestra del terminale) di questo esercizio, assicurati di eseguire il container Docker con la build OpenThread. Se continui dall'esercizio precedente, dovresti avere già aperto due prompt bash nello stesso container Docker. In caso contrario, consulta il passaggio Risoluzione dei problemi di Docker.
Utilizzare ot-daemon
Questo esercizio utilizzerà tre finestre del terminale, corrispondenti a quanto segue:
- Istanza CLI del dispositivo Thread simulato (nodo 1)
- Processo
ot-daemon - Istanza della CLI
ot-ctl
1. Avvia nodo 1
Nella prima finestra del terminale, genera il processo CLI per il dispositivo Thread emulato:
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
Nota:se non vedi il prompt > dopo aver eseguito questo comando, premi enter.
Crea un nuovo set di dati operativi, eseguine il commit come attivo e avvia il thread:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 13 Channel Mask: 07fff800 Ext PAN ID: 97d584bcd493b824 Mesh Local Prefix: fd55:cf34:dea5:7994/64 Network Key: ba6e886c7af50598df1115fa07658a83 Network Name: OpenThread-34e4 PAN ID: 0x34e4 PSKc: 38d6fd32c866927a4dfcc06d79ae1192 Security Policy: 0, onrcb Done
Esegui il commit di questo set di dati come quello attivo:
> dataset commit active Done
Visualizza l'interfaccia IPv6:
> ifconfig up Done
Avvia l'operazione del protocollo Thread:
> thread start Done
Visualizza gli indirizzi IPv6 assegnati all'interfaccia Thread del nodo 1:
> ipaddr fd55:cf34:dea5:7994:0:ff:fe00:fc00 fd55:cf34:dea5:7994:0:ff:fe00:d000 fd55:cf34:dea5:7994:460:872c:e807:c4ab fe80:0:0:0:9cd8:aab6:482f:4cdc Done >
Come spiegato nel passaggio Simula una rete Thread, un indirizzo è link-local (fe80) e tre sono mesh-local (fd). L'EID è l'indirizzo mesh-local che non contiene ff:fe00. In questo output di esempio, l'EID è fd55:cf34:dea5:7994:460:872c:e807:c4ab.
Identifica l'EID specifico dall'output di ipaddr, che verrà utilizzato per comunicare con il nodo.
2. Avvia ot-daemon
Nella seconda finestra del terminale, crea un nodo del dispositivo tun e imposta le autorizzazioni di lettura/scrittura:
root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200 root@c0f3912a74ff:/# chmod 600 /dev/net/tun
Questo dispositivo viene utilizzato per la trasmissione e la ricezione di pacchetti nei dispositivi virtuali. Potresti ricevere un errore se il dispositivo è già stato creato. Si tratta di un comportamento normale che può essere ignorato.
Avvia ot-daemon per un nodo RCP, che chiameremo Nodo 2. Utilizza il flag dettagliato -v per visualizzare l'output del log e verificare che sia in esecuzione:
root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+forkpty:///openthread/build/examples/apps/ncp/ot-rcp?forkpty-arg=2'
In caso di esito positivo, ot-daemon in modalità dettagliata genera un output simile al seguente:
ot-daemon[31]: Running OPENTHREAD/297a880; POSIX; Feb 1 2022 04:43:39 ot-daemon[31]: Thread version: 3 ot-daemon[31]: Thread interface: wpan0 ot-daemon[31]: RCP version: OPENTHREAD/297a880; SIMULATION; Feb 1 2022 04:42:50
Lascia il terminale aperto e in esecuzione in background. Non inserirai altri comandi.
3. Utilizzare ot-ctl per connettersi alla rete
Non abbiamo ancora messo in servizio il nodo 2 (il ot-daemon RCP) su alcuna rete Thread. È qui che entra in gioco ot-ctl. ot-ctl utilizza la stessa CLI dell'app CLI OpenThread. Pertanto, puoi controllare i nodi ot-daemon nello stesso modo degli altri dispositivi Thread simulati.
Apri una terza finestra del terminale ed esegui il container esistente:
$ docker exec -it codelab_otsim_ctnr bash
Una volta nel container, avvia ot-ctl:
root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-ctl >
Utilizzerai ot-ctl in questa terza finestra del terminale per gestire il nodo 2 (il nodo RCP) che hai avviato nella seconda finestra del terminale con ot-daemon. Controlla state del nodo 2:
> state disabled Done
Ottieni il eui64 del nodo 2 per limitare l'unione al partecipante specifico:
> eui64 18b4300000000001 Done
Sul nodo 1 (prima finestra del terminale), avvia il commissario e limita l'accesso solo a questo eui64:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Nella terza finestra del terminale, visualizza l'interfaccia di rete per il nodo 2 e unisciti alla rete:
> ifconfig up Done > joiner start J01NME Done
... attendi qualche secondo per la conferma…
Join success
In qualità di Joiner, l'RCP (nodo 2) si è autenticato correttamente con il Commissioner (nodo 1) e ha ricevuto le credenziali della rete Thread.
Ora collega il nodo 2 alla rete Thread (di nuovo, nella terza finestra del terminale):
> thread start Done
4. Convalida l'autenticazione di rete
Nel terzo terminale, controlla state sul nodo 2 per verificare che sia stato aggiunto alla rete. Entro due minuti, il nodo 2 passa da child a router:
> state child Done ... > state router Done
5. Convalida la connettività
Nella terza finestra del terminale, esci da ot-ctl utilizzando Ctrl+D o il comando exit e torna alla console bash del container. Da questa console, esegui il ping del nodo 1 utilizzando il relativo EID con il comando ping6. Se l'istanza ot-daemon RCP è stata unita correttamente alla rete Thread e comunica con quest'ultima, il ping ha esito positivo:
root@c0f3912a74ff:/# ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms --- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms
6. Risoluzione dei problemi di Docker
Se hai chiuso il container Docker
bash richieste, potrebbe essere necessario verificare se è in esecuzione e riavviarlo / reinserirlo in base alle esigenze. I container Docker che hai creato senza utilizzare l'opzione --rm dovrebbero ancora esistere.
Per mostrare i container Docker in esecuzione:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 505fc57ffc72 environment "bash" 10 minutes ago Up 10 minutes codelab_otsim_ctnr
Per mostrare tutti i container Docker (in esecuzione e arrestati):
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 505fc57ffc72 environment "bash" 10 minutes ago Up 10 minutes codelab_otsim_ctnr
Se non vedi il contenitore codelab_otsim_ctnr nell'output di uno dei due comandi docker ps, esegui di nuovo il comando:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
Utilizza l'opzione --rm solo se vuoi che il container venga eliminato all'uscita.
Se il contenitore è arrestato (elencato in docker ps -a ma non in docker ps), riavvialo:
$ docker start -i codelab_otsim_ctnr
Se il container Docker è già in esecuzione (elencato in docker ps), riconnettiti al container in ogni terminale:
$ docker exec -it codelab_otsim_ctnr bash
Errori "Operazione non consentita"
Se si verificano errori Operation not permitted durante la creazione di nuovi nodi OpenThread (utilizzando il comando mknod), assicurati di eseguire Docker come utente root in base ai comandi forniti in questo Codelab. Questo Codelab non supporta l'esecuzione di Docker in modalità rootless.
7. Complimenti!
Hai simulato correttamente la tua prima rete Thread utilizzando OpenThread. Fantastico!
In questo Codelab hai imparato a:
- Avvia e gestisci il container Docker di simulazione OpenThread
- Simulare una rete Thread
- Autenticare i nodi Thread
- Gestire una rete Thread con OpenThread Daemon
Per saperne di più su Thread e OpenThread, consulta questi riferimenti:
- Thread Primer su openthread.io
- Specifiche di Thread
- Repository GitHub di OpenThread
- Riferimento della CLI OpenThread
- Supporto Docker aggiuntivo per OpenThread
In alternativa, prova a utilizzare OpenThread Border Router in un container Docker.