1. Introduzione
Cos'è Thread?
Thread è un protocollo di rete mesh wireless a basso consumo basato su IP che consente comunicazioni sicure tra dispositivi e cloud. Le reti Thread possono adattarsi alle modifiche della topologia per evitare errori a livello di singolo punto.
Che cos'è OpenThread?
OpenThread rilasciato da Google è un'implementazione open source di Thread®.
Che cos'è un router di confine OpenThread?
Il router di confine OpenThread (OTBR) rilasciato da Google è un'implementazione open source del router di confine Thread.
Thread 1.2 Multicast
Thread 1.2 definisce una serie di funzionalità per supportare il multicast in una rete eterogenea (segmenti di rete Thread e Wi-Fi/Ethernet) per indirizzi multicast con un ambito più ampio rispetto a quello locale dell'area di autenticazione.
Un router di confine Thread 1.2 registra il suo set di dati del router di backbone (BBR), e il servizio BBR selezionato è il router backbone primario (PBBR), responsabile dell'inoltro/in uscita multicast.
Un dispositivo Thread 1.2 invia un messaggio CoAP per registrare l'indirizzo multicast al PBBR (Multicast Listener Registration, MLR in breve) se l'indirizzo è più grande del realm local. PBBR utilizza MLDv2 sulla sua interfaccia esterna per comunicare con la più ampia LAN/WAN IPv6 su gruppi multicast IPv6 che ha bisogno di ascoltare, per conto della sua rete Thread locale. Inoltre, PBBR inoltra il traffico multicast alla rete Thread solo se la destinazione è sottoscritta da almeno un dispositivo Thread.
Per i dispositivi finali Thread 1.2 Minimal, possono dipendere dal loro genitore per aggregare l'indirizzo multicast e fare MLR per loro conto, o registrarsi se il loro padre è di Thread 1.1.
Per maggiori dettagli, consulta la Specifica del Thread 1.2, Sezione 5.24 Inoltro multicast per dimensioni superiori all'ambito Realm-Local.
Cosa creerai
In questo codelab, configurerai un router di confine Thread e due dispositivi Thread, quindi attiverai e verificherai le funzionalità multicast sui dispositivi Thread e Wi-Fi.
Cosa imparerai a fare
- Come sviluppare il firmware nRF52840 con le funzionalità Thread 1.2 Multicast.
- Come abbonarsi a indirizzi multicast IPv6 su dispositivi Thread.
Che cosa ti serve
- Un dispositivo Raspberry Pi 3/4 e una scheda SD con almeno 8 GB di capacità.
- 3 schede nRF52840 DK di Nordic Semiconductor.
- Un punto di accesso Wi-Fi senza IPv6 Router Pubblicità Guard abilitato sul router.
- Laptop Linux/macOS (funziona anche con Raspberry Pi) con Python3 installato.
2. Configura OTBR
Segui il codelab Thread Border Router - Bidirectional IPv6 Connect and DNS-Based Service Discovery per configurare un router di confine Thread su Raspberry Pi.
Al termine, Raspberry Pi dovrebbe aver creato una rete Thread funzionante ed essere connesso a una rete Wi-Fi.
OTBR dovrebbe diventare il router backbone principale in pochi secondi.
$ sudo ot-ctl bbr state Primary Done $ sudo ot-ctl bbr BBR Primary: server16: 0xD800 seqno: 23 delay: 1200 secs timeout: 3600 secs Done
3. Dispositivi Build e Flash Thread
Costruisci l'applicazione CLI Thread 1.2 con Multicast ed esegui il flashing delle due schede nRF52840 DK.
Build del firmware nRF52840 DK
Segui le istruzioni per clonare il progetto e creare il firmware nRF52840.
$ mkdir -p ~/src $ cd ~/src $ git clone --recurse-submodules --depth 1 https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx/ $ script/build nrf52840 USB_trans -DOT_MLR=ON -DOT_THREAD_VERSION=1.2 $ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex
Il firmware HEX costruito correttamente è disponibile all'indirizzo ot-cli-ftd.hex
.
Firmware Flash nRF52840 DK
Esegui il flashing del firmware su nRF52840 DK utilizzando nrfjprog
, che fa parte degli strumenti a riga di comando nRF.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. Collegare dispositivi Thread alla rete Thread
OTBR ha creato una rete Thread nei passaggi precedenti. Ora possiamo aggiungere le DK nRF52840 alla rete Thread:
Ottieni set di dati attivo non elaborato da OTBR:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Collegamento a una scheda nRF52840 DK:
$ screen /dev/ttyACM0 115200
Configura il set di dati attivo per nRF52840 DK:
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
Avvia lo stack Thread, attendi qualche secondo e verifica che il dispositivo sia stato collegato correttamente:
> ifconfig up Done > thread start Done > state child
Ripeti i passaggi precedenti per collegare l'altra scheda nRF52840 DK alla rete Thread.
Ora abbiamo configurato con successo la rete Thread con 3 dispositivi Thread: OTBR e due schede nRF52840 DK.
5. Configura rete Wi-Fi
Configura la rete Wi-Fi su OTBR e sul laptop in modo che siano connessi allo stesso punto di accesso Wi-Fi.
Possiamo utilizzare raspi-config per configurare l'SSID e la passphrase del Wi-Fi sull'OTBR di Raspberry Pi.
Di seguito è mostrata la topologia di rete finale:
6. Abbonati all'indirizzo multicast IPv6
Iscriviti a ff05::abcd sul dispositivo finale nRF52840 1:
> ipmaddr add ff05::abcd Done
Verifica che ff05::abcd
sia iscritto correttamente:
> ipmaddr ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff02:0:0:0:0:0:0:2 ff03:0:0:0:0:0:0:2 ff02:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:fc Done
Iscriviti a ff05::abcd sul laptop:
È necessario uno script Python subscribe6.py
per la sottoscrizione a un indirizzo multicast sul laptop.
Copia il codice di seguito e salvalo come subscribe6.py
:
import ctypes
import ctypes.util
import socket
import struct
import sys
libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')
Esegui subscribe6.py
per abbonarti a ff05::abcd
sull'interfaccia di rete Wi-Fi (ad es. wlan0):
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
Di seguito è mostrata la topologia di rete finale con abbonamenti multicast:
Ora che abbiamo sottoscritto l'indirizzo multicast IPv6 sia sul dispositivo finale 1 nRF52840 nella rete Thread che sul laptop nella rete Wi-Fi, verificheremo la connettività multicast IPv6 bidirezionale nelle sezioni seguenti.
7. Verifica multicast IPv6 in entrata
Ora dovremmo essere in grado di raggiungere sia il dispositivo finale nRF52840 1 nella rete Thread che il laptop utilizzando l'indirizzo multicast IPv6 ff05::abcd
dalla rete Wi-Fi.
Ping ff05::abcd su OTBR tramite l'interfaccia Wi-Fi:
$ ping -6 -b -t 5 -I wlan0 ff05::abcd PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!) # If using MacOS, use this command. The interface is typically not "wlan0" for Mac. $ ping6 -h 5 -I wlan0 ff05::abcd
Possiamo notare che OTBR può ricevere due risposte ping sia dal dispositivo finale 1 nRF52840 sia dal laptop perché entrambi sono abbonati a ff05::abcd
. Mostra che l'OTBR può inoltrare i pacchetti multicast IPv6 Ping Request dalla rete Wi-Fi alla rete Thread.
8. Verifica multicast IPv6 in uscita
Ping ff05::abcd sul dispositivo finale nRF52840 2:
> ping ff05::abcd 100 10 1 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms
Il dispositivo finale nRF52840 può ricevere risposte di ping sia dal dispositivo finale 1 che dal laptop. Questo mostra che l'OTBR può inoltrare i pacchetti multicast Risposta al ping IPv6 dalla rete Thread alla rete Wi-Fi.
9. Complimenti
Congratulazioni, hai configurato correttamente un router di confine Thread e hai verificato il multicast IPv6 bidirezionale.
Per saperne di più su OpenThread, visita openthread.io.
Documenti di riferimento: