1. Einführung
OpenThread von Google ist eine Open-Source-Implementierung des Thread-Netzwerkprotokolls. Google Nest hat OpenThread veröffentlicht, um die Technologie, die in Nest-Produkten zum Einsatz kommt, Entwicklern zur Verfügung zu stellen, um die Entwicklung von Produkten für das Smart Home zu beschleunigen.
Die Thread-Spezifikation definiert ein IPv6-basiertes zuverlässiges, sicheres und leistungsstarkes Kommunikationsprotokoll für Geräte zu Hause. OpenThread implementiert alle Thread-Netzwerkebenen, einschließlich IPv6, 6LoWPAN, IEEE 802.15.4 mit MAC-Sicherheit, Mesh-Link-Einrichtung und Mesh-Routing.
In diesem Codelab werden Sie Schritt für Schritt durch die Simulation eines Thread-Netzwerks auf simulierten Geräten geführt.
Lerninhalte
- OpenThread-Build-Toolchain einrichten
- Thread-Netzwerk simulieren
- Thread-Knoten authentifizieren
- Thread-Netzwerk mit OpenThread Daemon verwalten
Voraussetzungen
- git
- Grundkenntnisse in Linux, Netzwerkrouting
2. Build-System einrichten
Git
Git ist erforderlich, um dieses Codelab abzuschließen. Laden Sie die App herunter und installieren Sie sie, bevor Sie fortfahren.
Folgen Sie nach der Installation der Anleitung für Ihr konkretes Betriebssystem, um OpenThread herunterzuladen und zu erstellen.
XCode für Mac OS X
XCode ist erforderlich, um OpenThread auf Mac OS X zu installieren und zu erstellen.
Nachdem XCode installiert wurde, installieren Sie die XCode-Befehlszeilentools:
$ xcode-select --install
Auf Linux / Mac OS X erstellen
Diese Installationsanleitung wurde auf Ubuntu Server 14.04 LTS und Mac OS X Sierra 10.12.6 getestet.
Installieren Sie OpenThread. Mit den Befehlen für bootstrap
wird sichergestellt, dass die Toolchain installiert und die Umgebung richtig konfiguriert ist:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap $ ./bootstrap
Windows verwenden
Wenn Sie Windows bevorzugen, empfehlen wir, die Docker-Version dieses Codelabs auszuprobieren.
3. OpenThread-Anwendungen erstellen
Erstellen Sie nach Abschluss der Installation die Beispiel-OpenThread-Anwendung. Für dieses Codelab verwenden wir das Simulationsbeispiel.
$ cd ~/src/openthread $ make -f examples/Makefile-simulation
Erstellen Sie jetzt den OpenThread-Daemon:
$ cd ~/src/openthread $ make -f src/posix/Makefile-posix DAEMON=1
4. Thread-Netzwerk simulieren
Die Beispielanwendung, die Sie für dieses Codelab verwenden, veranschaulicht eine minimale OpenThread-Anwendung, die die OpenThread-Konfigurations- und -Verwaltungsschnittstellen über eine einfache Befehlszeile bereitstellt.
In dieser Übung werden Sie durch die erforderlichen Schritte geführt, um ein simuliertes Thread-Gerät von einem anderen simulierten Thread-Gerät aus per Ping zu kontaktieren.
Die folgende Abbildung beschreibt eine grundlegende Thread-Netzwerktopologie. Für diese Übung werden die beiden Knoten in dem grünen Kreis simuliert: ein Thread-Leader und ein Thread-Router mit einer einzigen Verbindung zwischen ihnen.
Knoten kontaktieren
1. Knoten 1 starten
Rufen Sie das Verzeichnis openthread
auf und führen Sie die Befehlszeile für ein simuliertes Thread-Gerät mit dem Binärprogramm ot-cli-ftd
aus.
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 1
Hinweis: Wenn Sie die Aufforderung >
nach dem Ausführen dieses Befehls nicht sehen, drücken Sie enter
.
Dieses Binärprogramm implementiert ein OpenThread-Gerät, das auf POSIX simuliert wird. Der IEEE 802.15.4-Radiotreiber wird zusätzlich zu UDP implementiert (IEEE 802.15.4-Frames werden innerhalb von UDP-Nutzlasten übergeben).
Das Argument von 1
ist ein Dateideskriptor, der die am wenigsten signifikanten Bits des nach dem Faktors zugewiesenen IEEE EIE-64 für das simulierte Gerät darstellt. Dieser Wert wird auch verwendet, wenn die Bindung an einen UDP-Port für IEEE 802.15.4 erfolgt (Port = 9000 + Dateideskriptor). Jede Instanz eines simulierten Thread-Geräts in diesem Codelab verwendet einen anderen Dateideskriptor.
Hinweis: Verwenden Sie nur Beschreibungen wie 1
, die in diesem Codelab angegeben sind, wenn der Prozess für ein simuliertes Gerät ausgeführt wird. Eine Dateibeschreibung von 0
ist für die andere Verwendung reserviert.
Erstellen Sie ein neues operatives Dataset und übernehmen Sie es als aktives Dataset. Der Operations-Datensatz ist die Konfiguration für das Thread-Netzwerk, das Sie erstellen.
> dataset init new Done > dataset Active Timestamp: 1 Channel: 20 Channel Mask: 07fff800 Ext PAN ID: d6263b6d857647da Mesh Local Prefix: fd61:2344:9a52:ede0/64 Network Key: e4344ca17d1dca2a33f064992f31f786 Network Name: OpenThread-c169 PAN ID: 0xc169 PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
Führen Sie einen Commit für dieses Dataset als aktiv aus:
> dataset commit active Done
Rufen Sie die IPv6-Schnittstelle auf:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Warten Sie einige Sekunden und prüfen Sie, ob das Gerät der Thread-Lead ist. Der Leader ist das Gerät, das für die Verwaltung der Router-ID-Zuweisung verantwortlich ist.
> state leader Done
Sehen Sie sich die IPv6-Adressen an, die der Thread-Schnittstelle von Knoten 1 zugeordnet sind (Ihre Ausgabe sieht anders aus):
> ipaddr fd61:2344:9a52:ede0:0:ff:fe00:fc00 fd61:2344:9a52:ede0:0:ff:fe00:5000 fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 fe80:0:0:0:94da:92ea:1353:4f3b Done
Achten Sie auf die IPv6-Adressen:
- Beginnt mit
fd
= Mesh-lokal - Beginnt mit
fe80
= link-local
Mesh-Lokale-Adressentypen werden weiter klassifiziert:
- Enthält
ff:fe00
= Router-Suche (RLOC) - Enthält nicht
ff:fe00
= Endpunkt-ID (EID)
Notieren Sie sich die EID in Ihrer Konsolenausgabe, um sie später noch einmal verwenden zu können. In der Beispielausgabe oben lautet die EID:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Knoten 2 starten
Öffnen Sie ein neues Terminal und gehen Sie zum Verzeichnis openthread
und führen Sie die Befehlszeile aus. Dies ist Ihr zweites simuliertes Thread-Gerät:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 2
Hinweis:Wenn Sie die Aufforderung >
nach dem Ausführen dieses Befehls nicht sehen, drücken Sie enter
.
Konfigurieren Sie den Thread-Netzwerkschlüssel und die PAN-ID mit denselben Werten wie dem operativen Dataset von Knoten 1:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
Führen Sie einen Commit für dieses Dataset als aktiv aus:
> dataset commit active Done
Rufen Sie die IPv6-Schnittstelle auf:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Das Gerät initialisiert sich als „Untergeordneter“. Ein Thread-Kind entspricht einem Endgerät, das einem Thread-Gerät entspricht, das Unicast-Traffic nur über ein übergeordnetes Gerät überträgt und empfängt.
> state child Done
Die Statusänderung sollte innerhalb von 2 Minuten von child
zu router
wechseln. Thread-Router können Traffic zwischen Thread-Geräten weiterleiten. Es wird auch als übergeordnetes Element bezeichnet.
> state router Done
Netzwerk verifizieren
Sie können das Mesh-Netzwerk ganz einfach in der Routertabelle überprüfen.
1. Verbindung prüfen
Rufen Sie auf Knoten 2 den RLOC16 auf. Der RLOC16 sind die letzten 16 Bit der IPv6-Adresse des Geräts.
> rloc16 5800 Done
Prüfen Sie in Knoten 1 die Routertabelle für Knoten 2's RLOC16. Achten Sie darauf, dass Knoten 2 zuerst auf den Routerstatus umgestellt hat.
> router table | ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC | +----+--------+----------+----------+-------+---------+-----+------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
Der RLOC von 0xa800
aus Knoten 1 ist in der Tabelle gefunden und bestätigt, dass er mit dem Mesh-Netzwerk verbunden ist.
2. Knoten 1 von Knoten 2 kontaktieren
Prüfen Sie die Verbindung zwischen den beiden simulierten Thread-Geräten. In Knoten 2 hat ping
die EID zugewiesen, die Knoten 1 zugewiesen ist:
> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 > 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms
Drücken Sie enter
, um zur Befehlszeile in >
zurückzukehren.
Netzwerk testen
Sie können jetzt Ping zwischen zwei simulierten Thread-Geräten kontaktieren. Testen Sie das Mesh-Netzwerk, indem Sie einen Knoten offline nehmen.
Kehren Sie zu Knoten 1 zurück und beenden Sie den Thread:
> thread stop Done
Wechseln Sie zu Knoten 2 und prüfen Sie den Status. Innerhalb von zwei Minuten erkennt Knoten 2, dass der Leader (Knoten 1) offline ist. Der Knoten 2 sollte in leader
umgewandelt werden:
> state router Done ... > state leader Done
Wenn Sie dies bestätigt haben, beenden Sie Thread und setzen Sie Knoten 2 auf die Werkseinstellungen zurück, bevor Sie ihn beenden. Durch das Zurücksetzen auf die Werkseinstellungen wird sichergestellt, dass die in dieser Übung verwendeten Thread-Netzwerkanmeldedaten nicht auf die nächste Übung übertragen werden.
> thread stop Done > factoryreset > > exit
Auch auf Werkseinstellungen zurücksetzen und Knoten 1 beenden:
> factoryreset > > exit
Weitere Informationen zu allen CLI-Befehlen finden Sie in der Referenz zu CLI (OpenThread).
5. Knoten mit der Authentifizierung authentifizieren
In der vorherigen Übung haben Sie ein Thread-Netzwerk mit zwei simulierten Geräten und bestätigten Konnektivität eingerichtet. Dadurch kann jedoch nicht authentifizierter lokaler IPv6-Link-Traffic zwischen Geräten übertragen werden. Damit der globale IPv6-Traffic zwischen ihnen (und dem Internet über einen Thread-Border-Router) weitergeleitet werden kann, müssen Knoten authentifiziert werden.
Für die Authentifizierung muss ein Gerät als „Provision“ fungieren. Das Kommissionsmitglied ist derzeit der Authentifizierungsserver für neue Thread-Geräte und der Autorisierer, mit dem die Netzwerkanmeldedaten bereitgestellt werden, die erforderlich sind, damit die Geräte dem Netzwerk beitreten können.
In dieser Übung verwenden wir dieselbe Topologie mit zwei Knoten wie zuvor. Für die Authentifizierung fungiert der Thread-Lead als „Commissioner“, der Thread-Router als Joiner.
1. Netzwerk erstellen
Wenn Sie die vorherige Übung fortsetzen, sollten Sie bereits zwei Terminal-Fenster geöffnet haben. Falls nicht, sorgen Sie dafür, dass zwei offen und einsatzbereit sind. Der eine dient als Knoten 1, der andere als Knoten 2.
Rufen Sie in Knoten 1 den Befehlszeilenprozess auf:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 1
Hinweis: Wenn Sie die Aufforderung >
nach dem Ausführen dieses Befehls nicht sehen, drücken Sie enter
.
Erstellen Sie ein neues operatives Dataset, führen Sie es als aktives aus und starten Sie den Thread:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 12 Channel Mask: 07fff800 Ext PAN ID: e68d05794bf13052 Mesh Local Prefix: fd7d:ddf7:877b:8756/64 Network Key: a77fe1d03b0e8028a4e13213de38080e Network Name: OpenThread-8f37 PAN ID: 0x8f37 PSKc: f9debbc1532487984b17f92cd55b21fc Security Policy: 0, onrcb Done
Führen Sie einen Commit für dieses Dataset als aktiv aus:
> dataset commit active Done
Rufen Sie die IPv6-Schnittstelle auf:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Warten Sie einige Sekunden und prüfen Sie, ob das Gerät zu einem Thread-Leader geworden ist:
> state leader Done
2. Die Rolle „Provisionen“ beginnen
Während Sie sich auf Knoten 1 befinden, starten Sie die Rolle „Provisionen“:
> commissioner start Done
Alle Joiner (mit dem Platzhalter *
) mit den Joiner-Anmeldedaten des Netzwerks J01NME
für die Provision für das Netzwerk zulassen. Ein Joiner ist ein Gerät, das von einem menschlichen Administrator in ein Thread-Netzwerk in Auftrag gegeben wurde.
> commissioner joiner add * J01NME Done
3. Join-Rolle erstellen
Erstellen Sie in einem zweiten Terminalfenster einen neuen CLI-Prozess. Dies ist Knoten 2.
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 2
In Knoten 2 aktivieren Sie die Joiner-Rolle mit den J01NME
-Teilnehmenden-Anmeldedaten.
> ifconfig up Done > joiner start J01NME Done
... Warte einige Sekunden, bis eine Bestätigung erfolgt ...
Join success
Als Joiner hat sich das Gerät (Knoten 2) erfolgreich mit dem Commissioner (Node 1) authentifiziert und die Thread-Netzwerk-Anmeldedaten erhalten.
Nachdem Sie Knoten 2 authentifiziert haben, starten Sie den Thread:
> thread start Done
4. Netzwerkauthentifizierung validieren
Prüfen Sie state
auf Knoten 2, um zu prüfen, ob es jetzt mit dem Netzwerk verbunden ist. Knoten 2 wechselt innerhalb von zwei Minuten von child
zu router
:
> state child Done ... > state router Done
5. Konfiguration zurücksetzen
Setzen Sie die Konfiguration zurück, um sich auf das nächste Training vorzubereiten. Beenden Sie Thread auf jedem Knoten, setzen Sie es auf die Werkseinstellungen zurück und beenden Sie das simulierte Thread-Gerät:
> thread stop Done > factoryreset > > exit
Möglicherweise müssen Sie enter
einige Male drücken, um die Aufforderung >
nach einem factoryreset
-Befehl zurückzugeben.
6. Netzwerk mit OpenThread Daemon verwalten
Für diese Übung werden wir eine CLI-Instanz (ein eingebettetes SoC-Thread-Gerät) und eine Radio-Coprozessor-Instanz (RCP) simulieren.
ot-daemon
ist ein Modus der OpenThread Posix-Anwendung, der einen UNIX-Socket als Eingabe und Ausgabe verwendet, damit der OpenThread-Kern als Dienst ausgeführt werden kann. Ein Client kann mit diesem Dienst kommunizieren, indem er sich mit der OpenThread-Befehlszeile als Protokoll mit der Socket verbindet.
ot-ctl
ist eine von ot-daemon
bereitgestellte Befehlszeile zum Verwalten und Konfigurieren des RCP. Damit wird eine Verbindung zwischen dem RCP und dem Netzwerk hergestellt, das vom Thread-Gerät erstellt wurde.
ot-daemon verwenden
In dieser Übung werden die folgenden drei Terminalfenster verwendet:
- CLI-Instanz des simulierten Thread-Geräts (Knoten 1)
ot-daemon
-Prozess- Instanz der
ot-ctl
-Befehlszeile
Wenn Sie die vorherige Übung fortsetzen, sollten Sie bereits zwei Terminal-Fenster geöffnet haben. Öffnen Sie einen dritten Schritt und prüfen Sie, ob drei Terminalfenster für diese Übung verfügbar sind.
1. Knoten 1 starten
Erstellen Sie im ersten Terminalfenster die Befehlszeile für Ihr simuliertes Thread-Gerät:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 1
Hinweis: Wenn Sie die Aufforderung >
nach dem Ausführen dieses Befehls nicht sehen, drücken Sie enter
.
Erstellen Sie ein neues operatives Dataset, führen Sie es als aktives aus und starten Sie den Thread:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 13 Channel Mask: 07fff800 Ext PAN ID: 97d584bcd493b824 Mesh Local Prefix: fd55:cf34:dea5:7994/64 Network Key: ba6e886c7af50598df1115fa07658a83 Network Name: OpenThread-34e4 PAN ID: 0x34e4 PSKc: 38d6fd32c866927a4dfcc06d79ae1192 Security Policy: 0, onrcb Done
Führen Sie einen Commit für dieses Dataset als aktiv aus:
> dataset commit active Done
Rufen Sie die IPv6-Schnittstelle auf:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Sehen Sie sich die IPv6-Adressen an, die der Thread-Schnittstelle von Knoten 1 zugewiesen wurden:
> ipaddr fd55:cf34:dea5:7994:0:ff:fe00:fc00 fd55:cf34:dea5:7994:0:ff:fe00:d000 fd55:cf34:dea5:7994:460:872c:e807:c4ab fe80:0:0:0:9cd8:aab6:482f:4cdc Done >
Wie im Schritt Thread simulieren erläutert, ist eine Adresse Link-Local (fe80
) und drei Mesh-Netzwerk-Adressen (fd
). Die EID ist die lokale Mesh-Adresse, die ff:fe00
in der Adresse nicht enthält. In dieser Beispielausgabe ist die EID fd55:cf34:dea5:7994:460:872c:e807:c4ab
.
Ermitteln Sie die spezifische EID aus der ipaddr
-Ausgabe, die für die Kommunikation mit dem Knoten verwendet wird.
2. OT-DAemon starten
Gehen Sie im zweiten Terminalfenster zum Verzeichnis openthread
und starten Sie ot-daemon
für einen RCP-Knoten, der Knoten 2 aufruft. Verwenden Sie das ausführliche -v
-Flag, damit Sie die Logausgabe sehen und prüfen können, ob sie ausgeführt wird:
$ cd ~/src/openthread $ ./output/posix/bin/ot-daemon -v \ 'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'
Wenn der Vorgang erfolgreich ist, generiert ot-daemon
im ausführlichen Modus die folgende Ausgabe:
ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun 7 2020 18:05:15 ot-daemon[228024]: Thread version: 2 ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun 7 2020 18:06:08
Lassen Sie dieses Terminal offen und laufen im Hintergrund. Sie werden keine weiteren Befehle eingeben.
3. ot-ctl verwenden, um dem Netzwerk beizutreten
Wir haben Knoten 2 (den ot-daemon
-RCP) noch nicht an ein Thread-Netzwerk in Auftrag gegeben. Genau hier kommt ot-ctl
ins Spiel. ot-ctl
verwendet dieselbe Befehlszeile wie die OpenThread-Befehlszeile. Daher können Sie ot-daemon
-Knoten genauso wie die anderen simulierten Thread-Geräte steuern.
Starten Sie ot-ctl
in einem dritten Terminalfenster:
$ ./output/posix/bin/ot-ctl >
Sie verwenden ot-ctl
in diesem dritten Terminal, um Knoten 2 (den RCP-Knoten) zu verwalten, den Sie im zweiten Terminal mit ot-daemon
gestartet haben. Prüfen Sie die state
von Knoten 2:
> state disabled Done
Rufen Sie Knoten 2 und eui64
auf, um die Verbindung zum bestimmten Joinr zu beschränken:
> eui64 18b4300000000001 Done
Auf Knoten 1 (erstes Terminalfenster) starten Sie den Beauftragten und beschränken die Teilnahme auf diese eui64:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Auf Knoten 2 (drittes Terminalfenster): Öffnen Sie die Netzwerkschnittstelle und treten Sie dem Netzwerk bei:
> ifconfig up Done > joiner start J01NME Done
... Warte einige Sekunden, bis eine Bestätigung erfolgt ...
Join success
Als Joiner hat sich der RCP (Node 2) erfolgreich mit dem Commissioner (Node 1) authentifiziert und die Thread-Netzwerk-Anmeldedaten erhalten.
Verknüpfen Sie jetzt Knoten 2 mit dem Thread-Netzwerk:
> thread start Done
4. Netzwerkauthentifizierung validieren
Prüfen Sie state
auf Knoten 2, um zu prüfen, ob es jetzt mit dem Netzwerk verbunden ist. Knoten 2 wechselt innerhalb von zwei Minuten von child
zu router
:
> state child Done ... > state router Done
5. Konnektivität prüfen
Beenden Sie ot-ctl
mit dem Befehl Strg + D oder exit
und pingen Sie Knoten 1 auf der Hostcomputer-Befehlszeile mit der EID mit dem Befehl ping6
. Wenn die ot-daemon
-RCP-Instanz erfolgreich mit dem Thread-Netzwerk verbunden wurde und mit diesem kommuniziert, ist der Ping erfolgreich:
$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms --- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms
7. Glückwunsch!
Sie haben Ihr erstes Thread-Netzwerk erfolgreich mit OpenThread simuliert. Prima!
Themen in diesem Codelab:
- OpenThread-Build-Toolchain einrichten
- Thread-Netzwerk simulieren
- Thread-Knoten authentifizieren
- Thread-Netzwerk mit OpenThread Daemon verwalten
Weitere Informationen finden Sie hier: