Router Border Thread - Thread 1.2 Multicast

1. Introduzione

608c4c35050eb280.png

Che cos'è 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 errori da punti singoli.

Che cos'è OpenThread?

OpenThread rilasciato da Google è un'implementazione open source di Thread®.

Che cos'è un router di confine OpenThread?

Il OpenBR Border Router (OTBR) rilasciato da Google è un'implementazione open source del router Thread Border.

Multicast del thread 1.2

Thread 1.2 definisce una serie di funzionalità per supportare il multicast su una rete eterogenea (segmenti Thread e Wi-Fi/Ethernet) per indirizzi multicast con ambito più grande del realm locale.

Un router di confine Thread 1.2 registra il proprio set di dati del router backbone (BBR) e il servizio BBR selezionato è il router backbone principale (PBBR), che è responsabile dell'ingresso/uscita in uscita del multicast.

Un dispositivo Thread 1.2 invia un messaggio CoAP per registrare l'indirizzo multicast alla PBBR (registrazione multicast Listener, MLR in breve) se l'indirizzo è più grande di realm local. PBBR utilizza MLDv2 sulla sua interfaccia esterna per comunicare alla più grande LAN/WAN IPv6 sui gruppi multicast IPv6 che deve ascoltare, per conto della sua rete Thread locale. Inoltre, PBBR inoltra il traffico multicast alla rete Thread se la destinazione è abbonata ad almeno un dispositivo Thread.

Per i dispositivi finali Thread 1.2 Minimal, possono dipendere dal loro genitore di aggregare l'indirizzo multicast e fare la MLR per loro conto, oppure si registrano se il loro padre è del Thread 1.1.

Per ulteriori dettagli, consulta la specifica del thread 1.2 Sezione 5.24 Inoltro multicast per ambiti più grandi di Realm-Local.

Che cosa realizzerai

In questo codelab, configurerai un router di confine Thread e due dispositivi Thread, quindi attiverai e verificherai le funzionalità multicast su dispositivi Thread e Wi-Fi.

Cosa imparerai

  • Come creare il firmware nRF52840 con le funzionalità multicast Thread 1.2.
  • Come abbonarsi agli indirizzi multicast IPv6 sui dispositivi Thread.

Che cosa ti serve

  • Un dispositivo Raspberry Pi 3/4 e una scheda SD con capacità di almeno 8 GB.
  • 3 schede Nordn Semiconductor nRF52840 DK.
  • Un punto di accesso Wi-Fi senza IPv6 Router Advertisement Guard abilitato sul router.
  • Laptop Linux/macOS (Raspberry Pi funziona anche) con Python3 installato.

2. Configura OTBR

Segui ilrouter bordi di thread - Connettività IPv6 bidirezionale e rilevamento dei servizi basati su DNS per configurare un router di confine Thread sul Raspberry Pi.

Al termine, Raspberry Pi dovrebbe aver creato una rete Thread funzionante ed essere collegato 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 per build e thread Flash

Crea l'applicazione dell'interfaccia a riga di comando Thread 1.2 con multicast e flash le due schede nRF52840 DK.

Crea 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 esadecimale creato correttamente è disponibile in ot-cli-ftd.hex.

Firmware Flash nRF52840 DK

Esegui il Flash del firmware su nRF52840 DK utilizzando nrfjprog, che fa parte degli strumenti della riga di comando nRF.

$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset

4. Collegare i dispositivi Thread alla rete Thread

OTBR ha creato una rete Thread nei passaggi precedenti. Ora possiamo aggiungere le DK nRF52840 alla rete Thread:

Recupera set di dati attivi non elaborato da OTBR:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Connettiti a una scheda DK nRF52840:

$ screen /dev/ttyACM0 115200

Configura il set di dati attivo per nRF52840 DK:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Avvia lo stack dei thread e attendi alcuni secondi, quindi 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 correttamente la rete Thread con 3 dispositivi Thread: OTBR e due schede nRF52840 DK.

5. Configura la rete Wi-Fi

Configura la rete Wi-Fi su OTBR e sul laptop in modo che siano collegati allo stesso punto di accesso Wi-Fi.

Possiamo utilizzare raspi-config per configurare l'SSID e la passphrase della rete Wi-Fi su Raspberry Pi OTBR.

La topologia di rete finale è mostrata di seguito:

5d0f36fd69ebcc9a.png

6. Abbonarsi all'indirizzo multicast IPv6

Abbonati a ff05::abcd sul dispositivo finale nRF52840 1:

> ipmaddr add ff05::abcd
Done

Verifica che l'abbonamento a ff05::abcd sia stato sottoscritto 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

Abbonati a ff05::abcd sul laptop:

Abbiamo bisogno di uno script Python subscribe6.py per iscriverti a un indirizzo multicast sul laptop.

Copia il codice in basso 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 sottoscrivere 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 abbonamenti multicast è riportata di seguito:

b118448c98b2d583.png

Ora che abbiamo sottoscritto l'indirizzo multicast IPv6 sulla rete Thread nRF52840 Thread nella rete Thread e sul laptop nella rete Wi-Fi, verificheremo la connettività multicast IPv6 bidirezionale nelle sezioni seguenti.

7. Verifica multicast IPv6 in entrata

Ora, saremo in grado di raggiungere sia il dispositivo finale nRF52840 sulla rete Thread sia il laptop utilizzando l'indirizzo multicast IPv6 ff05::abcd della 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!)

Possiamo notare che OTBR può ricevere due risposte di ping sia dal dispositivo finale nRF52840 che dal laptop, perché entrambi si sono iscritti a ff05::abcd. Ciò mostra che l'OTBR può inoltrare i pacchetti multicast di richiesta IPv6 Ping 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 2 può ricevere risposte ping dal dispositivo finale nRF52840 1 e dal laptop. Ciò mostra che l'OTBR può inoltrare i pacchetti multicast IPv6 Ping Response dalla rete Thread alla rete Wi-Fi.

9. Complimenti

Congratulazioni: hai configurato un router di confine thread e hai verificato il multicast IPv6 bidirezionale.

Per ulteriori informazioni su OpenThread, visita openthread.io.

Documenti di riferimento: