Router di confine Thread - Multicast Thread 1.2

1. Introduzione

608c4c35050eb280.png

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:

5d0f36fd69ebcc9a.png

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:

b118448c98b2d583.png

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: