Routeur de bordure Thread – Multicast Thread 1.2

1. Introduction

608c4c35060eb280.png

Qu'est-ce que Thread ?

Thread est un protocole de réseau maillé sans fil basse consommation basé sur les adresses IP, qui permet une communication sécurisée d'appareil à appareil et de cloud à appareil. Les réseaux Thread peuvent s'adapter aux changements de topologie pour éviter les défaillances en un point.

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 des réseaux hétérogènes (segments Thread et Wi-Fi/Ethernet) pour des adresses de multidiffusion avec un champ d'application supérieur au domaine local.

Un routeur de bordure Thread 1.2 enregistre son ensemble de données du routeur backbone (BBR), et le service BBR sélectionné est le routeur principal backbone (PBBR), qui est responsable de l'entrée/sortie sortante de multidiffusion.

Un appareil Thread 1.2 envoie un message CoAP pour enregistrer l'adresse de multidiffusion auprès du PBBR (Multicast Listener Registration, ou 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 sur les groupes de multidiffusion IPv6 dont il a besoin pour écouter, au nom de son réseau Thread local. De plus, le PBBR transfère le trafic de multidiffusion vers le réseau Thread si la destination est abonnée par au moins un appareil Thread.

Pour les appareils finaux Thread 1.2, ils peuvent dépendre de leur parent pour agréger l'adresse de multidiffusion et faire du MLR en leur nom, ou s'enregistrer eux-mêmes si leur parent est de Thread 1.1.

Pour en savoir plus, consultez la section 5.24 Transfert multicast de plus d'un 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 de multidiffusion sur les appareils Thread et les appareils Wi-Fi.

Points abordés

  • Créer un micrologiciel nRF52840 avec les fonctionnalités Multicast Thread 1.2
  • S'abonner à des adresses de multidiffusion IPv6 sur des appareils Thread

Ce dont vous avez besoin

  • Un appareil Raspberry Pi 3/4 et une carte SD d'au moins 8 Go de capacité
  • 3 cartes Nordic Semiconductor nRF52840 DK.
  • Point d'accès Wi-Fi sans routeur d'annonces IPv6 activé sur le routeur.
  • Linux/macOS (Raspberry Pi fonctionne également) sur lequel Python3 est installé.

2. Configurer le service de distribution par contournement

Suivez l'atelier de programmation Routeur de bordure Thread – Connectivité IPv6 bidirectionnelle et détection de services 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 de type Thread et Flash Thread

Créez l'application CLI Thread 1.2 avec Multicast et flashez les deux cartes DK RF52840.

Créer le 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

Le micrologiciel HEX correctement compilé est disponible à l'adresse ot-cli-ftd.hex.

Micrologiciel Flash nRF52840 DK

Flashez le micrologiciel sur DKF52840 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 nDK 52840 DK au réseau Thread:

Obtenez l'ensemble de données actif brut d'OTBR:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Connectez-vous à une carte DK NRF52840:

$ screen /dev/ttyACM0 115200

Configurez l'ensemble de données actif pour la base de données nRF52840 DK:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Démarrez la pile Thread et attendez quelques secondes pour vérifier 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 DK nRF52840 au réseau Thread.

Nous avons maintenant configuré le réseau Thread avec trois appareils Thread: OTBR et deux cartes RF nRF52840.

5. Configurer le réseau Wi-Fi

Configurez le réseau Wi-Fi sur le service de distribution par contournement 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 du Wi-Fi sur le Raspberry Pi OTBR.

La topologie finale du réseau est illustrée ci-dessous:

5d0f36fd69ebcc9a.png

6. S'abonner à l'adresse de multidiffusion IPv6

S'abonner à ff05::abcd sur l'appareil de fin 1 RF52840:

> ipmaddr add ff05::abcd
Done

Vérifiez que ff05::abcd est bien 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 les abonnements de multidiffusion est illustrée ci-dessous:

B118448c98b2d583.png

Maintenant que nous avons souscrit l'adresse de multicast IPv6 sur les appareils de fin 1 RF52840 du réseau Thread et sur les ordinateurs portables du réseau Wi-Fi, nous allons vérifier la joignabilité multicast IPv6 bidirectionnelle dans les sections suivantes.

7. Vérifier la fonctionnalité Multicast IPv6 entrante

Nous devrions maintenant pouvoir accéder à l'appareil final nRF52840 1 du réseau Thread et à l'ordinateur portable utilisant l'adresse de multidiffusion IPv6 ff05::abcd du réseau Wi-Fi.

Pinguer 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

Comme vous pouvez le voir, OTBR peut recevoir deux pings de l'appareil de fin 1 RF52840 et de l'ordinateur portable, car ils sont tous les deux abonnés à ff05::abcd. Cela montre que le service de distribution par contournement peut transférer les paquets de multicast des requêtes IPv6 du réseau Wi-Fi vers le réseau Thread.

8. Vérifier la fonctionnalité Multicast IPv6 sortante

Ping ff05::abcd sur l'appareil de fin 2 RF52840:

> 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 de fin 2 nRF52840 peut recevoir des réponses ping de l'appareil de fin 1 et de l'ordinateur portable. Cela montre que le service de distribution par contournement peut transférer les packages de multidiffusion IPv6 Ping 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é la fonctionnalité Multicast IPv6 bidirectionnelle.

Pour en savoir plus sur OpenThread, consultez openthread.io.

Documents de référence: