Routeur Thread Border - Multithread - Thread 1.2

1. Présentation

608c4c35050eb280.png

Qu'est-ce que Thread ?

Thread est un protocole de mise en réseau sans fil basé sur l'adresse IP, qui permet de sécuriser le réseau maillé sans fil et d'un appareil à l'autre. Les réseaux de threads peuvent s'adapter aux modifications de topologie pour éviter les défaillances d'un 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 Open Border Border Router (OTBR) publié par Google est une mise en œuvre Open Source du routeur de bordure Thread.

Thread 1.2 (multidiffusion)

Thread 1.2 définit une série de fonctionnalités pour permettre la multidiffusion sur un réseau hétérogène (segments Thread et Wi-Fi/Ethernet) pour les adresses de multidiffusion dont la portée est supérieure à celle du domaine local.

Le routeur de bordure Thread 1.2 enregistre son ensemble de données Backbone Router (BBR), et le service BBR sélectionné est le routeur Backbone principal (PBBR), qui est responsable du trafic entrant/sortant pour la multidiffusion.

Un appareil Thread 1.2 envoie un message CoAP pour enregistrer l'adresse de multidiffusion au PBBR (Multicast Écouteur Registration, MLR pour résumer) si l'adresse est supérieure à la plage locale du domaine. PBBR utilise MLDv2 sur son interface externe pour communiquer avec l'ensemble des réseaux LAN/WAN IPv6 sur les groupes de multidiffusion IPv6 qu'il doit écouter, au nom de son réseau Thread local. Le PBBR ne transfère le trafic de multidiffusion vers le réseau Thread que si la destination est abonnée à au moins un appareil Thread.

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

Pour plus d'informations, veuillez vous reporter à la section 5.24 "Spécification du thread 1.2" relative au transfert multicast pour une portée supérieure à celle du 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 Multicast sur les appareils Thread et les appareils Wi-Fi.

Points abordés

  • Créer le micrologiciel nRF52840 avec les fonctionnalités de multidiffusion Thread 1.2.
  • Comment 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 disposant d'au moins 8 Go
  • 3 cartes nordiques semi-conducteurs nRF52840 DK.
  • Un point d'accès Wi-Fi sans réseau publicitaire IPv6 Guard Guard activé sur le routeur.
  • Ordinateur portable Linux/macOS (Raspberry Pi fonctionne également) avec Python 3 installé

2. Configurer le service OTBR

Suivez lesRouteur de bordure Thread - Connectivité IPv6 bidirectionnelle et découverte du service basé sur DNS cet atelier de programmation 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 opérationnel et être connecté à un réseau Wi-Fi.

L'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. Créer des appareils Thread Thread

Créez l'application CLI Thread 1.2 avec Multicast et faites clignoter les deux cartes nKF52840 DK.

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

Vous trouverez le micrologiciel hexadécimal créé à 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. Connecter des appareils Thread au réseau Thread

OTBR a créé un réseau Thread lors des étapes précédentes. Nous pouvons maintenant ajouter les DKF52840 DK au réseau Thread:

Obtenez un ensemble de données Active RAW brut depuis 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 l'ensemble de données nRF52840:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Démarrez la pile de threads et patientez quelques secondes, puis vérifiez 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 DRF52840 DK au réseau Thread.

Nous avons désormais 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 les appareils OTBR 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 Wi-Fi sur l'appareil OTBR 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 nRF52840 Appareil final 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

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 abonnements multicast est présentée ci-dessous:

B118448C98B2D583.png

Maintenant que nous avons abonné l'adresse de multidiffusion IPv6 sur l'appareil final 1 nFF52840 sur le réseau Thread et sur l'ordinateur portable sur le réseau Wi-Fi, nous allons vérifier la joignabilité de la multidiffusion IPv6 bidirectionnelle dans les sections suivantes.

7. Vérifier la multidiffusion IPv6 entrante

Nous devons maintenant pouvoir accéder à la fois à l'appareil final 1 nFF52840 sur le réseau Thread et à l'ordinateur portable avec l'adresse de multidiffusion IPv6 ff05::abcd sur le 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!)

Nous pouvons constater qu'OTBR peut recevoir deux réponses ping à partir de l'appareil final nRF52840 1 et de l'ordinateur portable parce qu'ils sont tous deux abonnés à ff05::abcd. Cela montre que l'OTBR peut transférer les paquets de multidiffusion IPv6 de la requête ping du réseau Wi-Fi vers le réseau Thread.

8. Vérifier la multidiffusion IPv6 sortante

Ping ff05::abcd sur nRF52840 Appareil final 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

Le périphérique d'arrivée 2 nRF52840 peut recevoir des réponses ping provenant à la fois de l'appareil de fin nRF52840 1 et de l'ordinateur portable. Cela montre que l'OTBR peut transférer les packages de multidiffusion IPv6 Ping Réponse du réseau Thread vers le réseau Wi-Fi.

9. Félicitations

Félicitations, vous avez bien configuré un routeur de bordure Thread et vérifié la multidiffusion IPv6 bidirectionnelle !

Pour en savoir plus sur OpenThread, rendez-vous sur openthread.io.

Documentation de référence: