Thread-Netzwerk mit OpenThread in Docker simulieren

1. Einführung

26b7f4f6b3ea0700.png

OpenThread, das von Google veröffentlicht wurde, ist eine Open-Source-Implementierung des Thread-Netzwerkprotokolls. Google Nest hat OpenThread veröffentlicht, um Entwicklern die in Nest-Produkten verwendete Technologie allgemein zugänglich zu machen und so die Entwicklung von Produkten für das vernetzte Zuhause zu beschleunigen.

Die Thread-Spezifikation definiert ein IPv6-basiertes, zuverlässiges, sicheres und energiesparendes Kommunikationsprotokoll für drahtlose Geräte zwischen Geräten für Heimanwendungen. OpenThread implementiert alle Thread-Netzwerkschichten, einschließlich IPv6, 6LoWPAN, IEEE 802.15.4 mit MAC-Sicherheit, Mesh-Link-Einrichtung 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
  • So verwalten Sie ein Thread-Netzwerk mit OpenThread Daemon

Voraussetzungen

  • Docker
  • Grundkenntnisse in Linux, Netzwerkrouting

2. Docker einrichten

Dieses Codelab wurde für die Verwendung von Docker auf einem Linux-, Mac OS X- oder Windows-Computer entwickelt. 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 Docker-Image openthread/environment ab. Dieses Image enthält vorkonfigurierte OpenThread und OpenThread Daemon, die für dieses Codelab verwendet werden können.

$ docker pull openthread/environment:latest

Der Download kann einige Minuten dauern.

Starten Sie in einem Terminalfenster einen Docker-Container aus dem Image und stellen Sie eine Verbindung zur zugehörigen 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 verlassen. 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: Dadurch wird IPv6 im Container aktiviert.
  • --cap-add=net_admin: Aktiviert die Funktion NET_ADMIN, mit der Sie netzwerkbezogene Vorgänge ausführen können, z. B. IP-Routen hinzufügen.

Im Container sollte eine Eingabeaufforderung wie diese angezeigt werden:

root@c0f3912a74ff:/#

Im Beispiel oben ist c0f3912a74ff die Container-ID. Die Container-ID für Ihre Instanz des Docker-Containers unterscheidet sich von der, die in den Eingabeaufforderungen für dieses Codelab angezeigt wird.

Docker verwenden

In diesem Codelab wird davon ausgegangen, dass Sie mit den Grundlagen der Verwendung von Docker vertraut sind. Sie sollten für die gesamte Codelab-Seite im Docker-Container bleiben.

3. 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 (CLI) bereitstellt.

In dieser Übung werden die minimalen Schritte beschrieben, die erforderlich sind, um ein emuliertes Thread-Gerät von einem anderen emulierten Thread-Gerät mit Ping zu kontaktieren.

Die folgende Abbildung zeigt eine grundlegende Thread-Netzwerktopologie. Für diese Übung emulieren wir die beiden Knoten innerhalb des grünen Kreises: einen Thread Leader und einen Thread Router mit einer einzigen Verbindung zwischen ihnen.

6e3aa07675f902dc.png

Netzwerk erstellen

1. Node 1 starten

Falls noch nicht geschehen, starten Sie in einem Terminalfenster den Docker-Container und stellen Sie eine Verbindung zur zugehörigen 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

Rufen Sie im Docker-Container den CLI-Prozess für ein emuliertes Thread-Gerät mithilfe des ot-cli-ftd-Binärprogramms auf.

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

Hinweis:Wenn die Eingabeaufforderung > nach dem Ausführen dieses Befehls nicht angezeigt wird, drücken Sie enter.

Diese Binärdatei implementiert ein OpenThread-Gerät. Der IEEE 802.15.4-Funktreiber wird über UDP implementiert (IEEE 802.15.4-Frames werden innerhalb von UDP-Nutzlasten übergeben).

Das Argument von 1 ist ein Dateideskriptor, der die Bits mit der geringsten Signifikanz der Funktion „werkseitig zugewiesen“ darstellt. IEEE EUI-64 für das emulierte Gerät. Dieser Wert wird auch verwendet, wenn eine Bindung an einen UDP-Port für die IEEE 802.15.4-Radioemulation (Port = 9000 + Dateideskriptor) erfolgt. Für jede Instanz eines emulierten Thread-Geräts in diesem Codelab wird ein anderer Dateideskriptor verwendet.

Hinweis:Verwenden Sie beim Starten des Prozesses für ein emuliertes Gerät nur Dateideskriptoren ab 1, wie in diesem Codelab beschrieben. Der Dateideskriptor 0 ist für andere Zwecke reserviert.

Erstellen Sie ein neues operatives Dataset und führen Sie einen Commit als aktives Dataset aus. 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 für dieses Dataset ein Commit als aktives Dataset:

> dataset commit active
Done

Rufen Sie die IPv6-Schnittstelle auf:

> ifconfig up
Done

Thread-Protokollvorgang starten:

> thread start
Done

Warte ein paar Sekunden und überprüfe, 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 (die Ausgabe wird anders aussehen):

> 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

Lokale Mesh-Adresstypen sind weiter klassifiziert:

  • Enthält ff:fe00 = Router Locator (RLOC)
  • Enthält nicht ff:fe00 = Endpunkt-ID (EID)

Ermitteln Sie die EID in der Konsolenausgabe und notieren Sie sie sich zur späteren 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 im aktuell ausgeführten Docker-Container eine bash-Shell für Node 2 aus.

$ docker exec -it codelab_otsim_ctnr bash

Rufen Sie an dieser neuen bash-Eingabeaufforderung den Befehlszeilenprozess mit dem Argument 2 auf. Dies ist Ihr zweites emuliertes Thread-Gerät:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

Hinweis:Wenn die Eingabeaufforderung > nach dem Ausführen dieses Befehls nicht angezeigt wird, drücken Sie enter.

Konfigurieren Sie den Thread-Netzwerkschlüssel und die PAN-ID mit denselben Werten wie im operativen Dataset von Knoten 1:

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

Übernehmen Sie für dieses Dataset ein Commit 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. Dabei handelt es sich um ein Thread-Gerät, das Unicast-Traffic nur mit einem übergeordneten 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 übergeordnetes Element bezeichnet.

> state
router
Done

Netzwerk prüfen

Eine einfache Möglichkeit, das Mesh-Netzwerk zu überprüfen, besteht darin, einen Blick auf die Routertabelle zu werfen.

1. Verbindung überprüfen

Rufen Sie auf Knoten 2 das RLOC16 ab. Der RLOC16 sind die letzten 16 Bit der RLOC-IPv6-Adresse des Geräts.

> rloc16
5800
Done

Prüfen Sie auf Knoten 1 die Routertabelle auf RLOC16 von Knoten 2. Achten Sie darauf, dass 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 von 0x5800 wird in der Tabelle angezeigt. Dies bestätigt, dass er mit dem Mesh verbunden ist.

2. Knoten 1 von Knoten 2 aus pingen

Prüfen Sie die Verbindung zwischen den beiden emulierten Thread-Geräten. ping die EID, die Knoten 1 in Node 2 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 Eingabeaufforderung > in der Befehlszeile zurückzukehren.

Netzwerk testen

Nachdem Sie nun erfolgreich einen Ping zwischen zwei emulierten Thread-Geräten senden können, testen Sie das Mesh-Netzwerk, indem Sie einen Knoten offline schalten.

Kehren Sie zu Knoten 1 zurück und beenden Sie 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, und Sie sollten sehen, dass Knoten 2 zur leader des Netzwerks wechselt:

> state
router
Done
...
> state
leader
Done

Beenden Sie nach der Bestätigung Thread und setzen Sie Node 2 auf die Werkseinstellungen zurück, bevor Sie zur Docker-Eingabeaufforderung bash zurückkehren. Es wird auf die Werkseinstellungen zurückgesetzt, um sicherzustellen, dass die Thread-Netzwerkanmeldedaten, die wir in dieser Übung verwendet haben, nicht für die nächste Übung übernommen werden.

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

Möglicherweise müssen Sie enter mehrmals drücken, um die >-Eingabeaufforderung nach einem factoryreset-Befehl wieder einzublenden. Beenden Sie den Docker-Container nicht.

Auch auf die Werkseinstellungen zurücksetzen und Node 1 beenden:

> factoryreset
>
> exit
root@c0f3912a74ff:/#

Informationen zu allen verfügbaren CLI-Befehlen finden Sie in der OpenThread-CLI-Referenz.

4. Knoten bei der Inbetriebnahme authentifizieren

In der vorherigen Übung haben Sie ein Thread-Netzwerk mit zwei simulierten Geräten und geprüfter Konnektivität eingerichtet. Dadurch wird jedoch nur nicht authentifizierter IPv6-Link-Local-Traffic zwischen Geräten zugelassen. Um globalen IPv6-Traffic zwischen den Knoten (und dem Internet über einen Thread-Border-Router) weiterzuleiten, müssen die Knoten authentifiziert werden.

Für die Authentifizierung muss ein Gerät als Commissioner fungieren. Der Commissioner ist der aktuell ausgewählte Authentifizierungsserver für neue Thread-Geräte und der Autorisierer für die Bereitstellung der Netzwerkanmeldedaten, die für die Geräte beim Netzwerkbeitritt erforderlich sind.

In dieser Übung verwenden wir dieselbe Topologie mit zwei Knoten wie zuvor. Bei der Authentifizierung fungiert der Thread-Leader als Commissioner, der Thread-Router als Joiner.

d6a67e8a0d0b5dcb.png

Docker

Achten Sie in den verbleibenden Übungen für jeden Knoten (Terminalfenster) darauf, dass Sie den Docker-Container mit dem OpenThread-Build ausführen. Wenn Sie mit der vorherigen Übung fortfahren, sollten immer noch zwei bash-Aufforderungen im selben Docker-Container bereits geöffnet sein. Falls nicht, fahren Sie mit dem Schritt Docker-Fehlerbehebung fort oder wiederholen Sie einfach die Übung Thread-Netzwerk simulieren.

1. Netzwerk erstellen

Rufen Sie in Knoten 1 den CLI-Prozess auf:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

Hinweis:Wenn die Eingabeaufforderung > nach dem Ausführen dieses Befehls nicht angezeigt wird, drücken Sie enter.

Erstellen Sie ein neues operatives Dataset, übergeben Sie den Commit als aktives Dataset 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 für dieses Dataset ein Commit 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 wurde:

> state
leader
Done

2. Rolle „Beauftragte“ übernehmen

Starten Sie die Provisioner-Rolle, während Sie sich noch auf Knoten 1 befinden:

> commissioner start
Done

Zulassen, dass alle Joiner (mithilfe des Platzhalters *) mit den Anmeldedaten J01NME im Netzwerk eine Inbetriebnahme vornehmen. Ein Joiner ist ein Gerät, das von einem menschlichen Administrator einem in Auftrag gegebenen Thread-Netzwerk hinzugefügt wird.

> commissioner joiner add * J01NME
Done

3. Einstiegsrolle starten

Erzeugen Sie in einem zweiten Terminalfenster im Docker-Container einen neuen CLI-Prozess. Das ist Node 2.

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

Aktivieren Sie auf Knoten 2 die Joiner-Rolle mithilfe der J01NME-Joiner-Anmeldedaten.

> ifconfig up
Done
> joiner start J01NME
Done

... warten Sie 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 Knoten 2 authentifiziert wurde, starten Sie Thread:

> thread start
Done

4. Netzwerkauthentifizierung validieren

Prüfen Sie, ob state auf Knoten 2 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 Thread auf jedem Knoten, setzen Sie ihn auf die Werkseinstellungen zurück und beenden Sie das emulierte Thread-Gerät:

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

Möglicherweise müssen Sie enter mehrmals drücken, um die >-Eingabeaufforderung nach einem factoryreset-Befehl wieder einzublenden.

5. Netzwerk mit OpenThread Daemon verwalten

In dieser Übung simulieren wir eine Befehlszeileninstanz (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 Ein- und Ausgabe verwendet, damit OpenThread Core als Dienst ausgeführt werden kann. Ein Client kann mit diesem Dienst kommunizieren, indem er eine Verbindung zum Socket herstellt und die OpenThread-Befehlszeile als Protokoll verwendet.

ot-ctl ist eine von ot-daemon bereitgestellte Befehlszeile zum Verwalten und Konfigurieren der RCP. Damit verbinden wir das RCP mit dem Netzwerk, das vom Thread-Gerät erstellt wurde.

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 von der vorherigen Übung fortfahren, sollten bereits zwei bash-Aufforderungen im selben Docker-Container geöffnet sein. Ist dies nicht der Fall, fahren Sie mit dem Schritt Docker-Fehlerbehebung fort.

ot-DaemonSet verwenden

In dieser Übung werden drei Terminal-Fenster verwendet, die Folgendem entsprechen:

  1. CLI-Instanz des simulierten Thread-Geräts (Knoten 1)
  2. ot-daemon-Prozess
  3. ot-ctl Befehlszeileninstanz

1. Node 1 starten

Starten Sie im ersten Terminalfenster den CLI-Prozess für das emulierte Thread-Gerät:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

Hinweis:Wenn die Eingabeaufforderung > nach dem Ausführen dieses Befehls nicht angezeigt wird, drücken Sie enter.

Erstellen Sie ein neues operatives Dataset, übergeben Sie den Commit als aktives Dataset 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 für dieses Dataset ein Commit 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 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 erläutert, sind eine Adresse link-local (fe80) und drei Mesh-Local-Adressen (fd). Die EID ist die lokale Adresse des Mesh-Netzwerks, die nicht ff:fe00 in der Adresse enthält. In dieser Beispielausgabe lautet 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-DaemonSet 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 Paketübertragung und den Empfang auf virtuellen Geräten verwendet. Wenn das Gerät bereits erstellt wurde, wird möglicherweise eine Fehlermeldung angezeigt. Das ist normal und kann ignoriert werden.

Starten Sie ot-daemon für einen RCP-Knoten. Wir rufen diesen Knoten 2 auf. Verwenden Sie das ausführliche Flag -v, damit Sie die Logausgabe sehen und prüfen können, ob sie 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 Erfolg generiert ot-daemon im ausführlichen Modus eine Ausgabe ähnlich der folgenden:

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

Lass dieses Terminal geöffnet und im Hintergrund laufen. Sie geben keine weiteren Befehle ein.

3. Mit „ot-ctl“ dem Netzwerk beitreten

Knoten 2 (das RCP für ot-daemon) wurde noch in keinem Thread-Netzwerk in Betrieb genommen. Hier kommt ot-ctl ins Spiel. ot-ctl verwendet dieselbe Befehlszeile wie die OpenThread-CLI-Anwendung. Daher können Sie ot-daemon-Knoten auf dieselbe Weise steuern wie die anderen simulierten Thread-Geräte.

Öffnen Sie ein drittes Terminalfenster und führen Sie den vorhandenen Container aus:

$ docker exec -it codelab_otsim_ctnr bash

Starten Sie im Container ot-ctl:

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-ctl
>

In diesem dritten Terminalfenster verwenden Sie ot-ctl, um Knoten 2 (den RCP-Knoten) zu verwalten, den Sie im zweiten Terminalfenster mit ot-daemon gestartet haben. Prüfen Sie den state von Knoten 2:

> state
disabled
Done

Rufen Sie die eui64 von Knoten 2 ab, um den Join auf den jeweiligen Joiner zu beschränken:

> eui64
18b4300000000001
Done

Starten Sie auf Node 1 (erstes Terminalfenster) den Commissioner und beschränken Sie den Beitritt 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

... warten Sie einige Sekunden auf die Bestätigung ...

Join success

Als Joiner hat sich der RCP (Node 2) beim Commissioner (Knoten 1) erfolgreich authentifiziert und die Anmeldedaten für das Thread-Netzwerk erhalten.

Verbinden Sie nun Knoten 2 mit dem Thread-Netzwerk (noch einmal im dritten Terminalfenster):

> thread start
Done

4. Netzwerkauthentifizierung validieren

Prüfen Sie im dritten Terminal das state auf Knoten 2, um zu bestätigen, dass es jetzt mit dem Netzwerk verbunden ist. Innerhalb von zwei Minuten wechselt Knoten 2 von child zu router:

> state
child
Done
...
> state
router
Done

5. Konnektivität validieren

Beenden Sie im dritten Terminalfenster ot-ctl mit dem Befehl Strg + D oder dem Befehl exit und kehren Sie zur bash-Konsole des Containers zurück. Pingen Sie Node 1 von dieser Konsole aus an und verwenden Sie dabei seine EID mit dem Befehl ping6. Wenn die RCP-Instanz ot-daemon erfolgreich mit dem Thread-Netzwerk verbunden wurde und mit dem Netzwerk 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. Docker-Fehlerbehebung

Wenn Sie den Docker-Container beendet haben

bash Aufforderungen angezeigt wird, müssen Sie möglicherweise prüfen, ob es ausgeführt wird, und dann neu starten oder die Daten bei Bedarf noch einmal eingeben. Alle Docker-Container, die Sie erstellt haben, wo Sie nicht die Option --rm verwendet haben, sollten noch vorhanden sein.

So zeigen Sie an, 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 rufen Sie alle (ausgeführten und beendeten) Docker-Container auf:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

Wenn Sie in der Ausgabe eines docker ps-Befehls den Container codelab_otsim_ctnr nicht sehen, führen Sie ihn 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 Verlassen des Containers gelöscht werden soll.

Wenn der Container beendet 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

„Vorgang nicht zulässig“ Fehler

Wenn beim Erstellen neuer OpenThread-Knoten (mit dem Befehl mknod) Operation not permitted-Fehler auftreten, prüfen Sie, ob Sie Docker gemäß den in diesem Codelab bereitgestellten Befehlen als Root-Nutzer ausführen. In diesem Codelab wird das Ausführen von Docker im Root-Modus nicht unterstützt.

7. Glückwunsch!

Sie haben Ihr erstes Thread-Netzwerk mit OpenThread simuliert. Super!

In diesem Codelab haben Sie Folgendes gelernt:

  • OpenThread Simulation 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:

Oder versuchen Sie, OpenThread-Border-Router in einem Docker-Container zu verwenden.