Thread-Border-Router – IPv6-Multicast

1. Einführung

608c4c35050eb280.png

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:

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 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: