Thread-Border-Router – IPv6-Multicast

Informationen zu diesem Codelab
schedule17 Minuten
subjectZuletzt aktualisiert: 5. Mai 2025
account_circleVerfasst von Simon Lin, Jonathan Hui

1. Einführung

608c4c35050eb280.png

Was ist Thread?

Thread ist ein IP-basiertes, energieeffizientes drahtloses Mesh-Netzwerkprotokoll, das eine sichere Kommunikation zwischen Geräten und zwischen Geräten und der Cloud ermöglicht. Thread-Netzwerke können sich an Topologieänderungen anpassen, um Single-Point-Ausfälle zu vermeiden.

Was ist OpenThread?

OpenThread von Google ist eine Open-Source-Implementierung von Thread®.

Was ist ein OpenThread-Border-Router?

Der von Google veröffentlichte OpenThread Border Router (OTBR) ist eine Open-Source-Implementierung des Thread-Border-Routers.

IPv6-Multicast

Thread definiert eine Reihe von Funktionen zur Unterstützung von Multicast über ein heterogenes Netzwerk (Thread- und WLAN-/Ethernet-Netzwerksegmente) für Multicast-Adressen mit einem größeren Umfang als lokal im Realm.

Ein Thread-Border-Router registriert seinen Backbone-Router-Datensatz (BBR). Der ausgewählte BBR-Dienst ist der primäre Backbone-Router (PBBR), der für die ein- und ausgehende Weiterleitung von Multicast-Traffic verantwortlich ist.

Ein Thread-Gerät sendet eine CoAP-Nachricht, um die Multicast-Adresse bei der PBBR (Multicast Listener Registration, kurz MLR) zu registrieren, wenn die Adresse größer als lokal im Realm ist. PBBR verwendet MLDv2 auf seiner externen Schnittstelle, um im Namen seines lokalen Thread-Netzwerks mit dem erweiterten IPv6-LAN/WAN über IPv6-Multicastgruppen zu kommunizieren, auf die es hören muss. PBBR leitet Multicast-Traffic nur an das Thread-Netzwerk weiter, wenn das Ziel von mindestens einem Thread-Gerät abonniert wird.

Bei Thread-Minimalendgeräten ist möglicherweise das übergeordnete Gerät für die Aggregation der Multicast-Adresse und die MLR verantwortlich. Andernfalls müssen sich die Geräte selbst registrieren, wenn das übergeordnete Gerät Thread 1.1 verwendet.

Weitere Informationen finden Sie in der Thread-Spezifikation.

Überblick

In diesem Codelab richten Sie einen Thread-Border-Router und zwei Thread-Geräte ein. Anschließend aktivieren und prüfen Sie die Multicast-Funktionen auf Thread- und WLAN-Geräten.

Lerninhalte

  • So erstellen Sie nRF52840-Firmware mit Unterstützung für IPv6-Multicast.
  • So abonnieren Sie IPv6-Multicast-Adressen auf Thread-Geräten.

Voraussetzungen

  • Eine Linux-Workstation zum Erstellen und Flashen eines Thread-RCP, der OpenThread-Befehlszeile und zum Testen von IPv6-Multicast.
  • Ein Raspberry Pi für den Thread-Border-Router
  • 2 USB-Dongles vom Typ Nordic Semiconductor nRF52840 (einer für den RCP und zwei für Thread-Endgeräte)

2. OTBR einrichten

Am schnellsten richten Sie einen OTBR mithilfe der Anleitung zur Einrichtung von OTBRs ein.

Nachdem die OTBR-Einrichtung abgeschlossen ist, prüfen Sie mit ot-ctl, ob der OTBR innerhalb weniger Sekunden zum primären Backbone-Router geworden ist.

> bbr state
Primary
Done
> bbr
BBR Primary:
server16: 0xF800
seqno:    21
delay:    5 secs
timeout:  3600 secs
Done

3. Thread-Geräte erstellen und flashen

Erstellen Sie die Thread-Befehlszeilen-Anwendung mit Multicast und flashen Sie die beiden nRF52840 DK-Boards.

nRF52840 DK-Firmware erstellen

Folgen Sie der Anleitung, um das Projekt zu klonen und die nRF52840-Firmware zu erstellen.

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_MLR=ON

Fahren Sie mit dem Codelab zum Erstellen eines Thread-Netzwerks mit nRF52840-Boards und OpenThread fort. Nachdem das Endgerät mit dem CLI-Image geflasht wurde, folgen Sie der Anleitung unter Zweiten Knoten mit dem Thread-Netzwerk verbinden, um das Thread-Gerät dem Thread-Netzwerk hinzuzufügen. Wiederholen Sie diese Schritte für das zweite Thread-Endgerät.

4. IPv6-Multicast-Adresse abonnieren

Auf nRF52840-Endgerät 1 für ff05::abcd abonnieren:

> ipmaddr add ff05::abcd
Done

Prüfen, ob ff05::abcd abonniert ist:

> 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

ff05::abcd auf dem Laptop abonnieren:

Wir benötigen ein Python-Script subscribe6.py, um eine Multicast-Adresse auf dem Laptop zu abonnieren.

Kopieren Sie den folgenden Code und speichern Sie ihn als 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.')

Führen Sie subscribe6.py aus, um ff05::abcd über die WLAN-Netzwerkschnittstelle (z.B. wlan0) zu abonnieren:

$ sudo python3 subscribe6.py wlan0 ff05::abcd
Subscribed ff05::abcd on interface wlan0.
Press ENTER to quit.

Die endgültige Netzwerktopologie mit Multicast-Abos ist unten dargestellt:

b118448c98b2d583.png

Nachdem wir die IPv6-Multicast-Adresse sowohl auf dem nRF52840-Endgerät 1 im Thread-Netzwerk als auch auf dem Laptop im WLAN-Netzwerk abonniert haben, prüfen wir in den folgenden Abschnitten die bidirektionale IPv6-Multicast-Erreichbarkeit.

5. Eingehenden IPv6-Multicast prüfen

Jetzt sollten wir sowohl das nRF52840-Endgerät 1 im Thread-Netzwerk als auch den Laptop über die IPv6-Multicast-Adresse ff05::abcd aus dem WLAN erreichen können.

Ping ff05::abcd auf OTBR über die WLAN-Schnittstelle:

$ 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

Wir sehen, dass OTBR zwei Ping-Antworten sowohl vom nRF52840-Endgerät 1 als auch vom Laptop erhalten kann, da beide ff05::abcd abonniert haben. Das zeigt, dass der OTBR die IPv6-Ping-Anfrage-Multicast-Pakete vom WLAN an das Thread-Netzwerk weiterleiten kann.

6. Ausgehende IPv6-Multicast-Verbindung prüfen

Ping ff05::abcd auf nRF52840-Endgerät 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

Das nRF52840-Endgerät 2 kann Ping-Antworten sowohl vom nRF52840-Endgerät 1 als auch vom Laptop erhalten. Das zeigt, dass der OTBR die IPv6-Ping-Antwort-Multicast-Pakete aus dem Thread-Netzwerk an das WLAN weiterleiten kann.

7. Glückwunsch

Herzlichen Glückwunsch! Sie haben einen Thread-Border-Router eingerichtet und die bidirektionale IPv6-Multicast-Funktion überprüft.

Weitere Informationen zu OpenThread finden Sie unter openthread.io.

Referenzdokumente: