1. Introduction
Qu'est-ce que Thread ?
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 les points de défaillance uniques.
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 IPv6
Thread définit une série de fonctionnalités pour prendre en charge le multicast sur un réseau hétérogène (segments de réseau Thread et Wi-Fi/Ethernet) pour les adresses multicast dont la portée est supérieure à celle du domaine local.
Un routeur de bordure Thread enregistre son ensemble de données de routeur de backbone (BBR). Le service BBR sélectionné est le routeur de backbone principal (PBBR), qui est responsable du transfert multicast entrant/sortant.
Un appareil Thread envoie un message CoAP pour enregistrer l'adresse de multidiffusion auprès du PBBR (enregistrement d'écouteur de multidiffusion, MLR en abrégé) si l'adresse est plus grande que le domaine local. PBBR utilise MLDv2 sur son interface externe pour communiquer avec le réseau IPv6 LAN/WAN étendu concernant les groupes multicast IPv6 qu'il doit écouter, au nom de son réseau Thread local. De plus, PBBR ne transfère le trafic multicast vers le réseau Thread que si la destination est abonnée à au moins un appareil Thread.
Pour les appareils finaux minimaux Thread, ils peuvent dépendre de leur parent pour agréger l'adresse multicast et effectuer le MLR en leur nom, ou s'enregistrer eux-mêmes si leur parent est de Thread 1.1.
Pour en savoir plus, veuillez consulter la spécification Thread.
Ce que vous allez faire
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
- Comment créer un micrologiciel nRF52840 compatible avec le multicast IPv6.
- Découvrez comment vous abonner à des adresses de multidiffusion IPv6 sur les appareils Thread.
Prérequis
- Un poste de travail Linux pour créer et flasher un RCP Thread, la CLI OpenThread et tester le multicast IPv6.
- Un Raspberry Pi pour le routeur de bordure Thread.
- 2 dongles USB Nordic Semiconductor nRF52840 (un pour le RCP et deux pour les appareils finaux Thread).
2. Configurer OTBR
Le moyen le plus rapide de configurer un OTBR consiste à suivre le guide de configuration OTBR.
Une fois la configuration OTBR terminée, utilisez ot-ctl
pour vérifier que l'OTBR est devenu le routeur principal du réseau fédérateur en quelques secondes.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. Compiler et flasher des appareils Thread
Créez l'application Thread CLI avec Multicast et flashez les deux cartes nRF52840 DK.
Compiler le micrologiciel nRF52840 DK
Suivez les instructions pour cloner le projet et compiler le micrologiciel nRF52840.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
Suivez l'atelier de programmation Créer un réseau Thread avec des cartes nRF52840 et OpenThread tel qu'il est écrit. Une fois l'appareil final flashé avec l'image CLI, suivez Rejoindre le deuxième nœud au réseau Thread pour ajouter l'appareil Thread au réseau Thread. Répétez l'opération pour le deuxième appareil final Thread.
4. S'abonner à l'adresse multicast IPv6
Abonnez-vous à ff05::abcd sur l'appareil final nRF52840 1 :
> ipmaddr add ff05::abcd Done
Vérifiez que l'abonnement à ff05::abcd
a bien été souscrit :
> ipmaddr ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 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 s'abonner à une adresse multicast 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 souscrire 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 de réseau finale avec les abonnements multicast est illustrée ci-dessous :
Maintenant que nous avons souscrit à l'adresse multicast IPv6 sur l'appareil final nRF52840 1 dans le réseau Thread et sur l'ordinateur portable dans le réseau Wi-Fi, nous allons vérifier l'accessibilité multicast IPv6 bidirectionnelle dans les sections suivantes.
5. Vérifier la multidiffusion IPv6 entrante
Nous devrions maintenant pouvoir accéder à l'appareil final nRF52840 1 dans le réseau Thread et à l'ordinateur portable à l'aide de l'adresse multicast IPv6 ff05::abcd
depuis le réseau Wi-Fi.
Pinguez 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 pouvons voir que l'OTBR peut recevoir deux réponses ping de l'appareil final nRF52840 1 et de l'ordinateur portable, car ils sont tous deux abonnés à ff05::abcd
. Cela montre que l'OTBR peut transférer les paquets multicast de requête Ping IPv6 du réseau Wi-Fi vers le réseau Thread.
6. 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 paquets de multidiffusion de réponse Ping IPv6 du réseau Thread vers le réseau Wi-Fi.
7. Félicitations
Félicitations, vous avez correctement configuré un routeur de bordure Thread et vérifié le multicast IPv6 bidirectionnel.
Pour en savoir plus sur OpenThread, consultez openthread.io.
Documents de référence :