1. Einführung
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 Thread-Border-Router?
Ein Thread-Border-Router verbindet ein Thread-Netzwerk mit anderen IP-basierten Netzwerken wie WLAN oder Ethernet. Ein Thread-Netzwerk benötigt 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-Verbindung) und SRP (über Thread-Netzwerk).
- Thread-over-Infrastructure, das Thread-Partitionen über IP-basierte Links zusammenführt.
- Externe Thread-Inbetriebnahme (z. B. über ein Smartphone), um ein Thread-Gerät zu authentifizieren und mit einem Thread-Netzwerk zu verbinden.
Der von Google veröffentlichte OpenThread Border Router (OTBR) ist eine Open-Source-Implementierung des Thread-Border-Routers.
Aufgaben
In diesem Codelab richten Sie einen Thread-Border-Router ein und verbinden Ihr Smartphone über den Border-Router mit einem Thread-Endgerät.
Lerninhalte
- OTBR einrichten
- Thread-Netzwerk mit OTBR erstellen
- OpenThread-Befehlszeilengerät mit der SRP-Funktion erstellen
- Dienst bei SRP registrieren
- Thread-Endgerät erkennen und erreichen
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 vom Typ Nordic Semiconductor nRF52840 (einer für den RCP und einer für das Thread-Endgerät).
- Ein iOS-Smartphone mit mindestens iOS 14 oder ein Android-Smartphone mit mindestens Android 8.1.
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 als Thread-leader
fungiert.
$ sudo ot-ctl state leader Done
Prüfen Sie außerdem, ob das OTBR automatisch ein off-mesh-routable
-Präfix (OMR) in den Thread-Netzwerkdaten konfiguriert hat.
$ 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
3. SRP-Clientendgerät einrichten
OT CLI erstellen und flashen
Folge Schritt 5 des Codelabs Thread-Netzwerk mit nRF52840-Boards und OpenThread erstellen, um ein nRF52840-CLI-Endgerät zu erstellen und zu flashen.
Statt OT_COMMISSIONER
und OT_JOINER
zu aktivieren, sind für den CLI-Knoten die Funktionen OT_SRP_CLIENT
und OT_ECDSA
erforderlich.
Der vollständige Build-Aufruf sollte so aussehen:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Dem Thread-Netzwerk beitreten
Um dem Thread-Netzwerk beizutreten, müssen wir das aktive Betriebs-Dataset vom OTBR-Gerät abrufen. Kehren wir zu ot-ctl
zurück und rufen wir das aktive Dataset ab:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Kehren Sie zur Bildschirm-Sitzung des SRP-Clientknotens zurück und legen Sie das aktive Dataset fest:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Starten Sie dann die Thread-Schnittstelle:
> ifconfig up Done > thread start Done
Warte einige Sekunden und prüfe, ob die Verbindung mit dem 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
Prüfen Sie, ob die Netzwerkdaten mit den auf dem OTBR aufgedruckten Daten übereinstimmen. Wir können jetzt die OMR-Adresse von OTBR anpingen:
> 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
4. Dienst auf dem Endgerät veröffentlichen
mDNS wird häufig zum Veröffentlichen von DNS-SD-Diensten auf Link-Local verwendet. Multicast-Nachrichten verbrauchen jedoch zu viel Bandbreite und der Akku von Geräten mit geringem Stromverbrauch wird dadurch schnell entladen. Thread verwendet das Unicast-Protokoll SRP, um seine Dienste beim Border Router zu registrieren, und ist darauf angewiesen, dass der Border Router die Dienste über die WLAN- oder Ethernet-Verbindung bewirbt.
Wir können einen Dienst mit dem Befehl srp client
registrieren.
Rufen Sie die Bildschirm-Sitzung des SRP-Clientknotens 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 die WLAN-/Ethernet-Verbindung 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. Der Dienst sollte dann registriert sein:
> srp client service instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0 Done
Wir haben alle Einrichtungsarbeiten abgeschlossen und der _ipps._tcp
-Dienst sollte über die WLAN-/Ethernet-Verbindung beworben worden sein. Es ist an der Zeit, das Endgerät zu finden und zu erreichen.
5. Dienst entdecken
Dienst mit einem Smartphone entdecken
Wir verwenden die App Service Browser, um mDNS-Dienste mit dem Android-Smartphone zu erkennen. Eine entsprechende App ist auch für iOS-Mobilgeräte verfügbar. Öffnen Sie die App. Der Dienst _ipps._tcp
sollte automatisch angezeigt werden.
Dienst mit einem Linux-Host erkennen
Wenn Sie den Dienst von einem anderen Linux-Host aus ermitteln 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
Dienst zuordnen:
$ 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 erkennen
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 "" ...
6. Endgerät anpingen
Ping von einem Mobiltelefon senden
Nehmen wir als Beispiel das Pixel Smartphone. Die OMR-Adresse des zuvor registrierten Dienstes „ot-service“ finden wir auf der Detailseite der Dienstinstanz in der Service Browser App.
Wir können die OMR-Adresse jetzt mit einer anderen Network Analyzer App anpingen.
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 (mit der iOS-Version der App ist das möglich).
Ping von einem Linux-/macOS-Host aus
Der Thread Border Router sendet ICMPv6 Router Advertisements (RA), um Präfixe (über die Prefix Information Option) und Routen (über die Route Information Option) über die WLAN-/Ethernet-Verbindung zu bewerben.
Linux-Host vorbereiten
Es ist wichtig, dass RA und RIO auf Ihrem Host aktiviert sind:
net.ipv6.conf.wlan0.accept_ra
sollte mindestens1
betragen, wenn die IP-Weiterleitung nicht aktiviert ist, und2
, wenn sie aktiviert ist.net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
sollte nicht kleiner als64
sein.
Für die meisten Distributionen ist accept_ra
standardmäßig auf 1
festgelegt. Es kann jedoch andere Netzwerk-Daemons geben, die diese Option überschreiben. Auf Raspberry Pi wird beispielsweise accept_ra
durch dhcpcd
in 0
überschrieben. Sie können den Wert von accept_ra
mit folgendem Befehl prüfen:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
Legen Sie den Wert mit folgendem Befehl auf 1
(oder 2
, falls die IP-Weiterleitung aktiviert ist) fest:
$ 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 in den meisten Linux-Distributionen standardmäßig auf 0
gesetzt. Sie können sie mit folgendem Befehl auf 64
setzen:
$ 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 ist möglicherweise zu spät, diese Konfigurationen zu ändern, da der OTBR bereits RA-Nachrichten gesendet hat und das Intervall zwischen zwei unaufgeforderten RA-Nachrichten mehrere hundert Sekunden betragen kann. Eine Möglichkeit besteht darin, die Verbindung zum WLAN-AP zu trennen und wiederherzustellen, um Router Solicitation-Nachrichten zu senden, damit OTBR mit angeforderten RAs antwortet. Eine weitere Möglichkeit besteht darin, die Border-Routing-Funktion auf dem Border-Router neu zu starten:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
Wenn Sie versuchen, die WLAN-Verbindung wiederherzustellen oder die Ethernet-Schnittstelle neu zu starten, achten Sie darauf, dass dhcpcd nicht zum Verwalten Ihres WLAN-/Ethernet-IPv6-Netzwerks verwendet wird. Da dhcpcd die Option accept_ra
immer überschreibt, wenn die Schnittstelle neu gestartet wird, geht Ihre accept_ra
-Konfiguration verloren. Fügen Sie der dhcpcd-Konfigurationsdatei (z.B. /etc/dhcpcd.conf
) die folgenden Zeilen hinzu, um IPv6 in dhcpcd explizit zu deaktivieren:
noipv6 noipv6rs
Damit die Änderung wirksam wird, müssen Sie das Gerät neu starten.
macOS-Host vorbereiten
Beide accept_ra*
-Optionen sind standardmäßig aktiviert. Sie müssen Ihr System jedoch mindestens auf macOS Big Sur aktualisieren.
Hostname oder IPv6-Adresse anpingen
Wir können jetzt den Hostnamen ot-host.local
mit dem Befehl ping -6
(ping6
für macOS) anpingen:
$ 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
Sie können natürlich auch immer die IPv6-Adresse 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 ...
7. Veröffentlichung des Dienstes auf dem Endgerät beenden
So entfernen Sie die Adresse und den Dienst, die vom SRP-Clientknoten registriert wurden:
> srp client host remove Done
Der Dienst _ipps._tcp
sollte jetzt nicht mehr erkannt werden.
8. Glückwunsch
Glückwunsch! Sie haben OTBR erfolgreich als Thread-Border-Router eingerichtet, um bidirektionale IP-Konnektivität und Dienstermittlung für Thread-Endgeräte bereitzustellen.
Nächste Schritte
Hier sind einige Codelabs: