1. Einführung

OpenThread von Google ist eine Open-Source-Implementierung des Thread-Netzwerkprotokolls. Google Nest hat OpenThread veröffentlicht, um die in Nest-Produkten verwendete Technologie Entwicklern zur Verfügung zu stellen und so die Entwicklung von Produkten für das vernetzte Zuhause zu beschleunigen.
Die Thread-Spezifikation definiert ein zuverlässiges, sicheres und energieeffizientes IPv6-basiertes Protokoll für die drahtlose Kommunikation zwischen Geräten für Anwendungen im Haushalt. OpenThread implementiert alle Thread-Netzwerkschichten, einschließlich IPv6, 6LoWPAN, IEEE 802.15.4 mit MAC-Sicherheit, Mesh Link Establishment und Mesh Routing.
In diesem Codelab erfahren Sie, wie Sie mit Docker ein Thread-Netzwerk auf emulierten Geräten simulieren.
Lerninhalte
- OpenThread-Build-Toolchain einrichten
- Thread-Netzwerk simulieren
- Thread-Knoten authentifizieren
- Thread-Netzwerk mit OpenThread Daemon verwalten
Voraussetzungen
- Docker
- Grundkenntnisse zu Linux und Netzwerkrouting
2. Docker einrichten
In diesem Codelab wird davon ausgegangen, dass Sie Docker auf einem Computer mit Linux, Mac OS X oder Windows verwenden. Linux ist die empfohlene Umgebung.
Docker installieren
Installieren Sie Docker auf dem Betriebssystem Ihrer Wahl.
Docker-Image abrufen
Öffnen Sie nach der Installation von Docker ein Terminalfenster und rufen Sie das openthread/environment-Docker-Image ab. Dieses Image enthält OpenThread und OpenThread Daemon, die für dieses Codelab vorab erstellt wurden und einsatzbereit sind.
$ docker pull openthread/environment:latest
Beachte, dass es einige Minuten dauern kann, bis der Download abgeschlossen ist.
Starten Sie in einem Terminalfenster einen Docker-Container aus dem Image und stellen Sie eine Verbindung zur bash-Shell her:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
Mit der Option --rm wird der Container gelöscht, wenn Sie ihn beenden. Verwenden Sie diese Option nicht, wenn der Container nicht gelöscht werden soll.
Beachten Sie die Flags, die für dieses Codelab erforderlich sind:
--sysctl net.ipv6.conf.all.disable_ipv6=0: Damit wird IPv6 im Container aktiviert.--cap-add=net_admin: Aktiviert die NET_ADMIN-Funktion, mit der Sie netzwerkbezogene Vorgänge wie das Hinzufügen von IP-Routen ausführen können.
Im Container sollten Sie eine Eingabeaufforderung ähnlich der folgenden sehen:
root@c0f3912a74ff:/#
Im obigen Beispiel ist c0f3912a74ff die Container-ID. Die Container-ID für Ihre Instanz des Docker-Containers unterscheidet sich von der in den Prompts für dieses Codelab.
Docker verwenden
In diesem Codelab wird davon ausgegangen, dass Sie mit den Grundlagen der Verwendung von Docker vertraut sind. Sie sollten während des gesamten Codelabs im Docker-Container bleiben.
3. Thread-Netzwerk simulieren
Die Beispielanwendung, die Sie in diesem Codelab verwenden, ist eine minimale OpenThread-Anwendung, die die OpenThread-Konfigurations- und Verwaltungsschnittstellen über eine einfache Befehlszeile (Command Line Interface, CLI) verfügbar macht.
In dieser Übung werden die minimalen Schritte beschrieben, die erforderlich sind, um ein emuliertes Thread-Gerät von einem anderen emulierten Thread-Gerät aus anzupingen.
Die Abbildung unten zeigt eine grundlegende Thread-Netzwerktopologie. In dieser Übung emulieren wir die beiden Knoten im grünen Kreis: einen Thread-Leader und einen Thread-Router mit einer einzigen Verbindung zwischen ihnen.

Netzwerk erstellen
1. Knoten 1 starten
Starten Sie den Docker-Container in einem Terminalfenster, falls noch nicht geschehen, und stellen Sie eine Verbindung zur bash-Shell her:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
Starten Sie im Docker-Container den CLI-Prozess für ein emuliertes Thread-Gerät mit dem Binärprogramm ot-cli-ftd.
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
Hinweis:Wenn Sie die Eingabeaufforderung > nach dem Ausführen dieses Befehls nicht sehen, drücken Sie enter.
Dieses Binärprogramm implementiert ein OpenThread-Gerät. Der IEEE 802.15.4-Funk-Treiber wird auf UDP implementiert (IEEE 802.15.4-Frames werden in UDP-Nutzlasten übergeben).
Das Argument von 1 ist ein Dateideskriptor, der die niedrigstwertigen Bits der „werkseitig zugewiesenen“ IEEE EUI-64 für das emulierte Gerät darstellt. Dieser Wert wird auch verwendet, wenn eine Bindung an einen UDP-Port für die IEEE 802.15.4-Funkemulation erfolgt (Port = 9000 + Dateideskriptor). Jede Instanz eines emulierten Thread-Geräts in diesem Codelab verwendet einen anderen Dateideskriptor.
Hinweis:Verwenden Sie beim Starten des Prozesses für ein emuliertes Gerät nur Dateideskriptoren von 1 oder höher, wie in diesem Codelab beschrieben. Ein Dateideskriptor von 0 ist für andere Zwecke reserviert.
Erstellen Sie ein neues Operational Dataset und legen Sie es als aktives Dataset fest. 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 das aktive:
> dataset commit active Done
IPv6-Schnittstelle aktivieren:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Warte einige Sekunden und prüfe, ob das Gerät zum Thread-Leader geworden ist. Das Leader-Gerät ist für die Verwaltung der Router-ID-Zuweisung verantwortlich.
> state leader Done
Rufen Sie die IPv6-Adressen auf, die der Thread-Schnittstelle von Knoten 1 zugewiesen sind (Ihre Ausgabe wird sich unterscheiden):
> 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
Beachten Sie die spezifischen IPv6-Adresstypen:
- Beginnt mit
fd= mesh-local - Beginnt mit
fe80= Link-Local
Mesh-lokale Adresstypen werden weiter klassifiziert:
- Enthält
ff:fe00= Router Locator (RLOC) - Enthält nicht
ff:fe00= Endpunkt-ID (EID)
Suchen Sie in der Konsolenausgabe nach der EID und notieren Sie sie sich für die spätere Verwendung. In der obigen Beispielausgabe lautet die EID:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Knoten 2 starten
Öffnen Sie ein neues Terminal und führen Sie eine bash-Shell im aktuell ausgeführten Docker-Container aus, die für Node 2 verwendet werden soll.
$ docker exec -it codelab_otsim_ctnr bash
Starten Sie an diesem neuen bash-Prompt den CLI-Prozess mit dem Argument 2. Dies ist Ihr zweites emuliertes Thread-Gerät:
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
Hinweis:Wenn Sie die Eingabeaufforderung > 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 das operative Dataset von Knoten 1:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
Übernehmen Sie dieses Dataset als das aktive:
> dataset commit active Done
IPv6-Schnittstelle aktivieren:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Das Gerät wird als Kinderkonto initialisiert. Ein Thread-Child entspricht einem Endgerät, also einem Thread-Gerät, das Unicast-Traffic nur mit einem Parent-Gerät überträgt und empfängt.
> state child Done
Innerhalb von zwei Minuten sollte sich der Status von child zu router ändern. Ein Thread-Router kann Traffic zwischen Thread-Geräten weiterleiten. Sie wird auch als „Übergeordnete Einheit“ bezeichnet.
> state router Done
Netzwerk bestätigen
Eine einfache Möglichkeit, das Mesh-Netzwerk zu überprüfen, ist die Routertabelle.
1. Prüfe die Verbindung.
Rufen Sie auf Knoten 2 den RLOC16 ab. RLOC16 sind die letzten 16 Bit der RLOC-IPv6-Adresse des Geräts.
> rloc16 5800 Done
Prüfe auf Knoten 1 die Routertabelle nach dem RLOC16 von Knoten 2. Prüfen Sie, ob Knoten 2 zuerst in den Routerstatus gewechselt ist.
> router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+--------+-------+---+--------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
Der RLOC von Knoten 2 mit 0x5800 ist in der Tabelle zu finden. Das bestätigt, dass er mit dem Mesh verbunden ist.
2. Knoten 1 von Knoten 2 aus anpingen
Prüfe die Verbindung zwischen den beiden emulierten 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 >-CLI-Eingabeaufforderung zurückzukehren.
Netzwerk testen
Nachdem Sie erfolgreich zwischen zwei emulierten Thread-Geräten pingen können, testen Sie das Mesh-Netzwerk, indem Sie einen Knoten offline nehmen.
Kehren Sie zu Knoten 1 zurück und beenden Sie Thread:
> thread stop Done
Wechsle zu Knoten 2 und prüfe den Status. Innerhalb von zwei Minuten erkennt Knoten 2, dass der Leader (Knoten 1) offline ist. Knoten 2 sollte nun als leader des Netzwerks angezeigt werden:
> state router Done ... > state leader Done
Wenn die Bestätigung erfolgt ist, beenden Sie Thread und setzen Sie Node 2 auf die Werkseinstellungen zurück, bevor Sie zum Docker-Prompt bash zurückkehren. Durch das Zurücksetzen auf die Werkseinstellungen wird sichergestellt, dass die in dieser Übung verwendeten Thread-Netzwerk-Anmeldedaten nicht in die nächste Übung übernommen werden.
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
Möglicherweise müssen Sie enter einige Male drücken, um die Eingabeaufforderung > nach einem factoryreset-Befehl wieder aufzurufen. Verlassen Sie den Docker-Container nicht.
Setzen Sie auch Node 1 auf die Werkseinstellungen zurück und beenden Sie den Knoten:
> factoryreset > > exit root@c0f3912a74ff:/#
Eine Liste aller verfügbaren CLI-Befehle finden Sie in der OpenThread-CLI-Referenz.
4. Knoten mit Commissioning authentifizieren
In der vorherigen Übung haben Sie ein Thread-Netzwerk mit zwei simulierten Geräten eingerichtet und die Konnektivität überprüft. Dadurch kann jedoch nur nicht authentifizierter IPv6-Link-Local-Traffic zwischen Geräten übertragen werden. Damit globaler IPv6-Traffic zwischen ihnen (und dem Internet über einen Thread-Border-Router) weitergeleitet werden kann, müssen Knoten authentifiziert werden.
Zur Authentifizierung muss ein Gerät als Commissioner fungieren. Der Commissioner ist der derzeit ausgewählte Authentifizierungsserver für neue Thread-Geräte und der Autorisierer für die Bereitstellung der Anmeldedaten für das Netzwerk, die für den Beitritt der Geräte zum Netzwerk erforderlich sind.
In dieser Übung verwenden wir dieselbe Topologie mit zwei Knoten wie zuvor. Bei der Authentifizierung fungiert der Thread-Leader als Commissioner und der Thread-Router als Joiner.

Docker
Achten Sie bei jeder Node (Terminalfenster) in den verbleibenden Übungen darauf, dass Sie den Docker-Container mit dem OpenThread-Build ausführen. Wenn Sie mit der vorherigen Übung fortfahren, sollten bereits zwei bash-Prompts im selben Docker-Container geöffnet sein. Falls nicht, lies den Schritt Fehlerbehebung bei Docker oder wiederhole einfach die Übung Thread-Netzwerk simulieren.
1. Netzwerk erstellen
Starten Sie in Node 1 den CLI-Prozess:
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
Hinweis:Wenn Sie die Eingabeaufforderung > nach dem Ausführen dieses Befehls nicht sehen, drücken Sie enter.
Erstellen Sie ein neues Operational Dataset, legen Sie es als aktives Dataset fest und starten Sie 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 das aktive:
> dataset commit active Done
IPv6-Schnittstelle aktivieren:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Warte einige Sekunden und prüfe, ob das Gerät ein Thread-Leader geworden ist:
> state leader Done
2. Rolle „Commissioner“ starten
Starten Sie die Rolle „Commissioner“ auf Knoten 1:
> commissioner start Done
Erlaube allen Joinern (mit dem Platzhalter *) mit den J01NME-Anmeldedaten für Joiner die Inbetriebnahme im Netzwerk. Ein Joiner ist ein Gerät, das von einem Administrator zu einem in Betrieb genommenen Thread-Netzwerk hinzugefügt wird.
> commissioner joiner add * J01NME Done
3. Rolle „Mitglied“ starten
Starten Sie in einem zweiten Terminalfenster im Docker-Container einen neuen CLI-Prozess. Das ist Knoten 2.
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
Aktivieren Sie auf Knoten 2 die Joiner-Rolle mit den J01NME-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 beim Commissioner (Knoten 1) authentifiziert und die Anmeldedaten für das Thread-Netzwerk erhalten.
Nachdem Node 2 authentifiziert wurde, starten Sie Thread:
> thread start Done
4. Netzwerkauthentifizierung validieren
Prüfen Sie das state auf Knoten 2, um zu bestätigen, dass er jetzt mit dem Netzwerk verbunden 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. Beende Thread auf jedem Knoten, setze das Gerät auf die Werkseinstellungen zurück und beende das emulierte Thread-Gerät:
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
Möglicherweise müssen Sie enter einige Male drücken, um die Eingabeaufforderung > nach einem factoryreset-Befehl wieder aufzurufen.
5. Netzwerk mit OpenThread Daemon verwalten
In dieser Ü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-App, der einen UNIX-Socket als Ein- 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 CLI, die von ot-daemon bereitgestellt wird, um den RCP zu verwalten und zu konfigurieren. Damit verbinden wir den RCP mit dem vom Thread-Gerät erstellten Netzwerk.
Docker
Achten Sie darauf, dass Sie für jeden Knoten (Terminalfenster) in dieser Übung den Docker-Container mit dem OpenThread-Build ausführen. Wenn Sie mit der vorherigen Übung fortfahren, sollten bereits zwei bash-Eingabeaufforderungen im selben Docker-Container geöffnet sein. Falls nicht, lesen Sie den Schritt Fehlerbehebung bei Docker.
„ot-daemon“ verwenden
In dieser Übung werden drei Terminalfenster verwendet, die den folgenden entsprechen:
- CLI-Instanz des simulierten Thread-Geräts (Knoten 1)
ot-daemon-Prozessot-ctl-CLI-Instanz
1. Knoten 1 starten
Starten Sie im ersten Terminalfenster den CLI-Prozess für Ihr emuliertes Thread-Gerät:
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
Hinweis:Wenn Sie die Eingabeaufforderung > nach dem Ausführen dieses Befehls nicht sehen, drücken Sie enter.
Erstellen Sie ein neues Operational Dataset, legen Sie es als aktives Dataset fest und starten Sie 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 das aktive:
> dataset commit active Done
IPv6-Schnittstelle aktivieren:
> ifconfig up Done
Thread-Protokollvorgang starten:
> thread start Done
Rufen Sie die IPv6-Adressen auf, die der Thread-Schnittstelle von Knoten 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 beschrieben, ist eine Adresse link-lokal (fe80) und drei sind mesh-lokal (fd). Die EID ist die mesh-lokale Adresse, die nicht ff:fe00 in der Adresse enthält. In dieser Beispielausgabe lautet die EID fd55:cf34:dea5:7994:460:872c:e807:c4ab.
Suchen Sie in der ipaddr-Ausgabe nach der spezifischen EID, die für die Kommunikation mit dem Knoten verwendet wird.
2. ot-daemon starten
Erstellen Sie im zweiten Terminalfenster einen tun-Geräteknoten und legen Sie Lese-/Schreibberechtigungen fest:
root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200 root@c0f3912a74ff:/# chmod 600 /dev/net/tun
Dieses Gerät wird für die Übertragung und den Empfang von Paketen auf virtuellen Geräten verwendet. Möglicherweise wird eine Fehlermeldung angezeigt, wenn das Gerät bereits erstellt wurde. Das ist normal und kann ignoriert werden.
Starten Sie ot-daemon für einen RCP-Knoten, den wir Knoten 2 nennen. Verwenden Sie das Flag -v, um die Log-Ausgabe zu sehen und zu bestätigen, dass der Vorgang ausgeführt wird:
root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+forkpty:///openthread/build/examples/apps/ncp/ot-rcp?forkpty-arg=2'
Bei erfolgreicher Ausführung wird im ausführlichen Modus eine Ausgabe ähnlich der folgenden generiert:ot-daemon
ot-daemon[31]: Running OPENTHREAD/297a880; POSIX; Feb 1 2022 04:43:39 ot-daemon[31]: Thread version: 3 ot-daemon[31]: Thread interface: wpan0 ot-daemon[31]: RCP version: OPENTHREAD/297a880; SIMULATION; Feb 1 2022 04:42:50
Lassen Sie dieses Terminal geöffnet und im Hintergrund laufen. Sie geben keine weiteren Befehle ein.
3. Mit ot-ctl dem Netzwerk beitreten
Wir haben Knoten 2 (das ot-daemon-RCP) noch nicht in einem Thread-Netzwerk in Betrieb genommen. Hier kommt ot-ctl ins Spiel. ot-ctl verwendet dieselbe CLI wie die OpenThread-CLI-App. Daher können Sie ot-daemon-Knoten auf dieselbe Weise wie die anderen simulierten Thread-Geräte steuern.
Öffnen Sie ein drittes Terminalfenster und führen Sie den vorhandenen Container aus:
$ docker exec -it codelab_otsim_ctnr bash
Starten Sie ot-ctl, sobald Sie sich im Container befinden:
root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-ctl >
Sie verwenden ot-ctl in diesem dritten Terminalfenster, um Node 2 (den RCP-Knoten) zu verwalten, den Sie im zweiten Terminalfenster mit ot-daemon gestartet haben. Prüfen Sie die state von Knoten 2:
> state disabled Done
Rufen Sie die eui64 von Knoten 2 ab, um das Verbinden auf den jeweiligen Joiner zu beschränken:
> eui64 18b4300000000001 Done
Starten Sie auf Knoten 1 (erstes Terminalfenster) den Commissioner und beschränken Sie das Beitreten auf diese eui64:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Rufen Sie im dritten Terminalfenster die Netzwerkschnittstelle für Knoten 2 auf 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 beim Commissioner (Knoten 1) authentifiziert und die Thread-Netzwerk-Anmeldedaten erhalten.
Verbinden Sie nun Knoten 2 mit dem Thread-Netzwerk (wieder im dritten Terminalfenster):
> thread start Done
4. Netzwerkauthentifizierung validieren
Prüfen Sie im dritten Terminal die state auf Knoten 2, um zu bestätigen, dass er jetzt dem Netzwerk beigetreten ist. Innerhalb von zwei Minuten wechselt Knoten 2 von child zu router:
> state child Done ... > state router Done
5. Verbindung validieren
Beenden Sie ot-ctl im dritten Terminalfenster mit Strg+D oder dem Befehl exit und kehren Sie zur bash-Konsole des Containers zurück. Pingen Sie von dieser Konsole aus Knoten 1 mit seiner EID und dem Befehl ping6 an. Wenn die ot-daemon-RCP-Instanz erfolgreich mit dem Thread-Netzwerk verbunden ist und mit diesem kommuniziert, ist der Ping erfolgreich:
root@c0f3912a74ff:/# 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
6. Fehlerbehebung für Docker
Wenn Sie den Docker-Container beendet haben
Wenn Sie bash Aufforderungen verwenden, müssen Sie möglicherweise prüfen, ob die Funktion ausgeführt wird, und sie bei Bedarf neu starten oder neu eingeben. Alle Docker-Container, die Sie ohne die Option --rm erstellt haben, sollten weiterhin vorhanden sein.
So sehen Sie, welche Docker-Container ausgeführt werden:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 505fc57ffc72 environment "bash" 10 minutes ago Up 10 minutes codelab_otsim_ctnr
So lassen Sie sich alle Docker-Container (sowohl laufende als auch gestoppte) anzeigen:
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 505fc57ffc72 environment "bash" 10 minutes ago Up 10 minutes codelab_otsim_ctnr
Wenn der Container codelab_otsim_ctnr in der Ausgabe keines der beiden docker ps-Befehle angezeigt wird, führen Sie den Befehl noch einmal aus:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
Verwenden Sie die Option --rm nur, wenn der Container beim Beenden gelöscht werden soll.
Wenn der Container gestoppt ist (in docker ps -a, aber nicht in docker ps aufgeführt), starten Sie ihn neu:
$ docker start -i codelab_otsim_ctnr
Wenn der Docker-Container bereits ausgeführt wird (in docker ps aufgeführt), stellen Sie in jedem Terminal eine neue Verbindung zum Container her:
$ docker exec -it codelab_otsim_ctnr bash
Fehler „Vorgang nicht zulässig“
Wenn beim Erstellen neuer OpenThread-Knoten (mit dem Befehl mknod) Operation not permitted-Fehler auftreten, achten Sie darauf, dass Sie Docker als Root-Nutzer ausführen. Verwenden Sie dazu die Befehle, die in diesem Codelab angegeben sind. In diesem Codelab wird die Ausführung von Docker im Rootless-Modus nicht unterstützt.
7. Glückwunsch!
Sie haben Ihr erstes Thread-Netzwerk mit OpenThread erfolgreich simuliert. Sehr gut!
In diesem Codelab haben Sie Folgendes gelernt:
- OpenThread-Simulations-Docker-Container starten und verwalten
- Thread-Netzwerk simulieren
- Thread-Knoten authentifizieren
- Thread-Netzwerk mit OpenThread Daemon verwalten
Weitere Informationen zu Thread und OpenThread finden Sie in den folgenden Referenzen:
- Thread-Primer auf openthread.io
- Thread-Spezifikation
- OpenThread-GitHub-Repository
- OpenThread-Befehlszeilenreferenz
- Zusätzliche OpenThread-Docker-Unterstützung
Alternativ können Sie auch OpenThread Border Router in einem Docker-Container verwenden.