1. Einführung
Was ist Thread?
Thread ist ein IP-basiertes drahtloses Mesh-Netzwerkprotokoll mit geringem Stromverbrauch, 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 Points of Failure 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 in einem heterogenen Netzwerk (Thread- und WLAN-/Ethernet-Netzwerksegmente) für Multicast-Adressen mit einem Bereich, der größer als „realm local“ ist.
Ein Thread-Border-Router registriert sein Backbone Router (BBR) Dataset und der ausgewählte BBR-Dienst ist der Primary Backbone Router (PBBR), der für die Multicast-Weiterleitung verantwortlich ist.
Ein Thread-Gerät sendet eine CoAP-Nachricht, um die Multicast-Adresse beim PBBR zu registrieren (Multicast Listener Registration, kurz MLR), wenn die Adresse größer als Realm-lokal ist. PBBR verwendet MLDv2 auf seiner externen Schnittstelle, um dem breiteren IPv6-LAN/WAN mitzuteilen, auf welche IPv6-Multicastgruppen es im Namen seines lokalen Thread-Netzwerks hören muss. Der PBBR leitet Multicast-Traffic nur dann in das Thread-Netzwerk weiter, wenn mindestens ein Thread-Gerät das Ziel abonniert hat.
Thread-Minimal-Endgeräte sind möglicherweise von ihrem übergeordneten Gerät abhängig, um die Multicast-Adresse zu aggregieren und MLR in ihrem Namen auszuführen, oder sie registrieren sich selbst, wenn ihr übergeordnetes Gerät Thread 1.1 ist.
Weitere Informationen finden Sie in der Thread-Spezifikation.
Aufgaben
In diesem Codelab richten Sie einen Thread-Border-Router und zwei Thread-Geräte ein und aktivieren und prüfen dann 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-Multicastadressen 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 von Nordic Semiconductor nRF52840 (einer für den RCP und zwei für Thread-Endgeräte).
2. OTBR einrichten
Am schnellsten lässt sich ein OTBR einrichten, wenn Sie der Anleitung für die Einrichtung von OTBR folgen.
Nachdem die OTBR-Einrichtung abgeschlossen ist, können Sie mit ot-ctl
prüfen, ob die OTBR innerhalb von 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-CLI-Anwendung mit Multicast und flashen Sie die beiden nRF52840 DK-Boards.
Firmware für nRF52840 DK erstellen
Folgen Sie der Anleitung zum Klonen des Projekts und Erstellen der nRF52840-Firmware.
$ 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 dem Thread-Netzwerk hinzufügen, um das Thread-Gerät dem Thread-Netzwerk hinzuzufügen. Wiederholen Sie den Vorgang für das zweite Thread-Endgerät.
4. IPv6-Multicastadresse abonnieren
ff05::abcd auf nRF52840-Endgerät 1 abonnieren:
> ipmaddr add ff05::abcd Done
Prüfen Sie, ob ff05::abcd
erfolgreich abonniert wurde:
> 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-Skript subscribe6.py
, um auf dem Laptop eine Multicast-Adresse 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
auf der 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 abonniert haben, werden wir in den folgenden Abschnitten die bidirektionale IPv6-Multicast-Erreichbarkeit überprüfen.
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.
ff05::abcd über die WLAN-Schnittstelle auf OTBR pingen:
$ 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 vom nRF52840-Endgerät 1 und vom Laptop empfangen kann, da beide ff05::abcd
abonniert haben. Das zeigt, dass der OTBR die Multicast-Pakete für IPv6-Ping-Anfragen vom WLAN an das Thread-Netzwerk weiterleiten kann.
6. Ausgehenden IPv6-Multicast prüfen
ff05::abcd auf nRF52840-Endgerät 2 pingen:
> 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 empfangen. Das zeigt, dass der OTBR die IPv6-Ping-Antwort-Multicast-Pakete vom Thread-Netzwerk an das WLAN weiterleiten kann.
7. Glückwunsch
Herzlichen Glückwunsch! Du hast einen Thread-Border-Router erfolgreich eingerichtet und die bidirektionale IPv6-Multicast-Funktion bestätigt.
Weitere Informationen zu OpenThread finden Sie unter openthread.io.
Referenzdokumente: