Thread-Netzwerke mit OTNS simulieren

1. Einführung

Impression einer Thread-Mesh-Netzwerktopologie

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:

OTNS-Webfenster beim Start

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:

OTNS-Web-Elemente

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:

Ein Knoten mit der Rolle „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:

Thread-Netzwerk mit 4 Knoten

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.

Thread-Netzwerk mit vier Knoten, Knoten 1 ist ausgewählt

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:

Ein Router wird hinzugefügt, insgesamt 5 Knoten

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.

Mehrere neue Knoten hinzugefügt, insgesamt 9 Knoten

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 Schaltflächen für die 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 Schaltfläche zum Erhöhen der Geschwindigkeit klicken, bis die Geschwindigkeit MAX erreicht: Anzeige für die maximale Simulationsgeschwindigkeit.

Simulation verlangsamen

Sie können die Simulation verlangsamen, indem Sie auf die Schaltfläche Schaltfläche zum Verringern der Geschwindigkeit klicken.

Simulation anhalten

Klicken Sie auf die Schaltfläche Schaltfläche "Pause", um die Simulation zu pausieren, während sie ausgeführt wird. Die Schaltfläche wird in Wiedergabeschaltfläche geändert.

Simulation fortsetzen

Klicken Sie auf die Schaltfläche Wiedergabeschaltfläche, um die Simulation fortzusetzen, wenn sie pausiert ist. Die Schaltfläche wird wieder zu Schaltfläche "Pause" 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:

Thread-Netzwerk mit ausgewähltem Leader-Knoten 1

Mobilfunkverbindung deaktivieren

Klicken Sie in der Aktionsleiste auf die Schaltfläche Schaltfläche „Radio aus“, 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:

Eine neue Partition wird mit Knoten 9 als neuem Leader gebildet.

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 Optionsfeld „An“ auf Action Bar, um die Funkverbindung wiederherzustellen:

Knoten 1 wird der Partition hinzugefügt, nachdem das Funkmodul wieder aktiviert wurde.

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.

Knoten 5 wird von den anderen Knoten entfernt und bildet eine neue Partition.

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 5 wird aus der Simulation gelöscht

Knoten über OTNS-Web löschen

Wählen Sie den Border Router-Knoten 9 aus und klicken Sie auf die Schaltfläche Schaltfläche löschen auf dem Action Bar, um Knoten 9 zu löschen:

Border-Router-Knoten 9 wird gelöscht

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_.log. 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.

Screenshot der OpenThread-Paketanalyse 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:

Referenzdokumente