1. Introduction
Qu'est-ce que Thread ?
Thread est un protocole de réseau maillé sans fil basse consommation basé sur l'adresse IP, qui permet des communications sécurisées d'appareil à appareil et d'appareil à cloud. Les réseaux Thread peuvent s'adapter aux changements de topologie pour éviter les défaillances à 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 de bordure OpenThread (OTBR) publié par Google est une implémentation Open Source du routeur de bordure Thread.
Multicast Thread 1.2
Thread 1.2 définit une série de fonctionnalités permettant la multidiffusion sur un réseau hétérogène (segments de réseau Thread et Wi-Fi/Ethernet) pour les adresses de multidiffusion dont le champ d'application est plus vaste que le domaine local.
Un routeur de bordure Thread 1.2 enregistre son ensemble de données de routeur backbone, et le service BBR sélectionné est le routeur backbone principal (PBBR), responsable de l'entrée/la sortie de multidiffusion vers l'avant.
Un appareil Thread 1.2 envoie un message CoAP pour enregistrer l'adresse de multidiffusion sur le PBBR (Multicast Listener Registration, MLR) si l'adresse est plus grande que le domaine local. PBBR utilise MLDv2 sur son interface externe pour communiquer avec le LAN/WAN IPv6 plus large au sujet des groupes de multidiffusion IPv6 qu'il doit écouter, au nom de son réseau Thread local. Et PBBR ne transfère le trafic de multidiffusion sur le réseau Thread que si la destination est abonnée à au moins un appareil Thread.
Pour les appareils finaux Thread 1.2 minimaux, ils peuvent dépendre de leur parent pour agréger l'adresse multicast et faire MLR en leur nom, ou s'enregistrer si leur parent est Thread 1.1.
Pour en savoir plus, reportez-vous à la section 5.24 de la spécification du thread 1.2, section 5.24 Transfert multicast pour un champ d'application supérieur à Realm-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 de multidiffusion sur les appareils Thread et les appareils Wi-Fi.
Points abordés
- Comment créer le micrologiciel nRF52840 avec les fonctionnalités de multidiffusion Thread 1.2
- 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 avec capacité d'au moins 8 Go.
- 3 cartes Nordic Semiconductor nRF52840 DK.
- Un point d'accès Wi-Fi sans validation de l'annonce de routeur IPv6 activée sur le routeur.
- Ordinateur portable Linux/macOS (Raspberry Pi fonctionne également) sur lequel Python3 est installé
2. Configurer OTBR
Suivez l'atelier de programmation Routeur de bordure Thread – Connectivité IPv6 bidirectionnelle et découverte de services basés sur le DNS 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 fonctionnel et être connecté à un réseau Wi-Fi.
Le service 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. Appareils Build et Flash Thread
Créez l'application CLI Thread 1.2 avec Multicast et flashez les deux cartes nRF52840 DK.
Micrologiciel nRF52840 DK
Suivez les instructions pour cloner le projet et compiler 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
Le micrologiciel HEX a bien été compilé à 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. Associer des appareils Thread au réseau Thread
OTBR a créé un réseau Thread aux étapes précédentes. Nous pouvons maintenant ajouter les DK nRF52840 au réseau Thread:
Obtenez un ensemble de données actif brut à partir d'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 le nRF52840 DK:
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
Démarrez la pile Thread, attendez quelques secondes et vérifiez que le périphérique s'est bien connecté:
> ifconfig up Done > thread start Done > state child
Répétez les étapes ci-dessus pour connecter l'autre carte DK nRF52840 au réseau Thread.
Nous avons à présent correctement 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 OTBR et l'ordinateur portable de manière à ce 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'OTBR du 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 l'appareil final nRF52840 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
Abonnez-vous à 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 abonner ff05::abcd
sur l'interface du 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 les abonnements de multidiffusion est illustrée ci-dessous:
Maintenant que nous avons abonné l'adresse de multidiffusion IPv6 à la fois sur l'appareil final nRF52840 1 dans le réseau Thread et sur l'ordinateur portable du réseau Wi-Fi, nous allons vérifier la joignabilité de la multidiffusion IPv6 bidirectionnelle dans les sections suivantes.
7. Vérifier le multicast IPv6 entrant
Nous devrions maintenant être en mesure d'accéder à la fois à l'appareil final nRF52840 1 sur le réseau Thread et à l'ordinateur portable avec l'adresse de multidiffusion IPv6 ff05::abcd
à partir du 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!) # If using MacOS, use this command. The interface is typically not "wlan0" for Mac. $ ping6 -h 5 -I wlan0 ff05::abcd
Nous constatons qu'OTBR peut recevoir deux réponses ping de l'appareil final nRF52840 et de l'ordinateur portable, car tous deux sont abonnés à ff05::abcd
. Cela montre que l'OTBR peut transférer les paquets de multidiffusion IPv6 Ping Request du réseau Wi-Fi vers le réseau Thread.
8. Vérifier le multicast IPv6 sortant
Ping ff05::abcd sur l'appareil final nRF52840 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
L'appareil final nRF52840 2 peut recevoir des réponses ping de l'appareil final nRF52840 1 et de l'ordinateur portable. Cela montre que l'OTBR peut transférer les packages de multidiffusion IPv6 Ping Reply du réseau Thread au réseau Wi-Fi.
9. Félicitations
Félicitations ! Vous avez configuré un routeur de bordure Thread et vérifié le multicast IPv6 bidirectionnel.
Pour en savoir plus sur OpenThread, rendez-vous sur openthread.io.
Documents de référence: