1. Introduction
OpenThread publié par Google est une implémentation Open Source du protocole de mise en réseau Thread. Google Nest a lancé OpenThread pour mettre la technologie utilisée dans les produits Nest à la disposition du plus grand nombre de développeurs afin d'accélérer le développement de produits pour la maison connectée.
La spécification Thread définit un protocole de communication d'appareil à appareil sans fil fiable, sécurisé et à faible consommation pour les applications à domicile. OpenThread implémente toutes les couches de mise en réseau Thread, y compris IPv6, 6LoWPAN, IEEE 802.15.4 avec sécurité MAC, établissement d'un lien maillé et routage de réseau maillé.
Cet atelier de programmation vous explique comment simuler un réseau Thread sur des appareils simulés.
Points abordés
- Configurer la chaîne d'outils de compilation OpenThread
- Simuler un réseau Thread
- Authentifier les nœuds Thread
- Gérer un réseau Thread avec le daemon OpenThread
Ce dont vous avez besoin
- git
- Connaissances de base sur Linux, routage réseau
2. Configurer le système de compilation
Git
Git est nécessaire pour suivre cet atelier de programmation. Téléchargez-la et installez-la avant de continuer.
Une fois installé, suivez les instructions correspondant à votre système d'exploitation pour télécharger et créer OpenThread.
XCode pour Mac OS X
XCode est requis pour installer et créer OpenThread sur Mac OS X.
Une fois XCode installé, installez les outils de ligne de commande XCode:
$ xcode-select --install
Compiler sous Linux / Mac OS X
Ces instructions d'installation ont été testées sur Ubuntu Server 14.04 LTS et Mac OS X Sierra 10.12.6.
Installez OpenThread. Les commandes bootstrap
permettent de vérifier que la chaîne d'outils est installée et que l'environnement est correctement configuré:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap $ ./bootstrap
Sous Windows
Si vous préférez Windows, nous vous recommandons d'essayer la version Docker de cet atelier de programmation.
3. Créer les applications OpenThread
Une fois l'installation terminée, créez l'exemple d'application OpenThread. Pour cet atelier de programmation, nous utilisons l'exemple de simulation.
$ cd ~/src/openthread $ ./script/cmake-build simulation
Créez maintenant le daemon OpenThread:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. Simuler un réseau Thread
L'exemple d'application que vous utiliserez pour cet atelier de programmation présente une application OpenThread minimale qui présente les interfaces de configuration et de gestion OpenThread via une interface de ligne de commande (CLI) de base.
Cet exercice vous indique les étapes minimales requises pour pinguer un appareil Thread simulé depuis un autre appareil Thread simulé.
La figure ci-dessous décrit une topologie de réseau Thread de base. Pour cet exercice, nous allons simuler les deux nœuds du cercle vert: un leader de thread et un routeur de thread avec une seule connexion entre eux.
Pinguer un nœud
1. Démarrer le nœud 1
Accédez au répertoire openthread
et générez le processus CLI pour un appareil Thread simulé à l'aide du binaire ot-cli-ftd
.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Remarque : Si l'invite >
ne s'affiche pas après l'exécution de cette commande, appuyez sur enter
.
Ce binaire implémente un appareil OpenThread simulé sur POSIX. Le pilote radio IEEE 802.15.4 est implémenté en plus de l'UDP (les trames IEEE 802.15.4 sont transmises dans les charges utiles UDP).
L'argument de 1
est un descripteur de fichier qui représente les bits les moins significatifs de l'IEEE EUI-64 attribué par l'usine pour l'appareil simulé. Cette valeur est également utilisée lors de la liaison à un port UDP pour l'émulation radio IEEE 802.15.4 (port = 9000 + descripteur de fichier). Chaque instance d'un appareil Thread simulé dans cet atelier de programmation utilisera un descripteur de fichier différent.
Remarque : Utilisez uniquement des descripteurs de fichier de 1
ou plus, comme indiqué dans cet atelier de programmation, pour générer le processus pour un appareil de simulation. Un descripteur de fichier 0
est réservé à une autre utilisation.
Créer un ensemble de données opérationnel et le valider en tant qu'ensemble de données actif L'ensemble de données opérationnel est la configuration du réseau Thread que vous créez.
> 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
Validez cet ensemble de données actif:
> dataset commit active Done
Ouvrez l'interface IPv6:
> ifconfig up Done
Démarrez l'opération du protocole Thread:
> thread start Done
Attendez quelques secondes, puis vérifiez que l'appareil est devenu Thread Leader. La variante optimale est l'appareil responsable de la gestion de l'attribution de l'ID de routeur.
> state leader Done
Affichez les adresses IPv6 attribuées à l'interface Thread de Node 1 (votre résultat sera différent):
> 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
Notez les types d'adresses IPv6 spécifiques:
- Commence par
fd
= réseau maillé local - Commence par
fe80
= lien-local
Les types d'adresses de réseau maillé local sont ensuite classés:
- Contient
ff:fe00
= outil de localisation de routeurs (RLOC, Routeur Locator) - Ne contient pas
ff:fe00
= Identifiant de point de terminaison (EID)
Identifiez l'EID dans le résultat de votre console et notez-le pour une utilisation ultérieure. Dans l'exemple de résultat ci-dessus, l'EID est:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Démarrer le nœud 2
Ouvrez un nouveau terminal et accédez au répertoire openthread
, puis générez le processus de la CLI. Voici votre deuxième appareil Thread simulé:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Remarque : Si l'invite >
ne s'affiche pas après l'exécution de cette commande, appuyez sur enter
.
Configurez la clé réseau Thread et l'ID PAN, en utilisant les mêmes valeurs que pour l'ensemble de données opérationnel du nœud 1:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
Validez cet ensemble de données actif:
> dataset commit active Done
Ouvrez l'interface IPv6:
> ifconfig up Done
Démarrez l'opération du protocole Thread:
> thread start Done
L'appareil s'initialisera en tant qu'enfant. Un enfant Thread est équivalent à un appareil final, c'est-à-dire un appareil Thread qui transmet et reçoit du trafic unicast uniquement avec un appareil parent.
> state child Done
L'état passe de child
à router
dans les deux minutes qui suivent. Un routeur Thread peut router le trafic entre des appareils Thread. Elle est également appelée "Parent".
> state router Done
Vérifier le réseau
Un moyen simple de vérifier le réseau maillé consiste à consulter la table du routeur.
1. Vérifier la connectivité
Sur le nœud 2, récupérez le RLOC16. Le RLOC16 correspond aux 16 derniers bits de l'adresse IPv6 RLOC de l'appareil.
> rloc16 5800 Done
Sur le nœud 1, recherchez la table RLOC16 du nœud 2 dans la table des routeurs. Assurez-vous d'abord que le nœud 2 est passé à l'état du routeur.
> router table | ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC | +----+--------+----------+----------+-------+---------+-----+------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
Le RLOC 0xa800
du nœud 1 se trouve dans la table, ce qui confirme qu'il est connecté au réseau maillé.
2. Pinguez le nœud 1 à partir du nœud 2.
Vérifiez la connectivité entre les deux appareils Thread simulés. Dans le nœud 2, ping
l'EID attribué au nœud 1:
> 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
Appuyez sur enter
pour revenir à l'invite de la CLI >
.
Tester le réseau
Maintenant que vous pouvez pinguer deux appareils Thread simulés, testez le réseau maillé en mettant un nœud hors connexion.
Revenez au nœud 1 et arrêtez Thread:
> thread stop Done
Passez au nœud 2 et vérifiez l'état. Au bout de deux minutes, le nœud 2 détecte que le nœud maître (le nœud 1) est hors connexion. Vous devriez voir le nœud 2 être le leader
du réseau:
> state router Done ... > state leader Done
Une fois que vous avez confirmé, arrêtez le thread et rétablissez la configuration d'usine du nœud 2 avant de le quitter. Une restauration des paramètres d'usine est effectuée pour que les identifiants du réseau Thread que nous utilisions dans cet exercice ne soient pas transférés à l'exercice suivant.
> thread stop Done > factoryreset > > exit
Rétablir la configuration d'usine et quitter le nœud 1:
> factoryreset > > exit
Consultez la documentation de référence de la CLI OpenThread pour explorer toutes les commandes CLI disponibles.
5. Authentifier des nœuds avec la mise en service
Dans l'exercice précédent, vous avez configuré un réseau Thread avec deux appareils simulés et une connectivité vérifiée. Toutefois, seul le trafic local de liaison IPv6 non authentifiée peut transiter entre les appareils. Pour acheminer le trafic IPv6 global entre eux (et Internet via un routeur de bordure Thread), les nœuds doivent être authentifiés.
Pour s'authentifier, un appareil doit agir en tant que commissaire. Le commissaire est le serveur d'authentification actuellement élu pour les nouveaux appareils Thread. Il autorise également l'accès aux identifiants réseau requis pour que les appareils rejoignent le réseau.
Dans cet exercice, nous allons utiliser la même topologie à deux nœuds. Pour l'authentification, le Thread Leader agira en tant que Commissaire, le routeur Thread en tant que Joiner.
1. Créer un réseau
Si vous poursuivez l'exercice précédent, vous devriez avoir ouvert deux fenêtres de terminal. Si ce n'est pas le cas, assurez-vous qu'ils sont ouverts et prêts à être utilisés. L'un des nœuds servira de nœud 1, l'autre de nœud 2.
Dans le nœud 1, générez le processus de la CLI:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Remarque:Si l'invite >
ne s'affiche pas après l'exécution de cette commande, appuyez sur enter
.
Créez un ensemble de données opérationnel, validez-le en tant qu'ensemble actif, puis démarrez 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
Validez cet ensemble de données actif:
> dataset commit active Done
Ouvrez l'interface IPv6:
> ifconfig up Done
Démarrez l'opération du protocole Thread:
> thread start Done
Patientez quelques secondes, puis vérifiez que l'appareil est devenu Thread Leader:
> state leader Done
2. Démarrer le rôle de commissaire
Toujours sur le nœud 1, démarrez le rôle de commissaire:
> commissioner start Done
Autorisez n'importe quel Joiner (à l'aide du caractère générique *
) avec les identifiants Joiner J01NME
pour effectuer une commission sur le réseau. Un Joiner est un appareil qui est ajouté par un administrateur à un réseau Thread mis en service.
> commissioner joiner add * J01NME Done
3. Démarrer le rôle Joiner
Dans une deuxième fenêtre de terminal, générez un nouveau processus CLI. Il s'agit du nœud 2.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Sur le nœud 2, activez le rôle Joiner à l'aide des identifiants J01NME
Joiner.
> ifconfig up Done > joiner start J01NME Done
... patientez quelques secondes jusqu'à la confirmation ...
Join success
En tant que Joiner, l'appareil (nœud 2) s'est authentifié avec le commissaire (nœud 1) et a reçu les identifiants du réseau Thread.
Maintenant que le nœud 2 est authentifié, démarrez Thread:
> thread start Done
4. Valider l'authentification réseau
Vérifiez le state
sur le nœud 2 pour vérifier qu'il a maintenant rejoint le réseau. En deux minutes, le nœud 2 passe de child
à router
:
> state child Done ... > state router Done
5. Réinitialiser la configuration
Pour préparer l'exercice suivant, réinitialisez la configuration. Sur chaque nœud, arrêtez Thread, rétablissez la configuration d'usine et quittez l'appareil Thread simulé:
> thread stop Done > factoryreset > > exit
Vous devrez peut-être appuyer sur enter
plusieurs fois pour afficher l'invite >
après une commande factoryreset
.
6. Gérer le réseau avec le daemon OpenThread
Pour cet exercice, nous allons simuler une instance de CLI (un seul appareil Thread SoC intégré) et une instance de co-processeur (RCP).
ot-daemon
est un mode de l'application OpenThread Posix qui utilise un socket UNIX en entrée et en sortie, de sorte que le cœur OpenThread peut s'exécuter en tant que service. Un client peut communiquer avec ce service en se connectant au socket en utilisant la CLI OpenThread comme protocole.
ot-ctl
est une CLI fournie par ot-daemon
pour gérer et configurer le RCP. Cela permet de connecter le protocole RCP au réseau créé par l'appareil Thread.
Utiliser ot-daemon
Cet exercice utilisera trois fenêtres de terminal, correspondant aux éléments suivants:
- Instance CLI de l'appareil Thread simulé (nœud 1)
- Processus
ot-daemon
ot-ctl
instance de CLI
Si vous poursuivez depuis l'exercice précédent, vous devriez avoir ouvert deux fenêtres de terminal. Ouvrez-en une troisième pour vous assurer que vous avez trois fenêtres de terminal disponibles pour cet exercice.
1. Démarrer le nœud 1
Dans la première fenêtre du terminal, exécutez le processus de la CLI pour votre appareil Thread simulé:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Remarque:Si l'invite >
ne s'affiche pas après l'exécution de cette commande, appuyez sur enter
.
Créez un ensemble de données opérationnel, validez-le en tant qu'ensemble actif, puis démarrez 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
Validez cet ensemble de données actif:
> dataset commit active Done
Ouvrez l'interface IPv6:
> ifconfig up Done
Démarrez l'opération du protocole Thread:
> thread start Done
Affichez les adresses IPv6 attribuées à l'interface Thread de Node 1:
> 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 >
Comme expliqué à l'étape Simuler un réseau Thread, une adresse est "link-local" (fe80
) et trois sont "mail-local" (fd
). L'EID est l'adresse locale du réseau maillé dont l'adresse ne contient pas ff:fe00
. Dans cet exemple de résultat, l'EID est fd55:cf34:dea5:7994:460:872c:e807:c4ab
.
Identifiez l'EID spécifique de votre sortie ipaddr
, qui sera utilisé pour communiquer avec le nœud.
2. Lancer ot-daemon
Dans la deuxième fenêtre de terminal, accédez au répertoire openthread
et démarrez ot-daemon
pour un nœud RCP que nous appellerons le nœud 2. Utilisez l'option détaillée -v
pour afficher la sortie du journal, vérifier qu'elle est en cours d'exécution et utiliser la commande sudo
:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+forkpty:///build/simulation/examples/apps/ncp/ot-rcp?forkpty-arg=2'
Si l'opération réussit, ot-daemon
en mode détaillé génère un résultat semblable à celui-ci:
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
Laissez ce terminal ouvert et exécuté en arrière-plan. Vous ne devrez saisir aucune autre commande.
3. Utiliser ot-ctl pour joindre le réseau
Nous n'avons pas encore commandé de nœud 2 (le protocole RCP ot-daemon
) à un réseau Thread. C'est là que ot-ctl
entre en jeu. ot-ctl
utilise la même CLI que l'application CLI OpenThread. Par conséquent, vous pouvez contrôler ot-daemon
nœuds de la même manière que les autres appareils Thread simulés.
Dans une troisième fenêtre de terminal, démarrez ot-ctl
:
$ sudo ./build/posix/src/posix/ot-ctl >
Remarque:Si l'invite >
ne s'affiche pas après l'exécution de cette commande, appuyez sur enter
.
Vous utiliserez ot-ctl
dans cette troisième fenêtre de terminal pour gérer le nœud 2 (le nœud RCP) que vous avez démarré dans la deuxième fenêtre de terminal avec ot-daemon
. Vérifiez le state
du nœud 2:
> state disabled Done
Obtenez le eui64
du nœud 2 pour restreindre la participation à l'outil de jointure spécifique:
> eui64 18b4300000000001 Done
Sur le nœud 1 (première fenêtre de terminal), démarrez le Commissaire et limitez la jointure à cette eui64:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Sur le nœud 2 (troisième fenêtre de terminal), affichez l'interface réseau et rejoignez le réseau:
> ifconfig up Done > joiner start J01NME Done
... patientez quelques secondes jusqu'à la confirmation ...
Join success
En tant que Joiner, le RCP (nœud 2) s'est authentifié avec le commissaire (nœud 1) et a reçu les identifiants du réseau Thread.
Associez maintenant le nœud 2 au réseau Thread:
> thread start Done
4. Valider l'authentification réseau
Vérifiez le state
sur le nœud 2 pour vérifier qu'il a maintenant rejoint le réseau. En deux minutes, le nœud 2 passe de child
à router
:
> state child Done ... > state router Done
5. Valider la connectivité
Quittez ot-ctl
à l'aide de la commande Ctrl+D ou exit
. Sur la ligne de commande de votre machine hôte, pinguez le nœud 1 en utilisant son EID avec la commande ping6
. Si l'instance RCP ot-daemon
est correctement associée au réseau Thread et qu'elle communique avec elle, le ping aboutit:
$ 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
7. Félicitations !
Vous avez simulé votre premier réseau Thread à l'aide d'OpenThread. Parfait !
Dans cet atelier de programmation, vous avez appris à :
- Configurer la chaîne d'outils de compilation OpenThread
- Simuler un réseau Thread
- Authentifier les nœuds Thread
- Gérer un réseau Thread avec le daemon OpenThread
Pour en savoir plus, consultez les articles suivants: