1. Einführung
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:
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: