1. Einführung
Was sind Thread und OTNS?
Thread ist ein IP-basiertes drahtloses Mesh-Netzwerkprotokoll mit geringem Stromverbrauch, das eine sichere Kommunikation zwischen Geräten und zwischen Geräten und der Cloud ermöglicht. Thread-Netzwerke können sich an Topologieänderungen anpassen, um einen Single Point of Failure zu vermeiden.
OpenThread von Google ist eine Open-Source-Implementierung von Thread. Trotz seiner geringen Codegröße und seines geringen Speicherbedarfs unterstützt OpenThread alle in der Thread-Spezifikation definierten Funktionen.
Mit dem OpenThread Network Simulator (OTNS) können Thread-Netzwerke simuliert werden, indem simulierte OpenThread-Knoten auf POSIX-Plattformen ausgeführt werden. OTNS bietet eine benutzerfreundliche Weboberfläche (OTNS-Web) zum Visualisieren und Bedienen simulierter Thread-Netzwerke. Auch das Erstellen von Skripten für Simulationen (mit Python) ist möglich.
Lerninhalte
- OTNS und seine Abhängigkeiten installieren
- Grundlagen der OTNS-CLI
- OpenThread-Knoten in OTNS-Web hinzufügen, verschieben und löschen
- Andere nützliche Funktionen von OTNS-Web verwenden, um die Netzwerksimulation zu steuern
- OpenThread-Funktion „Kein Single Point of Failure“ prüfen
- Datentraffic zwischen OpenThread-Knoten in Wireshark ansehen
In diesem Codelab geht es um die interaktive Verwendung von OTNS-CLI und OTNS-Web. Andere Funktionen von OTNS, z. B. Python-Scripting, werden nicht behandelt.
Voraussetzungen
- Thread Primer Sie müssen die grundlegenden Konzepte von Thread kennen, um die Inhalte dieses Codelabs zu verstehen.
- Vorzugsweise Linux x86_64 oder Mac OS mit Homebrew. Ubuntu-Version 24 oder höher in WSL2 für Windows sollte ebenfalls funktionieren, erfordert aber möglicherweise einige manuelle Anpassungen der Einstellungen.
- Git
- Webbrowser: OTNS-Web verwendet einen Webbrowser zum Anzeigen von Simulationen.
- Wireshark-Tool für die Analyse von Netzwerkprotokollen (optional).
- Go-Version 1.23 oder höher
- Das Installationsskript prüft die installierte Go-Version.
- Wenn Go nicht installiert ist, wird eine Version >= 1.23 installiert, sofern sie über den Paketmanager verfügbar ist.
- Wenn es nicht über den Paketmanager verfügbar ist, ist eine manuelle Installation erforderlich.
- Unter Ubuntu 24.04 oder niedriger wird Go 1.23 nicht automatisch unterstützt. Weitere Informationen finden Sie in der Ubuntu-Dokumentation auf der Seite Verfügbare Golang-Versionen. Eine manuelle Installation, die Verwendung von
snap
oder andere Verfahren sind möglich.
- Python-Version 3.9 oder höher.
- Das Installationsskript prüft die installierte Python-Version.
- Wenn Python 3 noch nicht installiert ist, wird eine Version >= 3.9 installiert, sofern sie über den Paketmanager verfügbar ist.
- Wenn es nicht über den Paketmanager verfügbar ist, ist eine manuelle Installation erforderlich.
Terminologie
Der Begriff „Router“ wird als technischer Begriff für den Thread-Mesh-Extender verwendet, der anfangs als Thread-Router bezeichnet wurde. „Knoten“ bezieht sich auf jedes simulierte OpenThread-Gerät in einer OTNS-Simulation.
2. Installation
OTNS-Code abrufen
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
Alle nachfolgenden Konsolenbefehle in diesem Codelab werden im Verzeichnis otns
ausgeführt.
Bootstrapping und Installation
Das bootstrap
-Skript installiert Abhängigkeiten (einschließlich Python 3 und Go/Golang, falls erforderlich) und OTNS. Das Skript wird möglicherweise beendet, wenn bestimmte Abhängigkeiten wie Python-Version >= 3.9 oder Go-Version >= 1.23 nicht automatisch installiert werden können. Für die automatische Installation müssen die Pakete im konfigurierten Paket-Repository des Betriebssystems gefunden werden.
Das Skript erstellt auch die verschiedenen OT-Knotentypen, die direkt in einer Simulation verwendet werden können, und führt einige grundlegende Tests durch. Aufgrund dieser Knoten-Builds kann es einige Minuten dauern.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
Möglicherweise werden Sie während der Ausführung des Skripts aufgefordert, ein Passwort für sudo
einzugeben.
Wenn otns
nicht richtig installiert ist
Das Skript meldet möglicherweise einen Fehler wie:
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
In diesem Fall müssen Sie der Variablen $PATH
$(go env GOPATH)/bin
hinzufügen.
Bei anderen Fehlern kann ein GitHub-Problem erstellt werden.
3. OTNS zum ersten Mal ausführen
Führen Sie otns
aus.
$ otns >_ ← OTNS-CLI prompt
Wenn OTNS erfolgreich gestartet wurde, wird eine CLI-Konsole (OTNS-CLI
) geöffnet und ein Webbrowser für die Netzwerkvisualisierung und ‑verwaltung (OTNS-Web
) gestartet:
Wenn Sie für OTNS-Web nur eine leere Seite sehen, ist WebGL wahrscheinlich nicht in Ihrem Browser aktiviert. Informationen zum Aktivieren von WebGL finden Sie unter https://superuser.com/a/836833.
In den folgenden Abschnitten erfahren Sie, wie Sie OTNS-Simulationen über OTNS-CLI
und OTNS-Web
verwalten.
4. OTNS-CLI und OTNS-Web kennenlernen
OTNS-CLI
OTNS-CLI
ist die Befehlszeile zum Verwalten von OTNS-Simulationen.
$ otns >_ ← OTNS-CLI prompt
Sie können Befehle über OTNS-CLI
eingeben. Eine vollständige Liste der Befehle finden Sie in der OTNS-Befehlszeilenreferenz. Keine Sorge, in diesem Codelab werden Sie nur einige dieser Befehle verwenden.
Geben Sie den Befehl help
ein, um eine Übersicht der CLI-Befehle zu erhalten. Diese Liste ist mit der CLI-Referenz identisch.
> help add Add a node to the simulation and get the node ID. .... .... Done >
Wenn Sie weitere Hilfe zu einem bestimmten Befehl benötigen, verwenden Sie den Namen des Befehls, z. B.:
> help add add Add a node to the simulation and get the node ID. Definition: .... .... >
OTNS-Web
OTNS-Web
ist das Tool von OTNS zur Visualisierung und Verwaltung von Netzwerken. Es bietet eine visuelle Darstellung der Knoten, Nachrichten und Links des simulierten Thread-Netzwerks. Beachten Sie die verschiedenen Elemente von OTNS-Web
:
5. Knoten hinzufügen
Knoten über OTNS-CLI hinzufügen
Fügen Sie der Simulation einen Thread-Router hinzu:
> add router 1 Done
In OTNS-Web
sollte nun ein Knoten erstellt worden sein. Der Knoten startet als Router und wird nach einigen Sekunden zum Leader:
Um interaktive Simulationen zu vereinfachen, wird jeder neue OpenThread-Knoten standardmäßig mit einem Standardsatz von Netzwerkparametern in Betrieb genommen.
Weitere Knoten über OTNS-CLI
hinzufügen
Jetzt fügen wir einige Knoten unterschiedlicher Typen hinzu.
> add fed 2 Done > add med 3 Done > add sed 4 Done
Warten Sie einige Sekunden, bis Knoten in einer Partition zusammengeführt werden. Die Knoten sollten in OTNS-Web
angezeigt werden:
Auch in OTNS-Web
können Sie einen beliebigen Knoten auswählen, um ein Feld mit weiteren Informationen zum Knoten aufzurufen. In der Abbildung unten ist beispielsweise Knoten 1 ausgewählt. Der Eintrag „Rolle“ im Bereich bestätigt, dass es sich um einen Leader handelt.
Knoten hinzufügen mit OTNS-Web
Sie können auch über OTNS-Web
Knoten hinzufügen. Klicken Sie auf die Schaltfläche New Router
der Action Bar
. Rechts neben dem ausgewählten Knoten sollte ein neuer Knoten erstellt werden. Der neue Router sollte der vorhandenen Thread-Partition beitreten:
Klicken Sie auch auf die Schaltflächen „FED“, „MED“, „SSED“ und „BR“ in der Aktionsleiste, um diese anderen Knotentypen zu erstellen. Insgesamt sollten jetzt 9 Knoten vorhanden sein. Wenn Sie möchten, können Sie einige Knoten an andere Positionen ziehen, um eine andere physische Netzwerktopologie zu erstellen.
Sie haben jetzt ein Thread-Netzwerk einer Partition mit vielen Knoten erstellt. Im nächsten Abschnitt passen wir die Simulationsgeschwindigkeit an, damit die Simulation schneller ausgeführt wird.
6. Geschwindigkeit anpassen
Die Simulation sollte derzeit mit 1X
laufen. Das bedeutet, dass die bisher verstrichene Simulationszeit der tatsächlichen Zeit seit dem Erstellen des ersten Knotens entspricht.
Geschwindigkeit über OTNS-CLI
anpassen
Sie können die Simulationsgeschwindigkeit über OTNS-CLI
anpassen.
Simulationsgeschwindigkeit auf 100X
festlegen
> speed 100 Done
Die Knoten sollten jetzt viel häufiger Nachrichten senden als zuvor.
Simulationsgeschwindigkeit auf MAX
festlegen
> speed max Done
OTNS versucht nun, so schnell wie möglich zu simulieren. Sie sollten also sehen, dass Knoten eine große Anzahl von Nachrichten senden.
Simulation anhalten
> speed 0 Done
Wenn Sie die Simulationsgeschwindigkeit auf 0
einstellen, wird die Simulation pausiert.
Simulation mit normaler Geschwindigkeit wiederherstellen
> speed 1 Done
Wenn Sie die Simulationsgeschwindigkeit auf einen Wert über 0
einstellen, wird die Simulation fortgesetzt.
Geschwindigkeit über OTNS-Web
anpassen
Schaltflächen für die Geschwindigkeitssteuerung
Die Schaltflächen zur Geschwindigkeitssteuerung befinden sich auf der
Action Bar
. Auf den Schaltflächen wird die aktuelle Simulationsgeschwindigkeit angezeigt. Sie können damit die Simulationsgeschwindigkeit anpassen und die Simulation pausieren oder fortsetzen.
Simulation beschleunigen
Sie können die Simulation beschleunigen, indem Sie auf die Schaltfläche klicken, bis die Geschwindigkeit
MAX
erreicht: .
Simulation verlangsamen
Sie können die Simulation verlangsamen, indem Sie auf die Schaltfläche klicken.
Simulation anhalten
Klicken Sie auf die Schaltfläche , um die Simulation zu pausieren, während sie ausgeführt wird. Die Schaltfläche wird in
geändert.
Simulation fortsetzen
Klicken Sie auf die Schaltfläche , um die Simulation fortzusetzen, wenn sie pausiert ist. Die Schaltfläche wird wieder zu
geändert.
Simulationsgeschwindigkeit auf 10X
festlegen
Um Zeit zu sparen, verwenden Sie
OTNS-CLI
um die Simulationsgeschwindigkeit anzupassen
10X
damit wir Topologieänderungen im Netzwerk viel schneller erkennen können.
> speed 10 Done
7. Radio ein-/ausschalten
Die Simulation sollte jetzt mindestens zwei Router (Sechseck), möglicherweise einen Border-Router (Quadrat) und viele untergeordnete Geräte enthalten und mit 10-facher Geschwindigkeit ausgeführt werden.
Suchen Sie den aktuellen Leader (roter Rahmen) der beiden Router und klicken Sie einmal darauf, um ihn auszuwählen:
Mobilfunkverbindung deaktivieren
Klicken Sie in der Aktionsleiste auf die Schaltfläche , um das Funkmodul des Leader-Knotens zu deaktivieren. Der Leader kann keine Nachrichten senden oder empfangen, wenn das Funkgerät ausgeschaltet ist.
Warten Sie etwa 12 Sekunden (120 Sekunden in der Simulationszeit), bis der andere Router oder Border-Router der neue Leader wird:
Das Thread-Netzwerk erholt sich automatisch von einem Leader-Fehler, indem eine neue Partition mit einem neuen Leader gebildet wird. Die neue Partition hat auch eine neue Partitionsfarbe.
Mobilfunkverbindung aktivieren
Wähle den Leader aus, dessen Funkgerät ausgeschaltet wurde. Klicke auf die Schaltfläche auf
Action Bar
, um die Funkverbindung wiederherzustellen:
Der Leader sollte sich wieder mit dem Netzwerk verbinden, sobald die Funkverbindung wiederhergestellt ist.
8. Knoten verschieben
Mit OTNS können Nutzer Knoten ganz einfach über OTNS-CLI
oder OTNS-Web
verschieben.
Knoten über OTNS-CLI
verschieben
Verschieben Sie den Border Router-Knoten 9 an einen neuen Ort:
> move 9 50 50 Done
Knoten über OTNS-Web verschieben
Verschieben Sie Knoten 5 durch Ziehen ganz nach rechts unten. Da sich Knoten 5 nun außerhalb der Funkreichweite der anderen Router befindet, bildet er eine eigene Partition mit einer neuen Partitions-ID. Die Partitions-IDs können im Bereich mit den Knoteninformationen eingesehen werden, indem Sie auf die Knoten klicken.
Beachten Sie, dass zwischen Knoten 5 und Knoten 9 weiterhin eine einzelne grüne Linie gezeichnet wird. Das liegt häufig an veralteten Informationen zu einem untergeordneten Element, die weiterhin in der untergeordneten Tabelle eines ehemaligen übergeordneten Elements gespeichert sind. Oder es handelt sich um veraltete Informationen zur früheren Router-zu-Router-Verbindung zwischen Knoten 9 und Knoten 5. Oder vielleicht sogar ein Rendering-Fehler. Nach dem entsprechenden Zeitlimit werden veraltete Informationen auf den Knoten bereinigt.
9. Knoten löschen
Knoten über OTNS-CLI
löschen
Knoten 5 löschen:
> del 5 Done
Knoten 5 sollte aus der Simulation verschwinden:
Knoten über OTNS-Web
löschen
Wählen Sie den Border Router-Knoten 9 aus und klicken Sie auf die Schaltfläche auf dem
Action Bar
, um Knoten 9 zu löschen:
Node 1
sollte Leader einer neuen Partition werden und alle verbleibenden Knoten werden als untergeordnetes Element an Knoten 1 angehängt.
10. OTNS-CLI-Knotenkontext
OTNS-CLI
bietet den Knotenkontextmodus für die einfache Interaktion mit Knoten, damit Entwickler den Status eines Knotens diagnostizieren können. In diesem Modus können auch Knotenaktionen gestartet werden.
Knotenkontextmodus aufrufen
Geben Sie den Knotenkontext von Knoten 1 ein:
> node 1 Done node 1>
Die CLI-Eingabeaufforderung wurde in node 1>
geändert , um den aktuellen Knotenkontext anzugeben. Sie können OpenThread-CLI-Befehle eingeben, die auf dem Knoten ausgeführt werden sollen, als würden Sie direkt mit dem Knoten interagieren.
Befehle im Knotenkontext ausführen
node 1> state leader Done node 1> channel 11 Done node 1> panid 0xface Done node 1> networkname otns Done node 1> ipaddr fdde:ad00:beef:0:0:ff:fe00:fc00 fdde:ad00:beef:0:0:ff:fe00:b400 fd00:f00d:cafe:0:2505:8719:3685:ebfb fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb fe80:0:0:0:e86a:e07:ec97:777 Done
Zu einem anderen Knotenkontext wechseln
node 1> node 2 Done node 2>
Kontext des Ausgangsknotens
node 1> exit Done >
Alternativ können Sie den Knotenkontext auch mit dem Befehl node 0
beenden.
11. Knotenlogs und Paketerfassungen ansehen
OpenThread-Knotenlogs
Standardmäßig generiert OTNS detaillierte Logdateien für alle simulierten OpenThread-Knoten. Sie können im Verzeichnis ./tmp
aufgerufen werden. Der Dateiname lautet 0_
. Ein Beispiel für einen Logdateiauszug sehen Sie unten:
7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-: src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6 | ..&..!.eSZCN.Y. |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-: src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---: 12 0x3000 - me - leader
Die absolute Simulationszeit in Mikrosekunden wird links angezeigt. Der Zeitstempel hh:mm:ss
zeigt den eigenen Log-Zeitstempel des OpenThread-Knotens an, der von der absoluten Simulationszeit abweichen kann.
Wireshark-Paketerfassungen
Standardmäßig werden alle übertragenen IEEE 802.15.4-Frames in der PCAP-Datei current.pcap
erfasst. Diese Datei kann während oder nach der Simulation von Wireshark gelesen werden. Aufgrund der Link-Layer-Verschlüsselung von Thread ist eine einmalige Konfiguration in Wireshark erforderlich, um den Entschlüsselungsschlüssel für OTNS richtig festzulegen. Standardmäßig wird ein bekannter Netzwerkschlüssel verwendet, um die Frame-Entschlüsselung durch Wireshark zu vereinfachen.
Im Screenshot unten sehen Sie ein Beispiel für die OpenThread-Paketprüfung in Wireshark.
Um den Entschlüsselungsschlüssel zu konfigurieren, wählen Sie im Menü Bearbeiten -> Einstellungen aus. Wählen Sie dann im Einstellungsfenster Protokolle -> IEEE 802.15.4 aus. Klicken Sie neben „Entschlüsselungsschlüssel“ auf die Schaltfläche Bearbeiten…. Klicken Sie auf +, um einen neuen Eintrag zu erstellen, geben Sie den Schlüssel 00112233445566778899aabbccddeeff
(32 Zeichen) ein und wählen Sie im Feld „Schlüssel-Hash“ die Option „Thread-Hash“ aus. Der „Entschlüsselungsschlüsselindex“ kann auf 0
belassen werden. Klicken Sie dann auf OK und noch einmal auf OK. Die OTNS-PCAP-Datei sollte jetzt beim Laden korrekt entschlüsselt werden.
Die in der Spalte „Zeit“ angezeigten Zeitstempel (in Sekunden) entsprechen den absoluten Simulationszeitwerten in den OpenThread-Knotenlogs. So lassen sich Logmeldungen leichter mit gesendeten oder empfangenen Funk-Frames in Beziehung setzen. Die Werte sind jedoch in der Regel nicht bis auf die Mikrosekunde genau identisch: Die simulierte IEEE 802.15.4-Funkhardware kann eine zusätzliche Verzögerung hinzufügen, nachdem der OpenThread-Stack das Senden eines Funk-Frames angefordert hat.
12. Glückwunsch
Herzlichen Glückwunsch! Sie haben Ihre erste OTNS-Simulation erfolgreich ausgeführt.
Sie haben gelernt, wie Sie OTNS und seine Abhängigkeiten installieren. Sie haben eine OTNS-Simulation mit simulierten OpenThread-Knoten gestartet. Sie haben gelernt, wie Sie die Simulation auf verschiedene Arten über OTNS-CLI
und OTNS-Web
bearbeiten können.
Sie wissen jetzt, was OTNS ist und wie Sie OTNS verwenden können, um OpenThread-Netzwerke zu simulieren.
Nächste Schritte
Hier sind einige Codelabs:
- Thread-Netzwerk mit OpenThread simulieren
- Thread-Netzwerk mit OpenThread in Docker simulieren
- Thread-Netzwerk mit nRF52840-Boards und OpenThread erstellen