1. Einführung
Was ist ein Thread-Border-Router?
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 Of Failure zu vermeiden.
Ein Thread-Border-Router verbindet ein Thread-Netzwerk mit anderen IP-basierten Netzwerken, z. B. WLAN oder Ethernet. Ein Thread-Netzwerk erfordert einen Border-Router, um eine Verbindung zu anderen Netzwerken herzustellen. Ein Thread-Border-Router unterstützt mindestens die folgenden Funktionen:
- Bidirektionale IP-Verbindung zwischen Thread- und WLAN-/Ethernet-Netzwerken.
- Bidirektionale Diensterkennung über mDNS (über WLAN/Ethernet-Link) und SRP (im Thread-Netzwerk).
- Thread-over-Infrastructure, die Threadpartitionen über IP-basierte Links zusammenführt
- Externe Thread-Inbetriebnahme (z. B. ein Mobiltelefon), um sich zu authentifizieren und ein Thread-Gerät mit einem Thread-Netzwerk zu verbinden.
Der von Google veröffentlichte OpenThread Border Router (OTBR) ist eine Open-Source-Implementierung des Thread Border Routers.
Inhalt
In diesem Codelab richten Sie einen Thread-Border-Router ein und verbinden Ihr Smartphone über den Border-Router mit einem Thread-End-Gerät.
Lerninhalte
- OTBR einrichten
- Thread-Netzwerk mit OTBR erstellen
- So erstellen Sie ein OpenThread-CLI-Gerät mit dem SRP-Feature
- Einen Dienst mit SRP registrieren
- Hier erfahren Sie, wie Sie ein Thread-Endgerät finden und erreichen.
Voraussetzungen
- Ein Raspberry Pi 3/4-Gerät und eine SD-Karte mit mindestens 8 GB Kapazität
- 2 Nordische Halbleiter nRF52840-Entwicklerplatinen.
- Ein WLAN-AP ohne IPv6-Router-Advertising Guard, der auf dem Router aktiviert ist.
- iOS-Smartphone mit mindestens iOS 14 oder Android-Smartphone mit Android 8.1 oder höher
2. OTBR einrichten
Raspberry Pi einrichten
Das Einrichten eines neuen Raspberry Pi-Geräts mit dem rpi-imager
-Tool ist ganz einfach. Folgen Sie dazu der Anleitung auf raspberrypi.org. Statt das aktuelle Raspberry Pi OS im Tool zu verwenden, laden Sie 2021-05-07-raspios-buster-armhf-lite von Ihnen selbst. Für die Schritte auf dem Smartphone in diesem Codelab musst du den Raspberry Pi mit einem WLAN-AP verbinden. Folgen Sie dieser Anleitung, um eine kabellose Verbindung einzurichten. Es ist praktisch, sich über SSH mit dem Raspberry Pi anzumelden. Eine entsprechende Anleitung finden Sie hier.
OTBR-Code abrufen
Melden Sie sich bei Ihrem Raspberry Pi an und klonen Sie ot-br-posix
von GitHub:
$ git clone https://github.com/openthread/ot-br-posix.git --depth 1
OTBR erstellen und installieren
OTBR hat zwei Skripts, die das Bootstrap ausführen und den Thread-Border-Router einrichten:
$ cd ot-br-posix $ ./script/bootstrap $ INFRA_IF_NAME=wlan0 ./script/setup
OTBR funktioniert sowohl mit einer Thread-Schnittstelle als auch mit einer Infrastruktur-Netzwerkschnittstelle (z.B. WLAN/Ethernet), die mit INFRA_IF_NAME
angegeben ist. Die Thread-Schnittstelle wird von OTBR selbst erstellt und wpan0
genannt. Wenn nicht explizit INFRA_IF_NAME
angegeben ist, hat die Infrastrukturschnittstelle einen Standardwert von wlan0
. Wenn der Raspberry Pi über ein Ethernet-Kabel verbunden ist, geben Sie den Namen der Ethernet-Schnittstelle an (z.B. eth0
):
$ INFRA_IF_NAME=eth0 ./script/setup
Prüfen Sie, ob OTBR erfolgreich installiert wurde:
$ sudo service otbr-agent status ● otbr-agent.service - Border Router Agent Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2) Main PID: 2444 (code=exited, status=2)
Erwartet ist, dass der otbr-agent
-Dienst nicht aktiv ist, da dafür ein RCP
-Chip erforderlich ist.
Starten Sie den Raspberry Pi neu, damit die Änderungen wirksam werden.
Build- und Flash-RCP-Firmware
OTBR unterstützt einen 15.4-Funkchip im Radio Co-Processor-Modus (RCP). In diesem Modus wird der OpenThread-Stack auf der Hostseite ausgeführt und überträgt/empfängt Frames über den IEEE802.15.4-Transceiver.
FolgenSchritt 4 vonThread-Netzwerk mit nRF52840-Boards und OpenThread erstellen Codelab So erstellen Sie ein nRF52840-RCP-Gerät und laden es hoch:
$ script/build nrf52840 USB_trans
OTBR starten und Status prüfen
Verbinden Sie das nRF52840-Board mit dem Raspberry Pi und starten Sie den Dienst otbr-agent
:
$ sudo service otbr-agent restart
Prüfen Sie, ob der otbr-agent
-Dienst aktiv ist:
$ sudo service otbr-agent status ● otbr-agent.service - Border Router Agent Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago Main PID: 2997 (otbr-agent) Tasks: 1 (limit: 4915) CGroup: /system.slice/otbr-agent.service └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0 Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started. Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId] Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down
3. Thread-Netzwerk bilden
Es gibt einen ot-ctl
-Befehl, mit dem der otbr-agent
-Service gesteuert werden kann. ot-ctl
akzeptiert alle OpenThread-Befehlszeilenbefehle. Weitere Informationen finden Sie in der OpenThread-Befehlszeile.
Erstellen Sie ein Thread-Netzwerk mit OTBR:
$ sudo ot-ctl dataset init new Done $ sudo ot-ctl dataset commit active Done $ sudo ot-ctl ifconfig up Done $ sudo ot-ctl thread start Done
Warten Sie einige Sekunden. Wir sollten sehen, dass OTBR als Thread leader
fungiert und in den Thread-Netzwerkdaten das Präfix off-mesh-routable
(OMR) enthalten ist:
$ sudo ot-ctl state leader Done $ sudo ot-ctl netdata show Prefixes: Prefixes: fd76:a5d1:fcb0:1707::/64 paos med 4000 Routes: fd49:7770:7fc5:0::/64 s med 4000 Services: 44970 5d c000 s 4000 44970 01 9a04b000000e10 s 4000 Done $ sudo ot-ctl ipaddr fda8:5ce9:df1e:6620:0:ff:fe00:fc11 fda8:5ce9:df1e:6620:0:0:0:fc38 fda8:5ce9:df1e:6620:0:ff:fe00:fc10 fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9 fda8:5ce9:df1e:6620:0:ff:fe00:fc00 fda8:5ce9:df1e:6620:0:ff:fe00:4000 fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d fe80:0:0:0:a6:301c:3e9f:2f5b Done
4. SRP-Client-Endgerät einrichten
OT-Befehlszeile für Build und Flash
FolgenSchritt 5 vonThread-Netzwerk mit nRF52840-Boards und OpenThread erstellen Codelab um ein nRF52840-CLI-Endgerät zu erstellen und zu speichern.
Anstelle von OT_COMMISSIONER
und OT_JOINER
sind für den Befehlszeilenknoten jedoch die Features OT_SRP_CLIENT
und OT_ECDSA
erforderlich.
Der vollständige Build-Aufruf sollte also so aussehen:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Dem OTBR-Netzwerk beitreten
Damit Sie dem Thread-Netzwerk beitreten können, das vom otbr-agent
-Dienst erstellt wurde, müssen Sie das aktive Betriebs-Dataset vom OTBR-Gerät abrufen. Kehren Sie zur otbr-agent
-Befehlszeile zurück und rufen Sie das aktive Dataset ab:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Kehren Sie zur SRP-Client-Bildschirmsitzung zurück und legen Sie das aktive Dataset fest:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Starten Sie dann die Thread-Oberfläche:
> ifconfig up Done > thread start Done
Warten Sie einige Sekunden und prüfen Sie, ob der Beitritt zum Thread-Netzwerk erfolgreich war:
> state child Done > netdata show Prefixes: fd76:a5d1:fcb0:1707::/64 paos med 4000 Routes: fd49:7770:7fc5:0::/64 s med 4000 Services: 44970 5d c000 s 4000 44970 01 9a04b000000e10 s 4000 Done > ipaddr fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 fda8:5ce9:df1e:6620:0:ff:fe00:4001 fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba fe80:0:0:0:d4a9:39a0:abce:b02e Done
Achten Sie darauf, dass die Netzwerkdaten mit denen auf dem OTBR übereinstimmen. Wir können jetzt die OMR-Adresse von OTBR kontaktieren:
> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9 Done > 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms
5 Dienst auf dem Gerät veröffentlichen
mDNS ist weit verbreitet für die Veröffentlichung von DNS-SD-Diensten in Link-Local. Multicast-Nachrichten verbrauchen jedoch zu viel Bandbreite und belasten den Akku bei Geräten mit geringem Stromverbrauch schnell. Thread verwendet das Unicast-SRP-Protokoll, um seine Dienste beim Border Router zu registrieren, und nutzt den Border Router, um die Dienste über den WLAN- oder Ethernet-Link zu bewerben.
Wir können einen Dienst mit dem Befehl srp client
registrieren.
Rufen Sie die Bildschirmsitzung mit dem SRP-Clientknoten auf und starten Sie den SRP-Client automatisch:
> srp client autostart enable Done
Legen Sie den Hostnamen fest, der über die WLAN-/Ethernet-Verbindung beworben wird:
> srp client host name ot-host Done
Damit ein Gerät über den WLAN-/Ethernet-Link ein Thread-Endgerät erreichen kann, muss die OMR-Adresse des Endgeräts beworben werden:
> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 Done
Registrieren Sie am Ende einen gefälschten _ipps._tcp
-Dienst:
> srp client service add ot-service _ipps._tcp 12345 Done
Warten Sie einige Sekunden. Danach sollte der Dienst registriert sein:
> srp client service instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0 Done
Wir sind fertig eingerichtet und der _ipps._tcp
-Dienst sollte bereits über die WLAN-/Ethernet-Verbindung beworben worden sein. Jetzt ist es Zeit, das Endgerät zu entdecken!
6. Den Dienst entdecken
Entdecke den Dienst mit dem Smartphone
Wir verwenden die Service Browser App, um mDNS-Dienste mit dem Android-Smartphone zu erkennen. Eine äquivalente App gibt es auch für iOS-Mobilgeräte. Öffnen Sie die App. Jetzt sollte der Dienst _ipps._tcp
angezeigt werden.
Dienst mit einem Linux-Host entdecken
Wenn Sie den Dienst von einem anderen Linux-Host aus suchen möchten, können Sie den Befehl avahi-browse
verwenden.
Installieren Sie avahi-daemon
und avahi-utils
:
$ sudo apt-get install -y avahi-daemon avahi-utils
Lösen Sie den Dienst auf:
$ sudo service avahi-daemon start # Ensure the avahi daemon is started. $ avahi-browse -r _ipps._tcp + wlan0 IPv6 ot-service Secure Internet Printer local = wlan0 IPv6 ot-service Secure Internet Printer local hostname = [ot-host.local] address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927] port = [12345] txt = [] ...
Dienst mit einem macOS-Host finden
Sie können dns-sd
unter macOS verwenden, um den Dienst aufzulösen:
$ dns-sd -Z _ipps._tcp local. Browsing for _ipps._tcp.local. DATE: ---Sun 14 Mar 2021--- 21:31:42.125 ...STARTING... ; To direct clients to browse a different domain, substitute that domain in place of '@' lb._dns-sd._udp PTR @ ; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names. ; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local ; names with the correct fully-qualified (unicast) domain name of the target host offering the service. _ipps._tcp PTR ot-service._ipps._tcp ot-service._ipps._tcp SRV 0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host ot-service._ipps._tcp TXT "" ...
7. Endgerät anpingen
Ping von einem Smartphone
Nehmen wir als Beispiel das Pixel. Die OMR-Adresse des zuvor registrierten Dienstes otot-service“ finden Sie auf der Detailseite der Dienstinstanz der Service Browser-App.
Wir können die OMR-Adresse jetzt mit einer anderen Network Analyzer-App pingen.
Leider unterstützt die Android-Version der Network Analyzer App keine mDNS-Abfragen für das Ping-Dienstprogramm und wir können den Hostnamen ot-host.local
nicht direkt anpingen. Wir können den Hostnamen stattdessen mit der iOS-Version der App kontaktieren.
Ping von einem Linux-/MacOS-Host aus
Thread Border Router sendet ICMPv6-Router-Advertising (RA) zum Bewerben von Präfixen (über die Präfix-Informationsoption) und Routen (über Routeninformationen-Option) über den WLAN-/Ethernet-Link.
Linux-Host vorbereiten
Achten Sie unbedingt darauf, dass RA und RIO auf Ihrem Host aktiviert sind:
net.ipv6.conf.wlan0.accept_ra
sollte mindestens1
sein, wenn die IP-Weiterleitung nicht aktiviert ist. Andernfalls2
.net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
sollte nicht kleiner als64
sein.
accept_ra
ist für die meisten Distributionen standardmäßig auf 1
eingestellt. Es kann aber auch andere Netzwerk-Daemons geben, die diese Option überschreiben, z. B. überschreibt dhcpcd
auf Raspberry Pi accept_ra
durch 0
. Sie können den accept_ra
-Wert so prüfen:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
Setzen Sie den Wert auf 1
(oder 2
, falls die IP-Weiterleitung aktiviert ist):
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1 Net.ipv6.conf.wlan0.accept_ra = 1
Die Option accept_ra_rt_info_max_plen
ist auf den meisten Linux-Distributionen standardmäßig auf 0
eingestellt. Legen Sie dafür Folgendes mit 64
fest:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64 net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
Die Änderung geht nach dem Neustart des Hosts verloren. Hängen Sie beispielsweise die folgenden Befehle an /etc/sysctl.conf
an, um RIO dauerhaft zu aktivieren:
$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
Es kann zu spät sein, diese Konfigurationen zu ändern, da der OTBR bereits RA-Nachrichten gesendet hat und das Intervall zwischen zwei unerwünschten RA-Nachrichten mehrere hundert Sekunden betragen kann. Eine Möglichkeit besteht darin, die Verbindung zum WLAN-AP zu trennen und wiederherzustellen, um Nachrichten zur Routeranforderung zu senden, damit OTBR mit angeforderten RAs antwortet. Eine weitere Option ist, die Funktion orderBorder Routing“ (Border-Routing) auf dem Border Router neu zu starten:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
Wenn Sie eine Verbindung zum WLAN wiederherstellen oder die Ethernet-Schnittstelle neu starten, achten Sie darauf, dass dhcpcd nicht zur Verwaltung Ihres WLAN-/Ethernet-IPv6-Netzwerks verwendet wird. Da dhcpcd die Option accept_ra
jedes Mal überschreibt, wenn die Schnittstelle neu gestartet wird, geht Ihre accept_ra
-Konfiguration verloren. Hängen Sie unten an die dhcpcd-Konfigurationsdatei (z.B. /etc/dhcpcd.conf
) an, um IPv6 in dhcpcd explizit zu deaktivieren:
noipv6 noipv6rs
Sie müssen neu starten, damit die Änderung wirksam wird.
macOS-Host vorbereiten
Beide accept_ra*
-Optionen sind standardmäßig aktiviert, aber Sie müssen Ihr System auf mindestens macOS Big Sur aktualisieren.
Ping den Hostnamen oder die IPv6-Adresse
Der Hostname ot-host.local
kann jetzt mit dem Befehl ping -6
(ping6
für macOS) angepingt werden:
$ ping -6 ot-host.local. PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms ...
Dieser Befehl kann auf Linux-Hosts mit dem Fehler "Name or service not known"
fehlschlagen. Das liegt daran, dass der Befehl ping
den Namen ot-host.local.
nicht mit mDNS-Abfragen auflöst. Öffnen Sie /etc/nsswitch.conf
und fügen Sie mdns6_minimal
in die Zeile ein, die mit hosts
beginnt:
hosts: files mdns4_minimal mdns6_minimal dns
Natürlich können Sie die IPv6-Adresse jederzeit direkt anpingen:
$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms ...
8. Veröffentlichung des Dienstes durch Endgerät aufheben
So entfernen Sie die Adresse und den Dienst aus dem SRP-Clientknoten:
> srp client host remove Done
Sie sollten den _ipps._tcp
-Dienst jetzt nicht mehr erkennen können.
9. Glückwunsch
Glückwunsch! Sie haben OTBR als Thread-Border-Router eingerichtet, um Thread-Endgeräte bidirektionale IP-Verbindungen und Service Discovery bereitstellen zu können.
Was liegt als Nächstes an?
Dann sieh dir ein paar dieser Codelabs an...