Thread-Border-Router – Thread 1.2-Multicast

1. Einführung

608c4c35050eb280.png

Was ist Thread?

Thread ist ein IP-basiertes stromsparendes Mesh-Netzwerk-Protokoll für sichere Geräte-zu-Gerät- und Geräte-zu-Cloud-Kommunikation. Thread-Netzwerke können sich an Topologieänderungen anpassen, um Single-Point-Fehler zu vermeiden.

Was ist OpenThread?

OpenThread, das von Google veröffentlicht wird, 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 in einem heterogenen Netzwerk (Thread- und WLAN-/Ethernet-Netzwerksegmente) für Multicast-Adressen, deren Bereich größer als der lokale Bereich ist.

Ein Thread 1.2 Border Router registriert sein Backbone-Router-Dataset (BBR) und der ausgewählte BBR-Dienst ist der primäre Backbone-Router (PBBR), der für das Eingehende/Ausgehende Multicast 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 verwendet MLDv2 auf der externen Schnittstelle, um im größeren IPv6-LAN/WAN über IPv6-Multicast-Gruppen zu kommunizieren, die im Namen des lokalen Thread-Netzwerks überwacht werden müssen. PBBR leitet Multicast-Traffic nur dann an das Thread-Netzwerk weiter, wenn das Ziel von mindestens einem Thread-Gerät abonniert wurde.

Für Thread 1.2 Minimal End-Geräte können sie davon abhängen, ob ihre Eltern die Multicast-Adresse aggregieren und MLR für sie ausführen oder sich selbst registrieren, wenn ihr übergeordnetes Element Thread 1.1 ist.

Weitere Informationen

Überblick

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

Lerninhalte

  • So erstellen Sie eine nRF52840-Firmware mit Thread 1.2-Multicast-Funktionen.
  • 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 Kapazität
  • 3 Nordische Halbleiter nRF52840 DK-Boards.
  • Ein WLAN-AP ohne IPv6-Router-Advertising Guard, der auf dem Router aktiviert ist.
  • Linux/macOS-Laptop (Raspberry Pi funktioniert auch mit Python3)

2. OTBR einrichten

Folgen Sie demThread Border Router – Bidirectional IPv6 Connectivity and DNS-Based Service Discovery -Codelab, um einen Thread-Border-Router auf dem Raspberry Manager einzurichten. Pi.

Anschließend sollte der Raspberry Pi ein funktionierendes Thread-Netzwerk erstellt und mit einem WLAN verbunden haben.

OTBR sollte innerhalb von 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-Befehlszeilenanwendung mit Multicast und blinken Sie die beiden nRF52840-DK-Boards.

nRF52840-DK-Firmware erstellen

Folgen Sie der Anleitung, um das Projekt zu klonen und die Firmware nRF52840 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

Laden Sie die Firmware unter Verwendung des nrfjprog, das Bestandteil der nRF-Befehlszeilentools ist, auf den nRF52840-DK herunter.

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

4. Thread-Geräte an das Thread-Netzwerk anhängen

OTBR hat in den vorherigen Schritten ein Thread-Netzwerk erstellt. Wir können nun die nRF52840-DKs dem Thread-Netzwerk hinzufügen:

Rufen Sie das aktive Roh-Dataset von OTBR ab:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Verbindung zu einem nRF52840-DK-Board herstellen:

$ screen /dev/ttyACM0 115200

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

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

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

> ifconfig up
Done
> thread start
Done
> state
child

Wiederholen Sie die obigen Schritte, um das andere nRF52840-DK-Board mit dem Thread-Netzwerk zu verbinden.

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

5 WLAN einrichten

Richten Sie das WLAN auf OTBR und dem Laptop so ein, dass sie mit demselben WLAN-AP verbunden sind.

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

Die endgültige Netzwerktopologie wird unten dargestellt:

5D0F36FD69ebcc9a.png

6. IPv6-Multicast-Adresse abonnieren

Abonniere ff05::abcd auf nRF52840 Gerät 1:

> ipmaddr add ff05::abcd
Done

Prüfen Sie, ob ff05::abcd erfolgreich 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

Abonnieren Sie auf dem Laptop ff05::abcd:

Wir benötigen ein Python-Skript subscribe6.py, um eine Multicast-Adresse auf dem Laptop zu abonnieren.

Kopieren Sie den Code unten 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-Schnittstelle zu abonnieren (z.B. wlan0):

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

Die endgültige Netzwerktopologie mit Multicast-Abos sieht so aus:

b118448c98b2d583.png

Nachdem wir die IPv6-Multicast-Adresse sowohl für das nRF52840-Endgerät 1 im Thread-Netzwerk als auch für den Laptop im WLAN abonniert haben, wird die bidirektionale Erreichbarkeit von IPv6-Multicast in den folgenden Abschnitten geprüft.

7. Eingehenden IPv6-Multicast prüfen

Jetzt sollte es möglich sein, sowohl das nRF52840-Endgerät 1 im Thread-Netzwerk als auch den Laptop mit der IPv6-Multicast-Adresse ff05::abcd aus dem WLAN zu erreichen.

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!)

Wir können sehen, dass OTBR sowohl vom nRF52840-Endgerät 1 als auch vom Laptop zwei Ping-Antworten empfangen kann, weil beide das ff05::abcd abonniert haben. Hier sehen Sie, dass der OTBR die Multicast-Pakete von IPv6-Ping-Anfragen vom WLAN-Netzwerk an das Thread-Netzwerk weiterleiten kann.

8. Ausgehenden IPv6-Multicast prüfen

Ping ff05::abcd auf nRF52840 Ende Gerä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 vom nRF52840-Endgerät 1 und vom Laptop erhalten. Hier sehen Sie, dass der OTBR die IPv6-Antwortpakete vom Typ PingPing Answer“ vom Thread-Netzwerk an das WLAN weiterleiten kann.

9. Glückwunsch

Herzlichen Glückwunsch, du hast einen Thread Border Router eingerichtet und das bidirektionale IPv6-Multicast geprüft.

Weitere Informationen zu OpenThread finden Sie unter openthread.io.

Referenzdokumente: