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