Thread-Netzwerk mit OpenThread in Docker simulieren

1) Einführung

26b7f4f6b3ea0700.png

OpenThread ist eine von Google veröffentlichte Open-Source-Implementierung des Thread-Netzwerkprotokolls. Google Nest hat OpenThread veröffentlicht, um die Technologie, die in Nest-Produkten zum Einsatz kommt, allgemein für Entwickler verfügbar gemacht. So lässt sich die Entwicklung von Produkten für das Smart Home beschleunigen.

Die Thread-Spezifikation definiert ein IPv6-basiertes zuverlässiges, sicheres und energiesparendes Kommunikationsprotokoll für kabellose Geräte zwischen Geräten. OpenThread implementiert alle Thread-Netzwerkebenen, einschließlich IPv6, 6LoWPAN, IEEE 802.15.4 mit MAC-Sicherheit, Mesh-Link-Einrichtung und Mesh-Routing.

Dieses Codelab führt Sie durch die Simulation eines Thread-Netzwerks auf emulierten Geräten mit Docker.

Lerninhalte

  • OpenThread-Build-Toolchain einrichten
  • Thread-Netzwerk simulieren
  • Thread-Knoten authentifizieren
  • Thread-Netzwerk mit OpenThread Daemon verwalten

Voraussetzungen

  • Docker
  • Grundkenntnisse in Linux, Netzwerk-Routing

2. Docker einrichten

Dieses Codelab ist für die Verwendung von Docker auf einem Linux-, Mac OS X- oder Windows-Computer konzipiert. Linux wird als Umgebung empfohlen.

Docker installieren

Installieren Sie Docker auf dem Betriebssystem Ihrer Wahl.

Docker-Image abrufen

Sobald Docker installiert ist, öffnen Sie ein Terminalfenster und rufen Sie das Docker-Image openthread/environment auf. Dieses Image zeigt eine vordefinierte und einsatzbereite OpenThread- und OpenThread-Daemon-Bibliothek für dieses Codelab.

$ docker pull openthread/environment:latest

Es kann einige Minuten dauern, bis der Download abgeschlossen ist.

Starten Sie in einem Terminalfenster einen Docker-Container über das 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 den Container verlassen. Verwenden Sie diese Option nicht, wenn Sie nicht möchten, dass der Container gelöscht wird.

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 NET_ADMIN-Funktion, mit der Sie netzwerkbezogene Vorgänge ausführen können, z. B. IP-Routen hinzufügen.

Im Container sollte eine Aufforderung 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 in den Aufforderungen für dieses Codelab.

Docker verwenden

Bei diesem Codelab wird davon ausgegangen, dass Sie die Grundlagen der Verwendung von Docker kennen. Sie sollten das gesamte Codelab im Docker-Container belassen.

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 Befehlszeile zugänglich macht.

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

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

6e3aa07675f902dc.png

Netzwerk erstellen

1) Knoten 1 starten

Starten Sie in einem Terminalfenster den Docker-Container und stellen Sie eine Verbindung zur zugehörigen bash-Shell her, falls noch nicht geschehen:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

Erstellen 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 Aufforderung > nicht sehen, nachdem Sie diesen Befehl ausgeführt haben, drücken Sie enter.

Dieses Binärprogramm implementiert ein OpenThread-Gerät. Der IEEE 802.15.4-Radiotreiber wird auf UDP implementiert (IEEE 802.15.4-Frames werden innerhalb von UDP-Nutzlasten übergeben).

Das Argument von 1 ist ein Dateideskriptor, der die kleinstmöglichen Bits des „von der Fabrik zugewiesenen“ IEEE-EUI-64 für das emulierte Gerät darstellt. Dieser Wert wird auch bei der Bindung an einen UDP-Port für die IEEE 802.15.4-Radioemulation (Port = 9000 + Dateideskriptor) verwendet. Jede Instanz eines emulierten Thread-Geräts in diesem Codelab verwendet einen anderen Dateideskriptor.

Hinweis: Verwenden Sie für diesen Vorgang nur dann ein Deskriptor von 1 oder höher, das in diesem Codelab angegeben ist. Eine Datei mit der Schlagbeschreibung 0 kann nur verwendet werden.

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

Legen Sie für dieses Dataset ein aktives Dataset fest:

> 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-Leader 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 zugewiesen wurden. Ihre Ausgabe sieht dann 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-lokal
  • Beginnt mit fe80 = link-local

Lokale Mesh-Adressen werden weiter klassifiziert:

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

Notieren Sie sich die EID in der Ausgabe Ihrer Konsole und notieren Sie sie sich für die spätere Verwendung. 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 führen Sie eine bash-Shell im derzeit ausgeführten Docker-Container aus, der für Knoten 2 verwendet werden soll.

$ docker exec -it codelab_otsim_ctnr bash

Mit dieser neuen bash-Eingabeaufforderung hat der Befehlszeilenbefehl mit dem Argument 2 generiert. Dies ist Ihr zweites emuliertes Thread-Gerät:

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

Hinweis: Wenn Sie die Aufforderung > nicht sehen, nachdem Sie diesen Befehl ausgeführt haben, drücken Sie enter.

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

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

Legen Sie für dieses Dataset ein aktives Dataset fest:

> dataset commit active
Done

Rufen Sie die IPv6-Schnittstelle auf:

> ifconfig up
Done

Thread-Protokollvorgang starten:

> thread start
Done

Das Gerät wird als Kind initialisiert. Ein untergeordnetes Thread ist mit einem Endgerät identisch. Das ist ein Thread-Gerät, das Unicast-Traffic nur über ein übergeordnetes Gerät überträgt und empfängt.

> state
child
Done

Innerhalb von 2 Minuten sollte der Statusstatus von child zu router geändert werden. Ein Thread-Router kann Traffic zwischen Thread-Geräten weiterleiten. Es wird auch als übergeordneter Publisher bezeichnet.

> state
router
Done

Netzwerk prüfen

Eine einfache Möglichkeit zum Prüfen des Mesh-Netzwerks finden Sie in der Routertabelle.

1) Verbindung überprüfen

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

> rloc16
5800
Done

Prüfen Sie in Knoten 1 die Routertabelle für RLOC16 von Knoten 2. Achten Sie darauf, dass Knoten 2 zuerst auf 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 0x5800 für Knoten 2 befindet sich in der Tabelle. Er bestätigt, dass er mit dem Mesh-Netzwerk verbunden ist.

2. Ping-Knoten 1 von Knoten 2

Überprüfen Sie die Verbindung zwischen den beiden emulierten Thread-Geräten. In Knoten 2 hat ping die EID zugewiesen, die Knoten 1 zugewiesen wurde:

> 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ücke enter, um zur >-Befehlszeile zurückzukehren.

Netzwerk testen

Nachdem Sie einen Ping zwischen zwei emulierten Thread-Geräten ausgeführt haben, 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 Knoten 2, dass der Leader (Knoten 1) offline ist. Knoten 2 sollte als leader des Netzwerks gekennzeichnet werden:

> state
router
Done
...
> state
leader
Done

Beenden Sie nach der Bestätigung den Thread und setzen Sie Knoten 2 auf die Werkseinstellungen zurück, bevor Sie die Docker-Eingabeaufforderung bash beenden. Das Gerät wird auf die Werkseinstellungen zurückgesetzt, damit die in dieser Übung verwendeten Thread-Netzwerkanmeldedaten nicht zum nächsten Training übernommen werden.

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

Du musst enter einige Male drücken, um die >-Eingabeaufforderung nach einem factoryreset-Befehl zurückzugeben. Schließen Sie den Docker-Container nicht.

Knoten 1 auch auf Werkseinstellungen zurücksetzen und beenden:

> factoryreset
>
> exit
root@c0f3912a74ff:/#

In der Referenz zur OpenThread CLI finden Sie alle verfügbaren CLI-Befehle.

4. Knoten mit der Provision 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. Knoten müssen authentifiziert werden, um globalen IPv6-Traffic zwischen ihnen (und dem Internet über einen Thread-Border-Router) zu leiten.

Für die Authentifizierung muss ein Gerät als Commissioner genutzt werden. Der Commissioner ist der derzeit für neue Thread-Geräte ausgewählte Authentifizierungsserver und der Bevollmächtigte für die Bereitstellung der Netzwerkanmeldedaten, die für die Nutzung der Geräte im Netzwerk erforderlich sind.

In dieser Übung verwenden wir die gleiche Zwei-Knoten-Topologie wie zuvor. Zur Authentifizierung agiert der Thread-Leiter als Kommissar, der Thread-Router als Joiner.

d6a67e8a0d0b5dcb.png.

Docker

Prüfen Sie für jeden Knoten (Terminalfenster) in den verbleibenden Übungen, ob Sie den Docker-Container mit dem OpenThread-Build ausführen. Wenn Sie mit der vorherigen Übung fortfahren, sollten innerhalb des Docker-Containers noch zwei bash-Aufforderungen geöffnet sein. Ist dies nicht der Fall, lesen Sie den Schritt Docker-Fehlerbehebung oder wiederholen Sie einfach die Übung Thread-Netzwerk simulieren.

1) Netzwerk erstellen

Erstellen Sie in Knoten 1 den CLI-Prozess:

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

Hinweis: Wenn Sie die Aufforderung > nicht sehen, nachdem Sie diesen Befehl ausgeführt haben, drücken Sie enter.

Erstellen Sie ein neues operatives Dataset, übernehmen Sie es als aktives Dataset 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

Legen Sie für dieses Dataset ein aktives Dataset fest:

> 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. Rolle des Kommissars starten

Während Sie sich auf Knoten 1 befinden, starten Sie die Rolle „Provisionen“:

> commissioner start
Done

Zulassen, dass jeder Joiner (mit dem Platzhalter *) mit den J01NME-Join-Anmeldedaten in das Netzwerk eingeht. 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. Join-Rolle starten

Erstellen 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-Join-Anmeldedaten.

> ifconfig up
Done
> joiner start J01NME
Done

... warten Sie einige Sekunden, bis die Bestätigung erfolgt ...

Join success

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

Nachdem Knoten 2 authentifiziert wurde, starten Sie jetzt den Thread:

> thread start
Done

4. Netzwerkauthentifizierung validieren

Prüfen Sie state auf Knoten 2, um zu prüfen, ob jetzt das 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 das nächste Training vorzubereiten. Beenden Sie auf jedem Knoten Thread, setzen Sie es auf die Werkseinstellungen zurück und beenden Sie das emulierte Thread-Gerät:

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

Du musst enter einige Male drücken, um die >-Eingabeaufforderung nach einem factoryreset-Befehl zurückzugeben.

5. Netzwerk mit OpenThread Daemon verwalten

In dieser Übung werden eine CLI-Instanz (ein einzelnes eingebettetes SoC-Thread-Gerät) und eine RCP-Instanz (Radio Co-Processor) simuliert.

ot-daemon ist ein Modus der OpenThread Posix-App, 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 sich über die OpenThread CLI als Protokoll mit dem Socket verbindet.

ot-ctl ist eine Befehlszeile, die von ot-daemon bereitgestellt wird, um den RCP zu verwalten und zu konfigurieren. Dadurch wird der RCP mit dem Netzwerk verbunden, 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 mit der vorherigen Übung fortfahren, sollten bereits zwei bash-Aufforderungen im selben Docker-Container geöffnet sein. Ist dies nicht der Fall, lesen Sie den Schritt Docker-Fehlerbehebung.

OT-Demon verwenden

In dieser Übung werden drei Terminalfenster verwendet, die folgendermaßen aussehen:

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

1) Knoten 1 starten

Erstellen 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 Aufforderung > nicht sehen, nachdem Sie diesen Befehl ausgeführt haben, drücken Sie enter.

Erstellen Sie ein neues operatives Dataset, übernehmen Sie es als aktives Dataset 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

Legen Sie für dieses Dataset ein aktives Dataset fest:

> 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 Ein Thread-Netzwerk simulieren erläutert, ist eine Adresse „link-local“ (fe80) und drei „ Mesh-Local“ (fd). Die EID ist die lokale Mesh-Adresse, die nicht ff:fe00 in der Adresse enthält. In dieser Beispielausgabe ist 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-Demon 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 zum Übertragen und Empfangen von Paketen auf virtuellen Geräten verwendet. Möglicherweise wird eine Fehlermeldung angezeigt, wenn das Gerät bereits erstellt wurde. Dies ist normal und kann ignoriert werden.

Starten Sie ot-daemon für einen RCP-Knoten. Dieser wird Knoten 2 genannt. 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'

Wenn der Vorgang erfolgreich war, generiert ot-daemon im ausführlichen Modus eine Ausgabe, die in etwa so aussieht:

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 im Hintergrund geöffnet und laufen Sie dabei. Sie werden hier keine weiteren Befehle eingeben.

3. Verwende ot-ctl, um dem Netzwerk beizutreten

Wir haben Knoten 2 (ot-daemon-RCP) noch nicht an ein Thread-Netzwerk übergeben. Hier kommt ot-ctl ins Spiel. ot-ctl verwendet dieselbe Befehlszeile wie die OpenThread CLI App. Sie können daher ot-daemon-Knoten genauso 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 ot-ctl im Container:

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

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

> state
disabled
Done

Rufen Sie eui64 von Knoten 2 ab, um die Verbindung auf einen bestimmten Joiner einzuschränken:

> eui64
18b4300000000001
Done

Auf Knoten 1 (erstes Terminalfenster) den Commissioner starten und die Teilnahme auf diese eui64 beschränken:

> 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, bis die Bestätigung erfolgt ...

Join success

Als Joiner hat sich der RCP (Node 2) erfolgreich beim Commissioner (Node 1) authentifiziert und die Thread-Netzwerk-Anmeldedaten empfangen.

Verbinden Sie jetzt Knoten 2 noch einmal mit dem Thread-Netzwerk:

> thread start
Done

4. Netzwerkauthentifizierung validieren

Prüfen Sie im dritten Terminal das state auf Knoten 2, um zu prüfen, ob jetzt das Netzwerk verbunden 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 im dritten Terminalfenster mit Strg + D oder exit und kehren Sie zur bash-Konsole des Containers zurück. Senden Sie in dieser Konsole Knoten 1 mit seiner EID mit dem Befehl ping6 per Ping. Wenn die RCP-Instanz ot-daemon 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. Docker-Fehlerbehebung

Wenn Sie den Docker-Container verlassen haben:

bash-Eingabeaufforderung müssen Sie möglicherweise prüfen, ob sie ausgeführt wird, und den Browser neu starten / neu eingeben. Alle Docker-Container, die Sie erstellt haben und in denen Sie die Option --rm nicht 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 lassen Sie alle Docker-Container anzeigen (sowohl ausgeführt als auch beendet):

$ 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 den Container codelab_otsim_ctnr in der Ausgabe eines der docker ps-Befehle 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 Beenden des Containers gelöscht werden soll.

Wenn der Container beendet ist (in docker ps -a aufgelistet, aber nicht docker ps), starten Sie ihn neu:

$ docker start -i codelab_otsim_ctnr

Wenn der Docker-Container bereits ausgeführt wird (in docker ps aufgelistet), stellen Sie wieder eine Verbindung zum Container in jedem Terminal 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, müssen Sie Docker als Root-Nutzer gemäß den Befehlen in diesem Codelab ausführen. Das Codelab unterstützt das Ausführen von Docker im rootless-Modus nicht.

7. Glückwunsch!

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

In diesem Codelab haben Sie Folgendes gelernt:

  • Docker-Container für OpenThread-Simulation 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 verwenden Sie OpenThread Border Router in einem Docker-Container.