Thread-Border-Router – Thread 1.2 Multicast

1. Einführung

608c4c35050eb280.png

Was ist Thread?

Thread ist ein IP-basiertes, energiesparendes drahtloses Mesh-Netzwerkprotokoll, das eine sichere Kommunikation 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, veröffentlicht 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.

Thread 1.2 – Multicast

Thread 1.2 definiert eine Reihe von Funktionen zur Unterstützung von Multicast über ein heterogenes Netzwerk (Thread- und Wi-Fi/Ethernet-Netzwerksegmente) für Multicast-Adressen, deren Umfang größer als der lokale Bereich ist.

Ein Border-Router von Thread 1.2 registriert sein Dataset des Backbone Routers (BBR). Der ausgewählte BBR-Dienst ist der primäre Backbone Router (PBBR), der für die eingehende/ausgehende Multicast-Weiterleitung verantwortlich ist.

Ein Thread 1.2-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 der lokale Bereich ist. PBBR nutzt MLDv2 auf seiner externen Schnittstelle, um im Namen des lokalen Thread-Netzwerks über IPv6-Multicast-Gruppen mit dem größeren IPv6-LAN/WAN zu kommunizieren. Außerdem leitet PBBR den Multicast-Traffic nur dann an das Thread-Netzwerk weiter, wenn das Ziel von mindestens einem Thread-Gerät abonniert wurde.

Bei Thread 1.2 Minimal Endgeräten können sie sich darauf verlassen, dass ihr Elternteil die Multicast-Adresse aggregiert und MLR in ihrem Namen ausführt, oder sich selbst registrieren, wenn ihr übergeordnetes Netzwerk Thread 1.1 nutzt.

Weitere Informationen finden Sie unter Thread 1.2 Specification, Abschnitt 5.24 – Multicast-Weiterleitung für einen größeren als Realm-Local-Bereich.

Überblick

In diesem Codelab richten Sie einen Thread-Border-Router und zwei Thread-Geräte ein. Aktivieren und überprüfen Sie dann die Multicast-Funktionen auf Thread- und WLAN-Geräten.

Lerninhalte

  • nRF52840-Firmware mit Thread 1.2-Multicast-Funktionen erstellen.
  • So abonnieren Sie IPv6-Multicast-Adressen auf Thread-Geräten.

Voraussetzungen

  • Ein Raspberry Pi 3/4-Gerät und eine SD-Karte mit mindestens 8 GB Speicherkapazität
  • 3 nRF52840 DK-Platinen von Nordic Semiconductor
  • Ein Wi-Fi AP ohne IPv6 Router Advertising Guard auf dem Router.
  • Linux/macOS-Laptops (Raspberry Pi funktioniert auch) mit installiertem Python3

2. OTBR einrichten

Führen Sie das Codelab Thread Border Router – Bidirektionale IPv6-Konnektivität und DNS-basierte Diensterkennung aus, um einen Thread-Border-Router auf dem Raspberry Pi einzurichten.

Wenn der Vorgang abgeschlossen ist, sollte der Raspberry Pi ein funktionierendes Thread-Netzwerk erstellt und mit einem WLAN verbunden sein.

OTBR sollte innerhalb weniger Sekunden zum primären Backbone-Router werden.

$ 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. Build- und Flash-Thread-Geräte

Erstellen Sie die Thread 1.2 CLI-Anwendung mit Multicast und blinken Sie die beiden nRF52840 DK-Boards.

Build nRF52840 DK-Firmware

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

$ 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

Die erfolgreich erstellte HEX-Firmware finden Sie unter ot-cli-ftd.hex.

Flash nRF52840 DK-Firmware

Flashe die Firmware mit nrfjprog auf nRF52840 DK, das Teil der nRF-Befehlszeilentools ist.

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

4. Thread-Geräte mit dem Thread-Netzwerk verbinden

OTBR hat in den vorherigen Schritten ein Thread-Netzwerk erstellt. Jetzt können wir die nRF52840-DKs zum Thread-Netzwerk hinzufügen:

Rufen Sie die Rohdaten des aktiven Datasets aus OTBR ab:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Mit einer nRF52840 DK-Karte verbinden:

$ screen /dev/ttyACM0 115200

Konfigurieren Sie das aktive Dataset für den nRF52840 DK:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Starten Sie den Thread-Stack, warten Sie einige Sekunden und prüfen Sie, ob das Gerät erfolgreich verbunden wurde:

> ifconfig up
Done
> thread start
Done
> state
child

Wiederholen Sie die oben genannten Schritte, um die andere nRF52840 DK-Platine mit dem Thread-Netzwerk zu verbinden.

Wir haben das Thread-Netzwerk jetzt erfolgreich mit 3-Thread-Geräten eingerichtet: OTBR und zwei nRF52840 DK-Boards.

5. WLAN einrichten

Richten Sie das WLAN auf dem OTBR und dem Laptop ein, sodass sie mit demselben WLAN-ZP verbunden sind.

Wir können raspi-config verwenden, um die WLAN-SSID und -Passphrase auf dem Raspberry Pi OTBR einzurichten.

Die endgültige Netzwerktopologie sieht so aus:

5d0f36fd69ebcc9a.png

6. IPv6-Multicast-Adresse abonnieren

ff05::abcd auf nRF52840 Endgerät 1 abonnieren:

> ipmaddr add ff05::abcd
Done

Prüfen Sie, ob ff05::abcd abonniert wurde:

> 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

ff05::abcd auf dem Laptop abonnieren:

Wir benötigen ein Python-Skript 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 in der WLAN-Schnittstelle (z.B. wlan0) zu abonnieren:

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

Hier sehen Sie die endgültige Netzwerktopologie mit Multicast-Abos:

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 die bidirektionale IPv6-Multicast-Erreichbarkeit in den folgenden Abschnitten überprüfen.

7. Eingehenden IPv6-Multicast überprü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 können sehen, dass OTBR zwei Ping-Antworten sowohl vom nRF52840-Endgerät 1 als auch vom Laptop empfangen kann, weil beide ff05::abcd abonniert haben. Dies zeigt, dass das OTBR die IPv6-Ping-Anfrage-Multicast-Pakete vom WLAN an das Thread-Netzwerk weiterleiten kann.

8. Ausgehenden IPv6-Multicast bestätigen

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 empfangen. Dies zeigt, dass das OTBR die IPv6-Ping-Reply-Multicast-Pakete vom Thread-Netzwerk an das WLAN weiterleiten kann.

9. Glückwunsch

Herzlichen Glückwunsch! Sie haben erfolgreich einen Thread-Border-Router eingerichtet und das bidirektionale IPv6-Multicast verifiziert.

Weitere Informationen zu OpenThread finden Sie unter openthread.io.

Referenzdokumente: