1. Einführung
OpenThread ist eine Open-Source-Implementierung des Netzwerkprotokolls Thread von Google. Google Nest hat OpenThread veröffentlicht, um die in Nest-Produkten verwendete Technologie allgemein für Entwickler verfügbar zu machen. So kann die Entwicklung von Produkten für das Smart Home beschleunigt werden.
In der Thread-Spezifikation ist ein IPv6-basiertes zuverlässiges, sicheres und energiesparendes Kommunikationsprotokoll für Geräte zwischen Geräten für Heimanwendungen definiert. 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
- Build-Toolchain von OpenThread 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 Betriebssystem, um OpenThread herunterzuladen und zu erstellen.
XCode für Mac OS X
XCode ist für die Installation und Erstellung von OpenThread auf Mac OS X erforderlich.
Installieren Sie nach der Installation von XCode die XCode-Befehlszeilentools:
$ xcode-select --install
Build unter Linux / Mac OS X
Diese Installationsanleitung wurde auf Ubuntu Server 14.04 LTS und Mac OS X Sierra 10.12.6 getestet.
Installieren Sie OpenThread. Mit den Befehlen bootstrap
wird sichergestellt, dass die Toolchain installiert und die Umgebung ordnungsgemäß konfiguriert ist:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap $ ./bootstrap
Unter Windows
Wenn Sie Windows bevorzugen, empfehlen wir, die Docker-Version dieses Codelabs auszuprobieren.
3. OpenThread-Anwendungen erstellen
Erstellen Sie nach Abschluss der Installation die OpenThread-Beispielanwendung. Für dieses Codelab verwenden wir das Simulationsbeispiel.
$ cd ~/src/openthread $ ./script/cmake-build simulation
Erstellen Sie nun den OpenThread-Daemon:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. Thread-Netzwerk simulieren
Die Beispielanwendung, die Sie für dieses Codelab verwenden, zeigt eine minimale OpenThread-Anwendung, die die OpenThread-Konfigurations- und -Verwaltungsschnittstellen über eine einfache Befehlszeilenschnittstelle verfügbar macht.
In dieser Übung werden die Mindestschritte beschrieben, die erforderlich sind, um ein simuliertes Thread-Gerät von einem anderen simulierten Thread-Gerät zu kontaktieren.
In der folgenden Abbildung wird eine grundlegende Thread-Netzwerktopologie beschrieben. Für diese Übung simulieren wir die beiden Knoten im grünen Kreis: einen Thread-Leader und einen Thread-Router mit einer einzigen Verbindung zwischen ihnen.
Knoten pingen
1. Knoten 1 starten
Wechseln Sie in das Verzeichnis openthread
und erstellen Sie den Befehlszeilenprozess für ein simuliertes Thread-Gerät mit dem Binärprogramm ot-cli-ftd
.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Hinweis:Wenn die Aufforderung >
nach Ausführung dieses Befehls nicht zu sehen ist, drücken Sie enter
.
Dieses Binärprogramm implementiert ein OpenThread-Gerät, das auf POSIX simuliert wird. Der IEEE 802.15.4-Radiotreiber wird als Teil von UDP implementiert (IEEE 802.15.4-Frames werden innerhalb von UDP-Nutzlasten übergeben).
Das Argument von 1
ist ein Dateideskriptor, der die niedrigstwertigen Bits des IEEE EUI-64 für das simulierte Gerät darstellt. Dieser Wert wird auch bei der Bindung an einen UDP-Port für die Funkemulation nach IEEE 802.15.4 verwendet (Port = 9000 + Dateideskriptor). Für jede Instanz eines simulierten Thread-Geräts in diesem Codelab wird ein anderer Dateideskriptor verwendet.
Hinweis:Verwenden Sie nur Dateideskriptoren mit mindestens 1
, wie in diesem Codelab beschrieben, wenn der Prozess für ein simuliertes Gerät erstellt wird. Ein Dateideskriptor von 0
ist für eine andere Verwendung reserviert.
Erstellen Sie ein neues operatives Dataset und übernehmen Sie es als aktives Dataset. Das operative Dataset 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
Übernehmen Sie dieses Dataset als aktives Dataset:
> 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 zum Thread Leader geworden 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 Node 1 zugewiesen 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
Notieren Sie sich die spezifischen IPv6-Adresstypen:
- Beginnt mit
fd
= Mesh-Local - Beginnt mit
fe80
= link-local
Lokale Mesh-Netzwerkadressen werden weiter klassifiziert:
- Enthält
ff:fe00
= Router-Locator (RLOC) - Enthält nicht
ff:fe00
= Endpunkt-ID (EID)
Notieren Sie sich die EID in der Konsolenausgabe, um sie später zu verwenden. In der obigen Beispielausgabe lautet die EID:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Knoten 2 starten
Öffnen Sie ein neues Terminal, rufen Sie das Verzeichnis openthread
auf und erstellen Sie den Befehlszeilenprozess. Dies ist Ihr zweites simuliertes Thread-Gerät:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Hinweis:Wenn die Aufforderung >
nach Ausführung dieses Befehls nicht zu sehen ist, drücken Sie enter
.
Konfigurieren Sie den Thread-Netzwerkschlüssel und die PAN mithilfe derselben Werte wie für das operative Dataset des Knotens 1:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
Übernehmen Sie dieses Dataset als aktives Dataset:
> dataset commit active Done
Rufen Sie die IPv6-Schnittstelle auf:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Das Gerät initialisiert sich selbst als untergeordnetes Element. Ein untergeordnetes Thread-Element entspricht einem Endgerät. Das ist ein Thread-Gerät, das Unicast-Traffic nur mit einem übergeordneten Gerät überträgt und empfängt.
> state child Done
Innerhalb von 2 Minuten sollte der Status von child
auf router
wechseln. Ein Thread-Router kann Traffic zwischen Thread-Geräten weiterleiten. Sie wird auch als „übergeordnete Person“ bezeichnet.
> state router Done
Netzwerk überprüfen
Eine einfache Überprüfung des Mesh-Netzwerks finden Sie in der Routertabelle.
1. Verbindung prüfen
Rufen Sie auf Knoten 2 den RLOC16 ab. Der RLOC16 sind die letzten 16 Bit der IPv6-Adresse des Geräts.
> rloc16 5800 Done
Prüfen Sie in Knoten 1 die Routertabelle auf RLOC16 von Knoten 2. Achten Sie darauf, dass zuerst Knoten 2 in den Routerstatus gewechselt ist.
> 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
des Knotens 1 befindet sich in der Tabelle und bestätigt, dass er mit dem Mesh verbunden ist.
2. Knoten 1 von Knoten 2 kontaktieren
Prüfen Sie die Verbindung zwischen den beiden simulierten Thread-Geräten. In Knoten 2, ping
die EID, 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 von >
zurückzukehren.
Netzwerk testen
Da Sie jetzt erfolgreich zwischen zwei simulierten Thread-Geräten pingen können, testen Sie das Mesh-Netzwerk, indem Sie einen Knoten offline schalten.
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 Node 2, dass der Leader (Node 1) offline ist. Daher sollte für den Knoten 2 der Übergang leader
des Netzwerks angezeigt werden:
> state router Done ... > state leader Done
Beenden Sie Thread und setzen Sie Knoten 2 vor dem Beenden auf die Werkseinstellungen zurück. Durch das Zurücksetzen auf die Werkseinstellungen wird sichergestellt, dass die in dieser Übung verwendeten Thread-Netzwerkanmeldedaten nicht für die nächste Übung übernommen werden.
> thread stop Done > factoryreset > > exit
Knoten auf Werkseinstellungen zurücksetzen und Knoten 1 beenden:
> factoryreset > > exit
Informationen zu allen verfügbaren CLI-Befehlen finden Sie in der Referenz zu OpenThread CLI.
5. Knoten mit Inbetriebnahme authentifizieren
In der vorherigen Übung haben Sie ein Thread-Netzwerk mit zwei simulierten Geräten und verifizierter Konnektivität eingerichtet. Dadurch wird jedoch nur nicht authentifizierter lokaler IPv6-Link-Traffic zwischen Geräten zugelassen. 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 Provisionsmitglied tätig werden. Der Beauftragte ist der momentan ausgewählte Authentifizierungsserver für neue Thread-Geräte und der Autorisierer für die Angabe der Netzwerkanmeldedaten, die für die Verbindung mit den Geräten erforderlich sind.
In dieser Übung verwenden wir die gleiche Topologie mit zwei Knoten wie zuvor. Zur Authentifizierung fungiert der Thread Leader als Commissioner, der Thread Router als Joiner.
1. Netzwerk erstellen
Wenn Sie mit der vorherigen Übung fortfahren, sollten bereits zwei Terminalfenster geöffnet sein. Falls nicht, prüfen Sie, ob zwei Geräte geöffnet und einsatzbereit sind. Eine dient als Knoten 1, die andere als Knoten 2.
Erstellen Sie in Knoten 1 den Befehlszeilenprozess:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Hinweis:Wenn die Aufforderung >
nach Ausführung dieses Befehls nicht zu sehen ist, drücken Sie enter
.
Erstellen Sie ein neues operatives Dataset, führen Sie ein Commit als aktives Dataset 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
Übernehmen Sie dieses Dataset als aktives Dataset:
> 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 ein Thread Leader ist:
> state leader Done
2. Die Rolle „Beauftragter“ starten
Starten Sie die Rolle „Provisionen“ noch in Knoten 1:
> commissioner start Done
Zulassen, dass jeder Joiner (mit dem Platzhalter *
) mit den J01NME
-Teilnahmeinformationen für das Netzwerk eine Provision erhält. Ein Joiner ist ein Gerät, das von einem menschlichen Administrator zu einem in Auftrag gegebenen Thread-Netzwerk hinzugefügt wird.
> commissioner joiner add * J01NME Done
3. Joiner-Rolle starten
Erstellen Sie in einem zweiten Terminalfenster einen neuen CLI-Prozess. Das ist Knoten 2.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Aktivieren Sie auf Knoten 2 die Joiner-Rolle mit den J01NME
-Join-Anmeldedaten.
> ifconfig up Done > joiner start J01NME Done
... warte einige Sekunden auf die Bestätigung ...
Join success
Als Joiner hat sich das Gerät (Knoten 2) erfolgreich mit dem Commissioner (Knoten 1) authentifiziert und die Anmeldedaten für das Thread-Netzwerk erhalten.
Nachdem Knoten 2 nun authentifiziert ist, starten Sie den Thread:
> thread start Done
4. Netzwerkauthentifizierung validieren
Prüfen Sie die state
auf Knoten 2, um zu prüfen, ob sie jetzt dem Netzwerk beigetreten ist. Innerhalb von zwei Minuten wechselt Knoten 2 von child
zu router
:
> state child Done ... > state router Done
5. Konfiguration zurücksetzen
Setzen Sie die Konfiguration zurück, um sich auf die nächste Übung vorzubereiten. Beenden Sie auf jedem Knoten den Thread, setzen Sie ihn auf die Werkseinstellungen zurück und beenden Sie das simulierte Thread-Gerät:
> thread stop Done > factoryreset > > exit
Möglicherweise müssen Sie einige Male enter
drücken, um die >
-Eingabeaufforderung nach einem factoryreset
-Befehl wiederherzustellen.
6. Netzwerk mit OpenThread Daemon verwalten
Für diese Übung simulieren wir eine CLI-Instanz (ein einzelnes eingebettetes SoC-Thread-Gerät) und eine RCP-Instanz (Radio Co-Processor).
ot-daemon
ist ein Modus der OpenThread Posix-Anwendung, der einen UNIX-Socket als Eingabe und Ausgabe verwendet, sodass der OpenThread-Kern als Dienst ausgeführt werden kann. Ein Client kann mit diesem Dienst kommunizieren, indem er über die OpenThread-Befehlszeile als Protokoll eine Verbindung zum Socket herstellt.
ot-ctl
ist eine von ot-daemon
bereitgestellte Befehlszeile zum Verwalten und Konfigurieren des RCP. Dadurch wird der RCP mit dem Netzwerk verbunden, das vom Thread-Gerät erstellt wurde.
Ot-Dämon verwenden
In dieser Übung werden drei Terminalfenster verwendet, die ungefähr so aussehen:
- CLI-Instanz eines simulierten Thread-Geräts (Knoten 1)
ot-daemon
-Prozessot-ctl
CLI-Instanz
Wenn Sie mit der vorherigen Übung fortfahren, sollten bereits zwei Terminalfenster geöffnet sein. Öffnen Sie ein drittes Fenster, um sicherzustellen, dass drei Terminalfenster für diese Übung verfügbar sind.
1. Knoten 1 starten
Erstellen Sie im ersten Terminalfenster den CLI-Prozess für Ihr simuliertes Thread-Gerät:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Hinweis: Wenn die Aufforderung >
nach Ausführung dieses Befehls nicht zu sehen ist, drücken Sie enter
.
Erstellen Sie ein neues operatives Dataset, führen Sie ein Commit als aktives Dataset 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
Übernehmen Sie dieses Dataset als aktives Dataset:
> 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 Node 1 zugewiesen sind:
> 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-Netzwerk simulieren erläutert, ist eine Adresse link-local (fe80
) und drei eine Mesh-Local-Adresse (fd
). Die EID ist die lokale Mesh-Adresse, die ff:fe00
in der Adresse nicht enthält. In dieser Beispielausgabe lautet die EID fd55:cf34:dea5:7994:460:872c:e807:c4ab
.
Bestimmen 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 Flag -v
, damit Sie die Logausgabe sehen und prüfen können, ob sie ausgeführt wird. Verwenden Sie außerdem sudo
:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+forkpty:///build/simulation/examples/apps/ncp/ot-rcp?forkpty-arg=2'
Wenn der Vorgang erfolgreich ist, generiert ot-daemon
im ausführlichen Modus eine Ausgabe wie diese:
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
Lassen Sie dieses Terminal im Hintergrund geöffnet. Sie müssen keine weiteren Befehle eingeben.
3. ot-ctl verwenden, um dem Netzwerk beizutreten
Knoten 2 (ot-daemon
RCP) wurde noch in keinem Thread-Netzwerk in Betrieb genommen. Hier kommt ot-ctl
ins Spiel. ot-ctl
verwendet dieselbe Befehlszeile wie die OpenThread-CLI-App. Daher können Sie ot-daemon
-Knoten auf dieselbe Weise steuern wie die anderen simulierten Thread-Geräte.
Starten Sie ot-ctl
in einem dritten Terminalfenster:
$ sudo ./build/posix/src/posix/ot-ctl >
Hinweis: Wenn die Aufforderung >
nach Ausführung dieses Befehls nicht zu sehen ist, drücken Sie enter
.
Sie verwenden ot-ctl
in diesem dritten Terminalfenster, um Knoten 2 (den RCP-Knoten), den Sie im zweiten Terminalfenster mit ot-daemon
gestartet haben, zu verwalten. Prüfen Sie die state
von Knoten 2:
> state disabled Done
Rufen Sie Knoten 2 von eui64
ab, um die Verbindung mit dem spezifischen Joiner zu beschränken:
> eui64 18b4300000000001 Done
Starten Sie den Kommissar auf Node 1 (erstes Terminalfenster) und beschränken Sie den Beitritt auf diese eui64:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Öffnen Sie auf Knoten 2 (drittes Terminalfenster) die Netzwerkschnittstelle und treten Sie dem Netzwerk bei:
> ifconfig up Done > joiner start J01NME Done
... warte einige Sekunden auf die Bestätigung ...
Join success
Als Joiner hat sich der RCP (Knoten 2) erfolgreich mit dem Kommissar (Knoten 1) authentifiziert und die Anmeldedaten für das Thread-Netzwerk erhalten.
Verbinden Sie nun Knoten 2 mit dem Thread-Netzwerk:
> thread start Done
4. Netzwerkauthentifizierung validieren
Prüfen Sie die state
auf Knoten 2, um zu prüfen, ob sie jetzt dem Netzwerk beigetreten ist. Innerhalb von zwei Minuten wechselt Knoten 2 von child
zu router
:
> state child Done ... > state router Done
5. Verbindung prüfen
Beenden Sie ot-ctl
mit dem Befehl Strg + D oder exit
und pingen Sie Knoten 1 auf dem Hostcomputer mit der EID des Befehls ping6
. Wenn die RCP-Instanz ot-daemon
verbunden wurde und mit dem Thread-Netzwerk 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 mit OpenThread simuliert. Prima!
In diesem Codelab haben Sie Folgendes gelernt:
- OpenThread-Build-Toolchain einrichten
- Thread-Netzwerk simulieren
- Thread-Knoten authentifizieren
- Thread-Netzwerk mit OpenThread Daemon verwalten
Weitere Informationen finden Sie hier: