1. Introduzione
Cos'è un router di confine Thread?
Thread è un protocollo di rete mesh wireless a basso consumo basato su IP che consente comunicazioni protette da dispositivo a dispositivo e da dispositivo a cloud. Le reti di thread possono adattarsi alle modifiche della topologia per evitare un singolo punto di errore.
Un router di confine Thread collega una rete Thread a altre reti basate su IP, come il Wi-Fi o Ethernet. Una rete Thread richiede un router di confine per connettersi ad altre reti. Un router di confine thread supporta almeno in parte le seguenti funzioni:
- Connettività IP bidirezionale tra reti Thread e Wi-Fi/Ethernet.
- Service Discovery bidirezionale tramite mDNS (su link Wi-Fi/Ethernet) e SRP (su rete Thread).
- Infrastruttura di thread over che unisce le partizioni di thread su link basati su IP.
- Messa in servizio esterna di thread (ad esempio, un telefono cellulare) per l'autenticazione e l'unione di un dispositivo Thread a una rete Thread.
Il OpenBR Border Router (OTBR) rilasciato da Google è un'implementazione open source del router Thread Border.
Che cosa creerai
In questo codelab, configurerai un router di confine Thread e collegherai il tuo telefono cellulare a un dispositivo Thread End tramite il router di confine.
Cosa scoprirai
- Come configurare OTBR
- Come creare una rete Thread con OTBR
- Creare un'interfaccia a riga di comando 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 capacità di almeno 8 GB.
- 2 schede di sviluppo nRF52840 per i nordici Semiconductor.
- Un punto di accesso Wi-Fi senza IPv6 Router Advertisement Guard abilitato sul router.
- Un telefono iOS con almeno iOS 14 o telefono Android con almeno Android 8.1.
2. Configura OTBR
Configura Raspberry Pi
È facile configurare un nuovo dispositivo Raspberry Pi con lo strumento rpi-imager
seguendo le istruzioni disponibili all'indirizzo raspberrypi.org. Anziché utilizzare il sistema operativo Raspberry Pi più recente nello strumento, scarica 2021-05-07-raspios-buster-armhf-lite autonomamente). Per completare la procedura per il cellulare in questo codelab, devi collegare Raspberry Pi a un punto di accesso Wi-Fi. Segui questa guida per configurare la connettività wireless. È utile accedere a Raspberry Pi con SSH, puoi trovare le istruzioni qui.
Recupera codice OTBR
Accedi a Raspberry Pi e clona ot-br-posix
da GitHub:
$ git clone https://github.com/openthread/ot-br-posix.git --depth 1
Creazione e installazione di OTBR
OTBR ha due script che eseguono il bootstrap e la configurazione del router di confine del 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 di Thread viene creata dallo stesso OTBR e per impostazione predefinita viene denominata wpan0
e l'interfaccia dell'infrastruttura ha un valore predefinito di wlan0
se INFRA_IF_NAME
non è esplicitamente specificato. Se Raspberry Pi è collegato tramite cavo Ethernet, specifica il nome dell'interfaccia Ethernet (ad es. eth0
):
$ INFRA_IF_NAME=eth0 ./script/setup
Controlla se OTBR è stato 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)
È previsto che il servizio otbr-agent
non sia attivo perché richiede l'esecuzione di un chip RCP
.
Riavvia Raspberry Pi per applicare le modifiche.
Firmware RCP per build 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 della sezione Build a Thread network with nRF52840 boards and OpenThread codelab per creare e implementare un dispositivo RCP nRF52840:
$ script/build nrf52840 USB_trans
Avvia OTBR e verifica lo stato
Collega la scheda nRF52840 a 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 usato per controllare il servizio otbr-agent
. ot-ctl
accetta tutti i comandi dell'interfaccia a riga di comando di OpenThread, consulta la Guida dell'interfaccia a riga di comando di OpenThread per ulteriori dettagli.
Creare 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, dovresti vedere che OTBR funge da thread leader
e ha il prefisso off-mesh-routable
(OMR) nei dati della 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. Configura dispositivo finale client SRP
Interfaccia a riga di comando OT build e flash
Segui il passaggio 5 della rete Build a Thread with nRF52840 boards and OpenThread per creare e far lampeggiare un dispositivo di interfaccia a riga di comando nRF52840.
Tuttavia, anziché attivare OT_COMMISSIONER
e OT_JOINER
, il nodo CLI richiede funzionalità OT_SRP_CLIENT
e OT_ECDSA
.
Di conseguenza, la chiamata completa alla build dovrebbe avere questo aspetto:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Entra nella rete OTBR
Per entrare a far parte della rete Thread creata dal servizio otbr-agent
, dobbiamo recuperare il set di dati operativo attivo dal dispositivo OTBR. Torniamo alla riga di comando di otbr-agent
e recuperiamo il set di dati attivo:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Torna alla sessione della schermata del nodo client SRP e imposta il set di dati attivo:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Quindi, avvia l'interfaccia di Thread:
> ifconfig up Done > thread start Done
Attendi qualche secondo e verifica che l'unione alla rete Thread sia riuscita:
> 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 pubblicare servizi DNS-SD su link-local. Tuttavia, i messaggi multicast consumano troppa larghezza di banda e consumano rapidamente la batteria dei dispositivi a bassa potenza. Thread utilizza il protocollo SRP unicast per registrare i servizi offerti dal router di confine e si affida a quest'ultimo per pubblicizzare i servizi tramite link Wi-Fi o Ethernet.
Possiamo registrare un servizio con il comando srp client
.
Vai alla sessione della schermata del nodo 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 sul link Wi-Fi/Ethernet possa raggiungere un dispositivo finale Thread, l'indirizzo OMR del dispositivo finale deve essere pubblicizzato:
> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 Done
Alla fine, registra un falso servizio di _ipps._tcp
:
> srp client service add ot-service _ipps._tcp 12345 Done
Attendi qualche secondo. Dovremmo essere in grado di 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 passaggi di configurazione e il servizio _ipps._tcp
dovrebbe essere stato pubblicizzato tramite il link Wi-Fi/Ethernet. È ora di scoprire e raggiungere il dispositivo finale.
6. Scopri il servizio
Scopri il servizio con un telefono cellulare
Utilizziamo l'app Browser Browser per scoprire i servizi mDNS con il telefono Android, nonché un'app equivalente per i dispositivi mobili iOS. Apri l'app e il servizio _ipps._tcp
dovrebbe apparire.
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 = [] ...
Scopri 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 di fine
Ping da un telefono cellulare
Prendiamo come esempio il telefono Pixel: possiamo trovare l'indirizzo OMR del servizio registrato in precedenza "ot-service" nella pagina dei dettagli dell'istanza del servizio nell'app Service Browser.
Ora possiamo inviare un ping all'indirizzo OMR con un'altra app Analizzatore di rete.
Purtroppo, la versione Android dell'app Analizzatore di rete non supporta le query mDNS per l'utilità ping e non possiamo eseguire il ping direttamente del nome host ot-host.local
(possiamo eseguire il ping del nome host con la versione iOS dell'app).
Invia un ping da un host Linux/macOS
Thread Border Router invia gli annunci del router ICMPv6 (RA) per pubblicizzare i prefissi (tramite l'opzione delle informazioni sul prefisso) e le route (tramite l'opzione delle informazioni sul percorso) sul link Wi-Fi/Ethernet.
Prepara l'host Linux
È importante assicurarsi che RA e RIO siano abilitati sul vostro host:
net.ipv6.conf.wlan0.accept_ra
deve essere almeno1
se l'IP forwarding non è abilitato e2
in caso contrario.net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
non deve essere minore di64
.
il valore predefinito della variabile 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 andrà a sostituire accept_ra
in 0
). Puoi verificare il valore accept_ra
con:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
e imposta il valore su 1
(o 2
nel caso in cui l'inoltro IP sia attivato) 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
sulla maggior parte delle distribuzioni Linux è selezionata per impostazione predefinita 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
Le modifiche andranno perse dopo il riavvio dell'host. Ad esempio, aggiungi i comandi seguenti a /etc/sysctl.conf
per abilitare RIO in modo permanente:
$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
Potrebbe essere troppo tardi per modificare tali configurazioni, perché l'OTBR sta già inviando messaggi RA e l'intervallo tra due messaggi RA non richiesti potrebbe essere di centinaia di secondi. Un modo consiste nel disconnetterti e riconnetterti al Wi-Fi AP per inviare messaggi di richiesta di router in modo che l'OTBR risponda con richieste RA richieste. Un'altra opzione consiste nel riavviare la funzione Border Routing 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 non venga utilizzato il protocollo dhcpcd per gestire la rete IPv6/Ethernet Wi-Fi. Poiché dhcpcd sostituisce sempre l'opzione accept_ra
ogni volta che viene riavviata l'interfaccia, la configurazione accept_ra
verrà persa. Aggiungi righe di seguito al file di configurazione dhcpcd (ad es. /etc/dhcpcd.conf
) per disattivare esplicitamente IPv6 in dhcpcd:
noipv6 noipv6rs
Per applicare le modifiche, devi riavviare il computer.
Prepara l'host macOS
Entrambe le opzioni di accept_ra*
sono attivate per impostazione predefinita, ma devi eseguire l'upgrade del 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"
. Questo perché il comando ping
non risolve il nome ot-host.local.
con 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 direttamente all'indirizzo IPv6:
$ 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. Terminare la pubblicazione del servizio sul dispositivo finale
Per rimuovere l'indirizzo e il servizio registrati dal nodo client SRP:
> srp client host remove Done
Non dovresti essere in grado di trovare il servizio _ipps._tcp
ora.
9. Complimenti
Congratulazioni: hai configurato OTBR come router Border Border per fornire connettività IP bidirezionale e rilevamento dei servizi per i dispositivi finali Thread.
Passaggi successivi
Dai un'occhiata ad alcuni di questi codelab...