1. Introduzione
Che cos'è Thread?
Thread è un protocollo di rete mesh wireless a basso consumo basato su IP che consente comunicazioni sicure tra dispositivi e tra dispositivi e cloud. Le reti Thread possono adattarsi alle modifiche della topologia per evitare errori singoli.
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.
Multicast IPv6
Thread definisce una serie di funzionalità per supportare il multicast su una rete eterogenea (segmenti di rete Thread e Wi-Fi/Ethernet) per gli indirizzi multicast con un ambito più ampio del dominio locale.
Un router di confine Thread registra il proprio set di dati del router di dorsale (BBR) e il servizio BBR selezionato è il router di dorsale principale (PBBR), responsabile dell'inoltro in entrata/in uscita del multicast.
Un dispositivo Thread invia un messaggio CoAP per registrare l'indirizzo multicast nella PBBR (Multicast Listener Registration, in breve MLR) se l'indirizzo è più grande del realm locale. Il PBBR utilizza MLDv2 sulla sua interfaccia esterna per comunicare alla LAN/WAN IPv6 più grande i gruppi multicast IPv6 che deve ascoltare per conto della sua rete Thread locale. Inoltre, il PBBR inoltra il traffico multicast alla rete Thread solo se la destinazione è sottoscritta da almeno un dispositivo Thread.
Per i dispositivi di endpoint Thread minimal, possono dipendere dal dispositivo principale per aggregare l'indirizzo multicast ed eseguire l'MLR per loro conto oppure registrarsi se il dispositivo principale è Thread 1.1.
Per ulteriori dettagli, consulta la specifica Thread.
Cosa creerai
In questo codelab, configurerai un router di confine Thread e due dispositivi Thread, quindi attiverai e verificherai le funzionalità di multicast sui dispositivi Thread e Wi-Fi.
Cosa imparerai
- Come compilare il firmware nRF52840 con il supporto di IPv6 Multicast.
- Come iscriversi agli indirizzi multicast IPv6 sui dispositivi Thread.
Occorrente
- Una workstation Linux per compilare e eseguire il flashing di un RCP Thread, l'interfaccia a riga di comando OpenThread e testare il multicast IPv6.
- Un Raspberry Pi per il router di confine Thread.
- 2 dongle USB Nordic Semiconductor nRF52840 (uno per il RCP e due per i dispositivi di endpoint Thread).
2. Configura OTBR
Il modo più rapido per configurare un OTBR è seguire la guida alla configurazione degli OTBR.
Al termine della configurazione dell'OTBR, utilizza ot-ctl
per verificare che l'OTBR sia diventato il router backbone principale entro pochi secondi.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. Creare e eseguire il flashing dei dispositivi Thread
Crea l'applicazione Thread CLI con Multicast e esegui il flashing delle due schede DK nRF52840.
Compilare il firmware del DK nRF52840
Segui le istruzioni per clonare il progetto e compilare il firmware nRF52840.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
Procedi con il codelab Crea una rete Thread con schede nRF52840 e OpenThread come descritto. Dopo aver eseguito il flashing del dispositivo di destinazione con l'immagine CLI, segui la sezione Aggiungere il secondo nodo alla rete Thread per aggiungere il dispositivo Thread alla rete Thread. Ripeti l'operazione per il secondo dispositivo di endpoint Thread.
4. Abbonati all'indirizzo multicast IPv6
Abbonati a ff05::abcd sul dispositivo di destinazione nRF52840 1:
> ipmaddr add ff05::abcd Done
Verifica che l'abbonamento a ff05::abcd
sia andato a buon fine:
> ipmaddr ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 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
Abbonati a ff05::abcd sul laptop:
Abbiamo bisogno di uno script Python subscribe6.py
per abbonarci a un indirizzo multicast sul laptop.
Copia il codice riportato 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 iscriverti 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.
La topologia di rete finale con le iscrizioni multicast è mostrata di seguito:
Ora che abbiamo sottoscritto l'indirizzo multicast IPv6 sia sul dispositivo di destinazione nRF52840 1 nella rete Thread sia sul laptop nella rete Wi-Fi, verificheremo la connettività multicast IPv6 bidirezionale nelle sezioni seguenti.
5. Verifica la modalità multicast IPv6 in entrata
Ora dovremmo essere in grado di raggiungere sia il dispositivo finale nRF52840 1 nella rete Thread sia il laptop utilizzando l'indirizzo multicast IPv6 ff05::abcd
dalla rete Wi-Fi.
Esegui un ping a ff05::abcd sull'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 vedere che OTBR può ricevere due risposte ping sia dal dispositivo di destinazione nRF52840 1 sia dal laptop perché entrambi sono iscritti a ff05::abcd
. Ciò dimostra che l'OTBR può inoltrare i pacchetti multicast di richiesta di ping IPv6 dalla rete Wi-Fi alla rete Thread.
6. Verificare il multicast IPv6 in uscita
Esegui un ping a ff05::abcd sul dispositivo di destinazione 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 2 può ricevere risposte ai ping sia dal dispositivo finale nRF52840 1 sia dal laptop. Ciò dimostra che l'OTBR può inoltrare i pacchetti multicast di risposta ping IPv6 dalla rete Thread alla rete Wi-Fi.
7. Complimenti
Complimenti, hai configurato correttamente un router di confine Thread e verificato il multicast IPv6 bidirezionale.
Per saperne di più su OpenThread, visita il sito openthread.io.
Documenti di riferimento: