1. Présentation
Qu'est-ce que Thread ?
Thread est un protocole de mise en réseau sans fil basé sur l'adresse IP, qui permet de sécuriser le réseau maillé sans fil et d'un appareil à l'autre. Les réseaux de threads peuvent s'adapter aux modifications de topologie pour éviter les défaillances d'un point unique.
Qu'est-ce qu'OpenThread ?
OpenThread publié par Google est une implémentation Open Source de Thread®.
Qu'est-ce qu'un routeur de bordure OpenThread ?
Le routeur Open Border Border Router (OTBR) publié par Google est une mise en œuvre Open Source du routeur de bordure Thread.
Thread 1.2 (multidiffusion)
Thread 1.2 définit une série de fonctionnalités pour permettre la multidiffusion sur un réseau hétérogène (segments Thread et Wi-Fi/Ethernet) pour les adresses de multidiffusion dont la portée est supérieure à celle du domaine local.
Le routeur de bordure Thread 1.2 enregistre son ensemble de données Backbone Router (BBR), et le service BBR sélectionné est le routeur Backbone principal (PBBR), qui est responsable du trafic entrant/sortant pour la multidiffusion.
Un appareil Thread 1.2 envoie un message CoAP pour enregistrer l'adresse de multidiffusion au PBBR (Multicast Écouteur Registration, MLR pour résumer) si l'adresse est supérieure à la plage locale du domaine. PBBR utilise MLDv2 sur son interface externe pour communiquer avec l'ensemble des réseaux LAN/WAN IPv6 sur les groupes de multidiffusion IPv6 qu'il doit écouter, au nom de son réseau Thread local. Le PBBR ne transfère le trafic de multidiffusion vers le réseau Thread que si la destination est abonnée à au moins un appareil Thread.
Pour les appareils finaux de Thread 1.2, ils peuvent dépendre de leur parent pour agréger l'adresse de multidiffusion et effectuer le MLR en leur nom, ou s'enregistrer eux-mêmes si leur parent est Thread 1.1.
Pour plus d'informations, veuillez vous reporter à la section 5.24 "Spécification du thread 1.2" relative au transfert multicast pour une portée supérieure à celle du domaine local.
Objectif de cet atelier
Dans cet atelier de programmation, vous allez configurer un routeur de bordure Thread et deux appareils Thread, puis activer et vérifier les fonctionnalités Multicast sur les appareils Thread et les appareils Wi-Fi.
Points abordés
- Créer le micrologiciel nRF52840 avec les fonctionnalités de multidiffusion Thread 1.2.
- Comment s'abonner aux adresses de multidiffusion IPv6 sur les appareils Thread.
Ce dont vous avez besoin
- Un appareil Raspberry Pi 3/4 et une carte SD disposant d'au moins 8 Go
- 3 cartes nordiques semi-conducteurs nRF52840 DK.
- Un point d'accès Wi-Fi sans réseau publicitaire IPv6 Guard Guard activé sur le routeur.
- Ordinateur portable Linux/macOS (Raspberry Pi fonctionne également) avec Python 3 installé
2. Configurer le service OTBR
Suivez lesRouteur de bordure Thread - Connectivité IPv6 bidirectionnelle et découverte du service basé sur DNS cet atelier de programmation pour configurer un routeur de bordure Thread sur le Raspberry Pi.
Une fois l'opération terminée, le Raspberry Pi doit avoir créé un réseau Thread opérationnel et être connecté à un réseau Wi-Fi.
L'OTBR doit devenir le routeur backbone principal en quelques secondes.
$ sudo ot-ctl bbr state Primary Done $ sudo ot-ctl bbr BBR Primary: server16: 0xD800 seqno: 23 delay: 1200 secs timeout: 3600 secs Done
3. Créer des appareils Thread Thread
Créez l'application CLI Thread 1.2 avec Multicast et faites clignoter les deux cartes nKF52840 DK.
Créer un micrologiciel nRF52840 DK
Suivez les instructions pour cloner le projet et créer le micrologiciel nRF52840.
$ mkdir -p ~/src $ cd ~/src $ git clone --recurse-submodules --depth 1 https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx/ $ script/build nrf52840 USB_trans -DOT_MLR=ON -DOT_THREAD_VERSION=1.2 $ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex
Vous trouverez le micrologiciel hexadécimal créé à l'adresse ot-cli-ftd.hex
.
Micrologiciel Flash nRF52840 DK
Flashez le micrologiciel sur nRF52840 DK à l'aide de nrfjprog
, qui fait partie des outils de ligne de commande nRF.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. Connecter des appareils Thread au réseau Thread
OTBR a créé un réseau Thread lors des étapes précédentes. Nous pouvons maintenant ajouter les DKF52840 DK au réseau Thread:
Obtenez un ensemble de données Active RAW brut depuis OTBR:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Connectez-vous à une carte nRF52840 DK:
$ screen /dev/ttyACM0 115200
Configurez l'ensemble de données actif pour l'ensemble de données nRF52840:
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
Démarrez la pile de threads et patientez quelques secondes, puis vérifiez que l'appareil est bien connecté:
> ifconfig up Done > thread start Done > state child
Répétez les étapes ci-dessus pour connecter l'autre carte DRF52840 DK au réseau Thread.
Nous avons désormais configuré le réseau Thread avec trois appareils Thread: OTBR et deux cartes nRF52840 DK.
5. Configurer le réseau Wi-Fi
Configurez le réseau Wi-Fi sur les appareils OTBR et l'ordinateur portable afin qu'ils soient connectés au même point d'accès Wi-Fi.
Nous pouvons utiliser raspi-config pour configurer le SSID et la phrase secrète Wi-Fi sur l'appareil OTBR Raspberry Pi.
La topologie finale du réseau est illustrée ci-dessous:
6. S'abonner à l'adresse de multidiffusion IPv6
S'abonner à ff05::abcd sur nRF52840 Appareil final 1:
> ipmaddr add ff05::abcd Done
Vérifiez que ff05::abcd
a bien été abonné:
> ipmaddr ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff02:0:0:0:0:0:0:2 ff03:0:0:0:0:0:0:2 ff02:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:fc Done
S'abonner à ff05::abcd sur l'ordinateur portable:
Nous avons besoin d'un script Python subscribe6.py
pour nous abonner à une adresse de multidiffusion sur l'ordinateur portable.
Copiez le code ci-dessous et enregistrez-le sous le nom subscribe6.py
:
import ctypes
import ctypes.util
import socket
import struct
import sys
libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')
Exécutez subscribe6.py
pour vous abonner à ff05::abcd
sur l'interface réseau Wi-Fi (par exemple, wlan0):
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
La topologie finale du réseau avec abonnements multicast est présentée ci-dessous:
Maintenant que nous avons abonné l'adresse de multidiffusion IPv6 sur l'appareil final 1 nFF52840 sur le réseau Thread et sur l'ordinateur portable sur le réseau Wi-Fi, nous allons vérifier la joignabilité de la multidiffusion IPv6 bidirectionnelle dans les sections suivantes.
7. Vérifier la multidiffusion IPv6 entrante
Nous devons maintenant pouvoir accéder à la fois à l'appareil final 1 nFF52840 sur le réseau Thread et à l'ordinateur portable avec l'adresse de multidiffusion IPv6 ff05::abcd
sur le réseau Wi-Fi.
Ping ff05::abcd sur OTBR via l'interface Wi-Fi:
$ ping -6 -b -t 5 -I wlan0 ff05::abcd PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!)
Nous pouvons constater qu'OTBR peut recevoir deux réponses ping à partir de l'appareil final nRF52840 1 et de l'ordinateur portable parce qu'ils sont tous deux abonnés à ff05::abcd
. Cela montre que l'OTBR peut transférer les paquets de multidiffusion IPv6 de la requête ping du réseau Wi-Fi vers le réseau Thread.
8. Vérifier la multidiffusion IPv6 sortante
Ping ff05::abcd sur nRF52840 Appareil final 2:
$ ping ff05::abcd 100 10 1 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms
Le périphérique d'arrivée 2 nRF52840 peut recevoir des réponses ping provenant à la fois de l'appareil de fin nRF52840 1 et de l'ordinateur portable. Cela montre que l'OTBR peut transférer les packages de multidiffusion IPv6 Ping Réponse du réseau Thread vers le réseau Wi-Fi.
9. Félicitations
Félicitations, vous avez bien configuré un routeur de bordure Thread et vérifié la multidiffusion IPv6 bidirectionnelle !
Pour en savoir plus sur OpenThread, rendez-vous sur openthread.io.
Documentation de référence: