1. Introduzione
Che cos'è un router di confine Thread?
Thread è un protocollo di rete mesh wireless a basso consumo basato su IP che consente comunicazioni sicure tra dispositivi. Le reti Thread possono adattarsi ai cambiamenti di topologia per evitare single point of failure.
Un router di confine Thread collega una rete Thread ad altre reti basate su IP, ad esempio Wi-Fi o Ethernet. Una rete Thread richiede un router di confine per la connessione ad altre reti. Un router di confine Thread supporta almeno le seguenti funzioni:
- Connettività IP bidirezionale tra reti Thread e Wi-Fi/Ethernet.
- Service Discovery bidirezionale tramite mDNS (su collegamento Wi-Fi/Ethernet) e SRP (su rete Thread).
- Infrastruttura Thread-over che unisce le partizioni Thread sui link basati su IP.
- Thread esterno (ad esempio un cellulare) per autenticare e unire un dispositivo Thread a una rete Thread.
Il router di confine OpenThread (OTBR) rilasciato da Google è un'implementazione open source del router di confine Thread.
Cosa creerai
In questo codelab, configurerai un router di confine Thread e collegherai il tuo cellulare a un dispositivo di confine Thread tramite il router di confine.
Obiettivi didattici
- Come configurare OTBR
- Come formare una rete Thread con OTBR
- Come creare un dispositivo CLI OpenThread con la funzionalità SRP
- Come registrare un servizio con SRP
- Come trovare e raggiungere un dispositivo finale Thread.
Che cosa ti serve
- Un dispositivo Raspberry Pi 3/4 e una scheda SD con funzionalità di almeno 8 GB.
- 2 schede di sviluppo Nordic Semiconductor nRF52840.
- Un punto di accesso Wi-Fi senza Protezione pubblicità IPv6 per il router abilitato sul router.
- Un telefono con sistema operativo iOS 14 o Android 8.1 o versioni successive.
2. Configura OTBR
Configura Raspberry Pi
È facile configurare un nuovo dispositivo Raspberry Pi con lo strumento rpi-imager
seguendo le istruzioni su raspberrypi.org (anziché utilizzare l'ultima versione del Raspberry Pi nello strumento, scarica personalmente 2021-05-07-raspios-buster-armhf-lite). Per completare i passaggi relativi al telefono cellulare in questo codelab, devi collegare Raspberry Pi a un punto di accesso Wi-Fi. Segui questa guida per configurare la connettività wireless. È pratico accedere a Raspberry Pi con SSH. Puoi trovare le istruzioni qui.
Ottieni codice OTBR
Accedi al tuo Raspberry Pi e clona ot-br-posix
da GitHub:
$ git clone https://github.com/openthread/ot-br-posix.git --depth 1
Creare e installare OTBR
OTBR ha due script che eseguono il bootstrap e configurano il router di confine Thread:
$ cd ot-br-posix $ ./script/bootstrap $ INFRA_IF_NAME=wlan0 ./script/setup
OTBR funziona sia su un'interfaccia di Thread sia su un'interfaccia di rete dell'infrastruttura (ad esempio, Wi-Fi/Ethernet), specificata con INFRA_IF_NAME
. L'interfaccia Thread viene creata dallo stesso OTBR e denominata wpan0
per impostazione predefinita, mentre il valore predefinito dell'interfaccia dell'infrastruttura è wlan0
, se INFRA_IF_NAME
non è specificato esplicitamente. Se il tuo Raspberry Pi è collegato tramite un cavo Ethernet, specifica il nome dell'interfaccia Ethernet (ad esempio eth0
):
$ INFRA_IF_NAME=eth0 ./script/setup
Controlla se OTBR è installato correttamente:
$ sudo service otbr-agent status ● otbr-agent.service - Border Router Agent Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2) Main PID: 2444 (code=exited, status=2)
Si prevede che il servizio otbr-agent
non sia attivo perché richiede un chip RCP
per l'esecuzione.
Riavvia Raspberry Pi per applicare le modifiche.
Crea firmware RCP e Flash
OTBR supporta un chip radio 15,4 in modalità Radio Co-Processor (RCP). In questa modalità, lo stack OpenThread è in esecuzione sul lato host e trasmette/riceve frame sul ricetrasmettitore IEEE802.15.4.
Segui il passaggio 4 del Creazione di una rete Thread con schede nRF52840 e codelab OpenThread per creare e eseguire il flashing di un dispositivo RCP nRF52840:
$ script/build nrf52840 USB_trans
Avvia OTBR e verifica lo stato
Collega la scheda nRF52840 al tuo Raspberry Pi e avvia il servizio otbr-agent
:
$ sudo service otbr-agent restart
Verifica che il servizio otbr-agent
sia attivo:
$ sudo service otbr-agent status ● otbr-agent.service - Border Router Agent Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago Main PID: 2997 (otbr-agent) Tasks: 1 (limit: 4915) CGroup: /system.slice/otbr-agent.service └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0 Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started. Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId] Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down
3. Forma una rete Thread
Esiste un comando ot-ctl
che può essere utilizzato per controllare il servizio otbr-agent
. ot-ctl
accetta tutti i comandi dell'interfaccia a riga di comando di OpenThread, consulta la guida all'interfaccia a riga di comando di OpenThread per maggiori dettagli.
Forma una rete Thread con OTBR:
$ sudo ot-ctl dataset init new Done $ sudo ot-ctl dataset commit active Done $ sudo ot-ctl ifconfig up Done $ sudo ot-ctl thread start Done
Attendi qualche secondo, dovremmo vedere che OTBR funge da Thread leader
e c'è un prefisso off-mesh-routable
(OMR) nei dati di rete di Thread:
$ sudo ot-ctl state leader Done $ sudo ot-ctl netdata show Prefixes: Prefixes: fd76:a5d1:fcb0:1707::/64 paos med 4000 Routes: fd49:7770:7fc5:0::/64 s med 4000 Services: 44970 5d c000 s 4000 44970 01 9a04b000000e10 s 4000 Done $ sudo ot-ctl ipaddr fda8:5ce9:df1e:6620:0:ff:fe00:fc11 fda8:5ce9:df1e:6620:0:0:0:fc38 fda8:5ce9:df1e:6620:0:ff:fe00:fc10 fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9 fda8:5ce9:df1e:6620:0:ff:fe00:fc00 fda8:5ce9:df1e:6620:0:ff:fe00:4000 fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d fe80:0:0:0:a6:301c:3e9f:2f5b Done
4. Configurare un dispositivo client con SRP
Crea e flashizza l'interfaccia a riga di comando OT
Segui il passaggio 5 del costruisci una rete Thread con schede nRF52840 e openlab codelab per creare e flashare un dispositivo di interfaccia a riga di comando nRF52840.
Ma invece di avere OT_COMMISSIONER
e OT_JOINER
abilitati, il nodo dell'interfaccia a riga di comando richiede le funzionalità OT_SRP_CLIENT
e OT_ECDSA
.
Quindi la chiamata completa alla build dovrebbe avere il seguente aspetto:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Entra nella rete OTBR
Per partecipare alla rete Thread creata dal servizio otbr-agent
, dobbiamo recuperare il set di dati operativi attivi dal dispositivo OTBR. Torniamo alla riga di comando otbr-agent
e recuperiamo il set di dati attivo:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Torna alla sessione di schermata del nodo client SRP e imposta il set di dati attivo:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Avvia l'interfaccia Thread:
> ifconfig up Done > thread start Done
Attendi qualche secondo e verifica che l'accesso alla rete Thread sia riuscito:
> state child Done > netdata show Prefixes: fd76:a5d1:fcb0:1707::/64 paos med 4000 Routes: fd49:7770:7fc5:0::/64 s med 4000 Services: 44970 5d c000 s 4000 44970 01 9a04b000000e10 s 4000 Done > ipaddr fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 fda8:5ce9:df1e:6620:0:ff:fe00:4001 fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba fe80:0:0:0:d4a9:39a0:abce:b02e Done
Assicurati che i dati di rete corrispondano a quelli stampati su OTBR. Ora possiamo inviare un ping all'indirizzo OMR di OTBR:
> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9 Done > 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms
5. Pubblicare il Servizio sul Dispositivo finale
mDNS è stato ampiamente utilizzato per la pubblicazione di servizi DNS-SD su link locale. Tuttavia, i messaggi multicast consumano troppa larghezza di banda e consumano rapidamente la batteria dei dispositivi a basso consumo. Thread utilizza il protocollo SRP unicast per registrare i propri servizi presso il router di confine e si affida a quest'ultimo per pubblicizzare i servizi sul link Wi-Fi o Ethernet.
Possiamo registrare un servizio con il comando srp client
.
Vai alla sessione della schermata del nodo del client SRP e avvia automaticamente il client SRP:
> srp client autostart enable Done
Imposta il nome host che verrà pubblicizzato sul link Wi-Fi/Ethernet:
> srp client host name ot-host Done
Affinché un dispositivo collegato al link Wi-Fi/Ethernet possa raggiungere un dispositivo finale Thread, è necessario pubblicizzare l'indirizzo OMR del dispositivo finale:
> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 Done
Alla fine, registra un servizio _ipps._tcp
falso:
> srp client service add ot-service _ipps._tcp 12345 Done
Attendi qualche secondo e dovremmo vedere il servizio registrato:
> srp client service instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0 Done
Abbiamo completato tutti i lavori di configurazione e il servizio _ipps._tcp
dovrebbe essere stato pubblicizzato sul link Wi-Fi/Ethernet. È arrivato il momento di scoprire e raggiungere il dispositivo finale.
6. Scopri il servizio
Scoprire il servizio con un telefono cellulare
Utilizziamo l'app Service Browser per rilevare i servizi mDNS con il telefono Android. Puoi trovare un'App equivalente anche per i dispositivi mobili iOS. Apri l'app e dovrebbe essere visualizzato il servizio _ipps._tcp
.
Scopri il servizio con un host Linux
Se vuoi scoprire il servizio da un altro host Linux, puoi utilizzare il comando avahi-browse
.
Installa avahi-daemon
e avahi-utils
:
$ sudo apt-get install -y avahi-daemon avahi-utils
Risolvi il servizio:
$ sudo service avahi-daemon start # Ensure the avahi daemon is started. $ avahi-browse -r _ipps._tcp + wlan0 IPv6 ot-service Secure Internet Printer local = wlan0 IPv6 ot-service Secure Internet Printer local hostname = [ot-host.local] address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927] port = [12345] txt = [] ...
Scoprire il servizio con un host macOS
Puoi utilizzare dns-sd
su macOS per risolvere il servizio:
$ dns-sd -Z _ipps._tcp local. Browsing for _ipps._tcp.local. DATE: ---Sun 14 Mar 2021--- 21:31:42.125 ...STARTING... ; To direct clients to browse a different domain, substitute that domain in place of '@' lb._dns-sd._udp PTR @ ; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names. ; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local ; names with the correct fully-qualified (unicast) domain name of the target host offering the service. _ipps._tcp PTR ot-service._ipps._tcp ot-service._ipps._tcp SRV 0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host ot-service._ipps._tcp TXT "" ...
7. Invia un ping al dispositivo finale
Inviare un ping da un telefono cellulare
Prendiamo come esempio il telefono Pixel: possiamo trovare l'indirizzo OMR del servizio "ot-service" precedentemente registrato nella pagina dei dettagli dell'istanza del servizio nell'app del browser di servizi.
Ora possiamo inviare un ping all'indirizzo OMR con un'altra app Network Analyzer.
Purtroppo la versione Android dell'app Network Analyzer non supporta le query mDNS per l'utilità di ping e non possiamo inviare direttamente un ping del nome host ot-host.local
(possiamo eseguire il ping del nome host con la versione iOS dell'app).
Ping da un host Linux/macOS
Il router di confine Thread invia annunci del router ICMPv6 (RA) per pubblicizzare i prefissi (tramite l'opzione Informazioni prefisso) e le route (tramite l'opzione Informazioni percorso) sul link Wi-Fi/Ethernet.
Prepara host Linux
È importante assicurarsi che RA e RIO siano abilitati sul tuo host:
net.ipv6.conf.wlan0.accept_ra
deve essere almeno1
se l'inoltro IP non è abilitato, altrimenti2
.- Il valore di
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
non deve essere inferiore a64
.
Per impostazione predefinita, il valore predefinito di accept_ra
è 1
per la maggior parte delle distribuzioni. Tuttavia, potrebbero esserci altri daemon di rete che sostituiscono questa opzione (ad esempio, dhcpcd
su Raspberry Pi sostituirà accept_ra
su 0
). Puoi controllare il valore accept_ra
con:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
Imposta il valore su 1
(o 2
nel caso in cui sia abilitato l'inoltro IP) con:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1 Net.ipv6.conf.wlan0.accept_ra = 1
L'opzione accept_ra_rt_info_max_plen
per la maggior parte delle distribuzioni Linux è impostata in modo predefinito su 0
; impostala su 64
con:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64 net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
La modifica andrà persa dopo il riavvio dell'host. Ad esempio, aggiungi i comandi seguenti a /etc/sysctl.conf
per abilitare in modo permanente RIO:
$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
Potrebbe essere troppo tardi per modificare queste configurazioni perché l'OTBR ha già inviato messaggi RA e l'intervallo tra due messaggi RA non richiesti potrebbe essere di centinaia di secondi. Un modo è disconnettersi e riconnettersi al Wi-Fi AP per inviare messaggi di Richiesta Router in modo che OTBR risponda con RA richieste. Un'altra opzione è riavviare la funzione di routing del confine sul router di confine:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
Se stai tentando di riconnettere il Wi-Fi o di riavviare l'interfaccia Ethernet, assicurati che dhcpcd non sia utilizzato per gestire la rete Wi-Fi/Ethernet IPv6. Poiché dhcpcd sostituisce sempre l'opzione accept_ra
ogni volta che l'interfaccia viene riavviata e la configurazione di accept_ra
andrà persa. Aggiungi le righe seguenti al file di configurazione dhcpcd (ad es. /etc/dhcpcd.conf
) per disattivare esplicitamente IPv6 in dhcpcd:
noipv6 noipv6rs
Riavvia per applicare la modifica.
Prepara l'host macOS
Entrambe le opzioni di accept_ra*
sono attive per impostazione predefinita, ma devi eseguire l'upgrade del tuo sistema ad almeno macOS Big Sur.
Invia un ping al nome host o all'indirizzo IPv6
Ora possiamo inviare un ping al nome host ot-host.local
con il comando ping -6
(ping6
per macOS):
$ ping -6 ot-host.local. PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms ...
Questo comando potrebbe non riuscire sugli host Linux con l'errore "Name or service not known"
. Il motivo è che il comando ping
non risolve il nome ot-host.local.
con le query mDNS. Apri /etc/nsswitch.conf
e aggiungi mdns6_minimal
alla riga che inizia con hosts
:
hosts: files mdns4_minimal mdns6_minimal dns
Naturalmente, puoi sempre inviare un ping all'indirizzo IPv6 direttamente:
$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms ...
8. Il dispositivo finale annulla la pubblicazione del servizio
Per rimuovere l'indirizzo e il servizio registrati dal nodo client SRP:
> srp client host remove Done
Non dovresti essere in grado di scoprire il servizio _ipps._tcp
ora.
9. Congratulazioni
Congratulazioni. Hai configurato OTBR come router di confine Thread per offrire connettività IP bidirezionale e rilevamento dei servizi per i dispositivi finali Thread.
Passaggi successivi
Dai un'occhiata ad alcuni di questi codelab...