1. Introduction
Qu'est-ce que Thread et OTNS ?
Thread est un protocole de réseau maillé sans fil basse consommation basé sur IP qui permet des communications sécurisées entre appareils et entre appareils et le cloud. Les réseaux Thread peuvent s'adapter aux changements de topologie pour éviter un point de défaillance unique.
OpenThread publié par Google est une implémentation Open Source de Thread. Malgré la petite taille de son code et son faible encombrement mémoire, OpenThread prend en charge toutes les fonctionnalités définies dans la spécification Thread.
OpenThread Network Simulator (OTNS) peut être utilisé pour simuler des réseaux Thread en exécutant des nœuds OpenThread simulés sur des plates-formes POSIX. OTNS fournit une interface Web facile à utiliser (OTNS-Web) pour visualiser et exploiter les réseaux Thread simulés. Il est également possible d'effectuer des simulations scriptées (avec Python).
Points abordés
- Installer OTNS et ses dépendances
- Découvrir les principes de base de l'OTNS-CLI
- Ajouter/Déplacer/Supprimer des nœuds OpenThread dans OTNS-Web
- Utiliser les autres fonctionnalités utiles d'OTNS-Web pour contrôler la simulation du réseau
- Vérifier l'absence de point de défaillance unique d'OpenThread
- Afficher le trafic de données entre les nœuds OpenThread dans Wireshark
Cet atelier de programmation porte sur OTNS-CLI et OTNS-Web pour une utilisation interactive. Les autres fonctionnalités d'OTNS, telles que les scripts Python, ne sont pas abordées.
Prérequis
- Principes de base de Thread. Vous devez connaître les concepts de base de Thread pour comprendre ce qui est enseigné dans cet atelier de programmation.
- De préférence Linux x86_64 ou Mac OS avec Homebrew. La version 24 ou ultérieure d'Ubuntu dans WSL2 pour Windows devrait également fonctionner, mais peut nécessiter quelques ajustements manuels des paramètres.
- Git
- Navigateur Web OTNS-Web utilise un navigateur Web pour afficher les simulations.
- Analyseur de protocole réseau Wireshark (facultatif).
- Go version 1.23 ou ultérieure.
- Le script d'installation vérifiera la version Go installée.
- Si Go n'est pas installé, une version >= 1.23 sera installée, si elle est disponible dans le gestionnaire de packages.
- Si elle n'est pas disponible dans le gestionnaire de packages, une installation manuelle est requise.
- Notez qu'Ubuntu 24.04 ou version antérieure ne sont pas compatibles automatiquement avec Go 1.23. Pour en savoir plus, consultez la page Available Golang versions (Versions Golang disponibles) dans la documentation Ubuntu. L'installation manuelle, à l'aide de
snap
ou d'autres procédures, est possible.
- Version 3.9 ou ultérieure de Python.
- Le script d'installation vérifie la version de Python installée.
- Si Python 3 n'est pas encore installé, une version >= 3.9 sera installée si elle est disponible dans le gestionnaire de packages.
- Si elle n'est pas disponible dans le gestionnaire de packages, une installation manuelle est requise.
Terminologie
Le terme "routeur" est utilisé comme terme technique pour le répéteur Thread Mesh, qui s'appelait initialement routeur Thread. Le terme "nœud" désigne tout appareil OpenThread simulé dans une simulation OTNS.
2. Installation
Obtenir le code OTNS
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
Toutes les commandes de console suivantes de cet atelier de programmation sont exécutées à partir du répertoire otns
.
Amorcer et installer
Le script bootstrap
installe les dépendances (y compris Python 3 et Go/Golang, si nécessaire) et OTNS. Notez que le script peut s'arrêter s'il ne parvient pas à installer automatiquement certaines dépendances, telles que Python version >= 3.9 ou Go version >= 1.23. L'installation automatique nécessite que les packages soient disponibles dans le dépôt de packages configuré du système d'exploitation.
Le script crée également les différents types de nœuds OT qui peuvent être utilisés directement dans une simulation et effectue des tests de base. En raison de ces compilations de nœuds, cela peut prendre plusieurs minutes.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
Vous serez peut-être invité à saisir un mot de passe pour sudo
lors de l'exécution du script.
Si otns
n'est pas installé correctement
Le script peut signaler une erreur telle que :
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
Dans ce cas, vous devez ajouter $(go env GOPATH)/bin
à votre variable $PATH
.
En cas d'autres erreurs, vous pouvez créer un problème GitHub.
3. Exécuter OTNS pour la première fois
Exécutez otns
:
$ otns >_ ← OTNS-CLI prompt
Une fois OTNS démarré, il accède à une console CLI (OTNS-CLI
) et lance un navigateur Web pour la visualisation et la gestion du réseau (OTNS-Web
) :
Si vous ne voyez qu'une page blanche pour OTNS-Web, il est probable que WebGL ne soit pas activé dans votre navigateur. Pour savoir comment activer WebGL, consultez https://superuser.com/a/836833.
Dans les sections suivantes, vous allez apprendre à gérer les simulations OTNS à l'aide de OTNS-CLI
et OTNS-Web
.
4. Découvrir OTNS-CLI et OTNS-Web
OTNS-CLI
OTNS-CLI
est l'interface de ligne de commande (CLI) permettant de gérer les simulations OTNS.
$ otns >_ ← OTNS-CLI prompt
Vous pouvez saisir des commandes dans OTNS-CLI
. Pour obtenir la liste complète des commandes, consultez la documentation de référence sur la CLI OTNS. Ne vous inquiétez pas, vous n'utiliserez que quelques-unes de ces commandes dans cet atelier de programmation.
Saisissez la commande help
pour obtenir une présentation des commandes CLI. Cette liste est identique à la documentation de référence sur la CLI.
> help add Add a node to the simulation and get the node ID. .... .... Done >
Pour obtenir de l'aide sur une commande spécifique, utilisez le nom de la commande, par exemple :
> help add add Add a node to the simulation and get the node ID. Definition: .... .... >
OTNS-Web
OTNS-Web
est l'outil de visualisation et de gestion du réseau OTNS. Il fournit une représentation visuelle des nœuds, des messages et des liens du réseau Thread simulé. Notez les différents éléments de OTNS-Web
:
5. Ajouter des nœuds
Ajouter des nœuds via OTNS-CLI
Ajoutez un routeur Thread à la simulation :
> add router 1 Done
Un nœud doit s'afficher dans OTNS-Web
. Le nœud commence en tant que routeur et devient un leader en quelques secondes :
Pour faciliter le démarrage interactif des simulations, chaque nouveau nœud OpenThread est mis en service par défaut avec un ensemble standard de paramètres réseau.
Ajouter des nœuds via OTNS-CLI
Nous allons maintenant ajouter des nœuds de différents types.
> add fed 2 Done > add med 3 Done > add sed 4 Done
Attendez quelques secondes que les nœuds fusionnent en une seule partition. Vous devriez voir les nœuds dans OTNS-Web
:
Dans OTNS-Web
, vous pouvez également sélectionner l'un des nœuds pour afficher un panneau contenant plus d'informations à son sujet. Par exemple, dans la figure ci-dessous, le nœud 1 est sélectionné. L'entrée "Rôle" dans le panneau confirme qu'il s'agit d'un responsable.
Ajouter des nœuds par OTNS-Web
Vous pouvez également ajouter des nœuds via OTNS-Web
. Cliquez sur le bouton New Router
de Action Bar
. Un nœud devrait être créé à droite du nœud sélectionné. Le nouveau routeur doit rejoindre la partition Thread existante :
Cliquez également sur les boutons "FED", "MED", "SSED" et "BR" de la barre d'action pour créer ces autres types de nœuds. Il devrait maintenant y avoir neuf nœuds au total. Si vous le souhaitez, faites glisser certains nœuds vers d'autres positions pour créer une topologie de réseau physique différente.
Vous avez créé un réseau Thread d'une partition contenant de nombreux nœuds. Dans la section suivante, nous allons ajuster la vitesse de simulation pour que la simulation s'exécute plus rapidement.
6. Ajuster la vitesse
La simulation devrait actuellement s'exécuter à la vitesse 1X
, ce qui signifie que le temps de simulation écoulé jusqu'à présent est le même que le temps réel écoulé depuis la création du premier nœud.
Ajuster la vitesse via OTNS-CLI
Vous pouvez ajuster la vitesse de simulation via OTNS-CLI
.
Définir la vitesse de simulation sur 100X
> speed 100 Done
Vous devriez voir les nœuds envoyer des messages beaucoup plus fréquemment qu'avant.
Définir la vitesse de simulation sur MAX
> speed max Done
OTNS s'efforce de simuler le plus rapidement possible. Vous devriez donc voir les nœuds envoyer un grand nombre de messages.
Mise en pause de la simulation
> speed 0 Done
Si vous définissez la vitesse de simulation sur 0
, la simulation est mise en pause.
Rétablir la simulation à vitesse normale
> speed 1 Done
Si vous définissez une vitesse de simulation supérieure à 0
, la simulation reprend.
Ajuster la vitesse via OTNS-Web
Boutons de contrôle de la vitesse
Recherchez les boutons de contrôle de la vitesse sur la
Action Bar
. Les boutons affichent la vitesse de simulation actuelle et peuvent être utilisés pour ajuster la vitesse de simulation et mettre en pause/reprendre la simulation.
Accélérer la simulation
Vous pouvez accélérer la simulation en cliquant sur le bouton jusqu'à ce que la vitesse atteigne
MAX
: .
Ralentir la simulation
Vous pouvez ralentir la simulation en cliquant sur le bouton .
Mise en pause de la simulation
Cliquez sur le bouton pour mettre en pause la simulation en cours. Le bouton devient
.
Reprendre la simulation
Cliquez sur le bouton pour reprendre la simulation lorsqu'elle est en pause. Le bouton sera de nouveau défini sur
.
Définir la vitesse de simulation sur 10X
Pour gagner du temps, utilisez
OTNS-CLI
pour ajuster la vitesse de simulation à
10X
: nous pouvons ainsi observer beaucoup plus rapidement les changements de topologie dans le réseau.
> speed 10 Done
7. Activer/Désactiver la radio
La simulation doit maintenant contenir au moins deux routeurs (forme hexagonale), éventuellement un routeur de bordure (forme carrée) et de nombreux enfants, et s'exécuter à une vitesse de 10x.
Repérez le routeur principal actuel (bordure rouge) parmi les deux routeurs, puis cliquez dessus une fois pour le sélectionner :
Éteindre le signal radio
Cliquez sur le bouton de la barre d'action pour désactiver la radio du nœud principal. Le responsable ne pourra pas envoyer ni recevoir de messages si la radio est éteinte.
Attendez environ 12 secondes (120 secondes en temps de simulation) pour que l'autre routeur ou routeur de bordure devienne le nouveau leader :
Le réseau Thread se remet automatiquement d'une défaillance du leader en formant une nouvelle partition avec un nouveau leader. La nouvelle partition a également une nouvelle couleur.
Allumer le signal radio
Sélectionnez le responsable dont la radio a été désactivée. Cliquez sur le bouton sur
Action Bar
pour rétablir la connectivité radio :
Le Leader devrait se reconnecter au réseau une fois la connectivité radio rétablie.
8. Déplacer des nœuds
OTNS permet aux utilisateurs de déplacer facilement des nœuds à l'aide de OTNS-CLI
ou OTNS-Web
.
Déplacer le nœud via OTNS-CLI
Déplacez le nœud Border Router 9 vers un nouvel emplacement :
> move 9 50 50 Done
Déplacer un nœud via OTNS-Web
Déplacez le nœud 5 tout en bas à droite en le faisant glisser. Étant donné que le nœud 5 n'est plus à portée radio des autres routeurs, il forme sa propre partition avec un nouvel ID de partition. Pour vérifier les ID de partition, cliquez sur les nœuds dans le panneau d'informations sur les nœuds.
Notez qu'une seule ligne verte est toujours tracée entre le nœud 5 et le nœud 9. Cela est souvent dû à des informations obsolètes sur un enfant, qui sont toujours conservées dans la table enfant d'un ancien parent. Il peut également s'agir d'informations obsolètes sur l'ancienne liaison routeur à routeur entre le nœud 9 et le nœud 5. (Ou peut-être même un bug d'affichage dans ce cas.) Les informations obsolètes sont ensuite nettoyées sur les nœuds après le délai d'inactivité approprié.
9. Supprimer des nœuds
Supprimer des nœuds via OTNS-CLI
Supprimez le nœud 5 :
> del 5 Done
Le nœud 5 devrait disparaître de la simulation :
Supprimer des nœuds via OTNS-Web
Sélectionnez le nœud de routeur de bordure 9, puis cliquez sur le bouton dans
Action Bar
pour supprimer le nœud 9 :
Node 1
doit devenir le leader d'une nouvelle partition, et tous les nœuds restants seront associés en tant qu'enfants au nœud 1.
10. Contexte de nœud OTNS-CLI
OTNS-CLI
fournit un mode de contexte de nœud pour une interaction facile avec les nœuds afin d'aider les développeurs à diagnostiquer l'état d'un nœud. Les actions de nœud peuvent également être lancées à partir de ce mode.
Accéder au mode contexte de nœud
Saisissez le contexte du nœud 1 :
> node 1 Done node 1>
L'invite CLI est passée à node 1>
, ce qui indique le contexte du nœud actuel. Vous pouvez saisir des commandes OpenThread CLI à exécuter sur le nœud comme si vous interagissiez directement avec lui.
Exécuter des commandes dans le contexte d'un nœud
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
Passer à un autre contexte de nœud
node 1> node 2 Done node 2>
Contexte du nœud de sortie
node 1> exit Done >
La commande node 0
est une autre façon de quitter le contexte de nœud.
11. Afficher les journaux de nœuds et les captures de paquets
Journaux de nœuds OpenThread
Par défaut, OTNS génère des fichiers journaux détaillés pour tous les nœuds OpenThread simulés. Vous pouvez les consulter dans le répertoire ./tmp
. Le nom du fichier est 0_
. Voici un extrait d'un fichier journal :
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
Le temps de simulation absolu en microsecondes est indiqué à gauche. Le code temporel hh:mm:ss
indique le code temporel du journal du nœud OpenThread, qui peut être différent du temps de simulation absolu.
Captures de paquets Wireshark
Par défaut, toutes les trames IEEE 802.15.4 transmises sont capturées dans le fichier PCAP current.pcap
. Wireshark peut lire ce fichier pendant ou après la simulation. En raison du chiffrement de la couche liaison de Thread, une action de configuration unique dans Wireshark est nécessaire pour définir correctement la clé de déchiffrement pour OTNS. Par défaut, une clé réseau connue est utilisée pour faciliter le déchiffrement des trames par Wireshark.
Consultez la capture d'écran ci-dessous pour voir un exemple d'inspection de paquets OpenThread dans Wireshark.
Pour configurer la clé de déchiffrement, sélectionnez Édition > Préférences dans le menu. Dans la fenêtre des préférences, sélectionnez Protocols > IEEE 802.15.4. Cliquez sur le bouton Modifier… à côté de "Clés de déchiffrement". Cliquez sur + pour créer une entrée, puis saisissez la clé 00112233445566778899aabbccddeeff
(32 caractères) et sélectionnez "Hachage du thread" dans le champ "Hachage de la clé". L'index de la clé de déchiffrement peut être défini sur 0
. Cliquez ensuite sur OK, puis de nouveau sur OK. Le fichier PCAP OTNS devrait maintenant être correctement déchiffré lors du chargement.
Les codes temporels affichés dans la colonne "Heure" (en secondes) correspondent aux valeurs temporelles absolues de la simulation affichées dans les journaux des nœuds OpenThread. Il est ainsi plus facile de corréler les messages du journal avec les trames radio transmises ou reçues. Toutefois, les valeurs ne sont généralement pas identiques à la microseconde près : le matériel radio IEEE 802.15.4 simulé peut ajouter un délai supplémentaire après qu'une trame radio a été demandée à être envoyée par la pile OpenThread.
12. Félicitations
Félicitations, vous venez d'exécuter votre première simulation OTNS !
Vous avez appris à installer OTNS et ses dépendances. Vous avez lancé une simulation OTNS avec des nœuds simulés OpenThread. Vous avez appris à manipuler la simulation de différentes manières à l'aide de OTNS-CLI
et OTNS-Web
.
Vous savez maintenant ce qu'est OTNS et comment l'utiliser pour simuler des réseaux OpenThread.
Étape suivante
Découvrez quelques-uns des ateliers de programmation...
- Simuler un réseau Thread avec OpenThread
- Simuler un réseau Thread à l'aide d'OpenThread dans Docker
- Créer un réseau Thread avec des cartes nRF52840 et OpenThread