1. Introduction
Qu'est-ce que Thread ?
Thread est un protocole de réseau maillé sans fil basse consommation basé sur IP qui permet de communiquer de manière sécurisée entre les appareils et le cloud. Les réseaux Thread peuvent s'adapter aux modifications de la topologie pour éviter les défaillances ponctuelles.
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 la diffusion multicast sur un réseau hétérogène (segments de réseau Thread et Wi-Fi/Ethernet) pour les adresses de diffusion multicast dont la portée est plus grande que celle du domaine local.
Un routeur de bordure Thread enregistre son ensemble de données de routeur de backbone (BBR), et le service BBR sélectionné est le routeur de backbone principal (PBBR), qui est responsable de la transmission entrante/sortante multicast.
Un appareil Thread envoie un message CoAP pour enregistrer l'adresse de multidiffusion auprès du PBBR (Multicast Listener Registration, MLR) si l'adresse est plus grande que l'adresse locale du domaine. Le PBBR utilise MLDv2 sur son interface externe pour communiquer avec le LAN/WAN IPv6 plus large sur les groupes multicast IPv6 qu'il doit écouter au nom de son réseau Thread local. De plus, le PBBR ne transfère le trafic multicast vers le réseau Thread que si au moins un appareil Thread est abonné à la destination.
Les appareils finaux Thread minimals peuvent dépendre de leur parent pour agréger l'adresse multicast et effectuer la MLR en leur nom, ou s'enregistrer eux-mêmes si leur parent est de la version Thread 1.1.
Pour en savoir plus, consultez la spécification Thread.
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 un micrologiciel nRF52840 compatible avec le multicast IPv6
- S'abonner aux adresses de multidiffusion IPv6 sur les appareils Thread
Ce dont vous aurez besoin
- 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.
- Deux dongles USB nRF52840 Nordic Semiconductor (un pour le RCP et deux pour les appareils finaux Thread)
2. Configurer OTBR
Le moyen le plus rapide de configurer un OTBR est de suivre le guide de configuration de l'OTBR.
Une fois la configuration de l'OTBR terminée, utilisez ot-ctl
pour vérifier que l'OTBR est devenu le routeur de backbone principal 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 le multicast et flashez les deux cartes DK nRF52840.
Créer le micrologiciel du DK nRF52840
Suivez les instructions pour cloner le projet et créer 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 que décrit. Une fois l'image de la CLI flashée sur l'appareil final, suivez la procédure Joindre 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
S'abonner à ff05::abcd sur l'appareil final nRF52840 1:
> ipmaddr add ff05::abcd Done
Vérifiez que ff05::abcd
est bien abonné:
> 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 nous 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 abonner ff05::abcd
à 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 à la fois sur l'appareil final nRF52840 1 sur le réseau Thread et sur l'ordinateur portable sur le réseau Wi-Fi, nous allons vérifier la connectivité bidirectionnelle du multicast IPv6 dans les sections suivantes.
5. Vérifier la multidiffusion IPv6 entrante
Nous devrions maintenant pouvoir atteindre à la fois l'appareil final nRF52840 1 sur le réseau Thread et l'ordinateur portable à l'aide de l'adresse multicast IPv6 ff05::abcd
du réseau Wi-Fi.
Ping ff05::abcd sur l'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 à la fois 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: