Routeur de bordure Thread – Multidiffusion Thread 1.2

1. Introduction

608c4c35050eb280.png

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:

5d0f36fd69ebcc9a.png

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:

b118448c98b2d583.png

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: