Enrutador de borde de subprocesos - Thread 1.2 Multicast

1. Introducción

608c4c35050eb280.png

¿Qué es Thread?

Thread es un protocolo de red de malla inalámbrica de baja potencia basado en IP que permite comunicaciones seguras de dispositivo a dispositivo y de dispositivo a nube. Las redes de subprocesos pueden adaptarse a los cambios de topología para evitar fallas de un solo punto.

¿Qué es OpenThread?

OpenThread lanzado por Google es una implementación de código abierto de THREAD®.

¿Qué es un enrutador de borde OpenThread?

Border Router OpenThread (OTBR) lanzado por Google es una implementación de código abierto de la rosca Border Router.

Subproceso 1.2 multidifusión

Thread 1.2 define una serie de características para admitir multidifusión en una red heterogénea (segmentos de red Thread y Wi-Fi / Ethernet) para direcciones de multidifusión con un alcance mayor que el ámbito local.

Un enrutador fronterizo Thread 1.2 registra su conjunto de datos de enrutador troncal (BBR), y el servicio BBR seleccionado es el enrutador troncal primario (PBBR), que es responsable de la multidifusión entrante / saliente hacia adelante.

Un dispositivo Thread 1.2 envía un mensaje CoAP para registrar la dirección de multidifusión en el PBBR (registro de escucha de multidifusión, MLR para abreviar) si la dirección es mayor que el ámbito local. PBBR utiliza MLDv2 en su interfaz externa para comunicarse con la LAN / WAN IPv6 más amplia sobre los grupos de multidifusión IPv6 que necesita escuchar, en nombre de su red de subprocesos local. Y PBBR solo reenvía tráfico de multidifusión a la red de subprocesos si el destino está suscrito por al menos un dispositivo de subprocesos.

Para los dispositivos finales mínimos de Thread 1.2, pueden depender de su padre para agregar la dirección de multidifusión y realizar MLR en su nombre, o registrarse ellos mismos si su padre es de Thread 1.1.

Para más detalles, por favor refiérase a rosca 1.2 Especificación de la Sección 5.24 de reenvío de multidifusión más grande que alcance Reino-local.

Lo que vas a construir

En este laboratorio de código, configurará un enrutador de borde de subprocesos y dos dispositivos de subprocesos, luego habilitará y verificará las funciones de multidifusión en dispositivos de subprocesos y dispositivos Wi-Fi.

Lo que vas a aprender

  • Cómo compilar el firmware nRF52840 con funciones de multidifusión Thread 1.2.
  • Cómo suscribirse a direcciones de multidifusión IPv6 en dispositivos Thread.

Que necesitarás

  • Un dispositivo Raspberry Pi 3/4 y una tarjeta SD con al menos 8 GB de capacidad.
  • 3 Nordic Semiconductor nRF52840 DK planchar.
  • Un acceso Wi-Fi sin IPv6 Router Advertisement Guardia activado en el router.
  • Laptop Linux / macOS (Raspberry Pi también funciona) con Python3 instalado.

2. Configurar OTBR

Sigue el hilo Border Router - bidireccional conectividad IPv6 y DNS-Based descubrimiento de servicios de laboratorio de programación para establecer un hilo Border Router en la Raspberry Pi.

Cuando se complete, la Raspberry Pi debería haber creado una red Thread en funcionamiento y estar conectada a una red Wi-Fi.

OTBR debería convertirse en el enrutador principal principal en cuestión de segundos.

$ 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. Construir y flashear dispositivos Thread

Cree la aplicación CLI Thread 1.2 con multidifusión y actualice las dos placas nRF52840 DK.

Compilación del firmware nRF52840 DK

Siga las instrucciones para clonar el proyecto y compilar el firmware 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

Podemos encontrar el firmware HEX construido con éxito en ot-cli-ftd.hex .

Firmware flash nRF52840 DK

El firmware en nRF52840 DK usando nrfjprog , que es parte de las herramientas de línea de comandos NRF .

$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset

4. Conecte dispositivos Thread a la red Thread

OTBR ha creado una red de subprocesos en pasos anteriores. Ahora podemos agregar los nRF52840 DK a la red Thread:

Obtenga un conjunto de datos activo sin procesar de OTBR:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Conéctese a una placa nRF52840 DK:

$ screen /dev/ttyACM0 115200

Configure el conjunto de datos activo para el nRF52840 DK:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Inicie la pila de subprocesos y espere unos segundos y verifique que el dispositivo se haya conectado correctamente:

> ifconfig up
Done
> thread start
Done
> state
child

Repita los pasos anteriores para conectar la otra placa nRF52840 DK a la red Thread.

Ahora hemos configurado con éxito la red Thread con 3 dispositivos Thread: OTBR y dos placas nRF52840 DK.

5. Configurar la red Wi-Fi

Configure la red Wi-Fi en OTBR y la computadora portátil para que estén conectados al mismo punto de acceso Wi-Fi.

Podemos utilizar Raspi-config para configurar el SSID Wi-Fi y contraseña en la Frambuesa Pi OTBR.

La topología de red final se muestra a continuación:

5d0f36fd69ebcc9a.png

6. Suscríbase a la dirección de multidifusión IPv6

Suscríbase a ff05 :: abcd en el dispositivo final 1 nRF52840:

> ipmaddr add ff05::abcd
Done

Verificar ff05::abcd está suscrito con éxito:

> 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

Suscríbase a ff05 :: abcd en la computadora portátil:

Necesitamos una secuencia de comandos de Python subscribe6.py para suscribirse a una dirección de multidifusión en la computadora portátil.

Copia el código de abajo y guardarlo como 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.')

Ejecutar subscribe6.py para suscribirse ff05::abcd en la interfaz de red Wi-Fi (por ejemplo wlan0):

$ sudo python3 subscribe6.py wlan0 ff05::abcd
Subscribed ff05::abcd on interface wlan0.
Press ENTER to quit.

La topología de red final con suscripciones de multidifusión se muestra a continuación:

b118448c98b2d583.png

Ahora que hemos suscrito la dirección de multidifusión IPv6 tanto en el dispositivo final 1 nRF52840 en la red Thread como en la computadora portátil en la red Wi-Fi, verificaremos la accesibilidad de multidifusión IPv6 bidireccional en las siguientes secciones.

7. Verifique la multidifusión IPv6 entrante

Ahora, debemos ser capaces de llegar tanto nRF52840 extremo del dispositivo 1 en la red de rosca y el ordenador portátil utilizando IPv6 dirección multicast ff05::abcd de la red Wi-Fi.

Haga ping ff05 :: abcd en OTBR a través de la interfaz 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!)

Podemos ver que OTBR puede recibir dos respuestas de ping tanto del dispositivo nRF52840 extremo 1 y el ordenador portátil, ya que ambos se han suscrito a ff05::abcd . Esto muestra que OTBR puede reenviar los paquetes de multidifusión de solicitud de ping IPv6 desde la red Wi-Fi a la red Thread.

8. Verifique la multidifusión IPv6 saliente

Haga ping ff05 :: abcd en nRF52840 Dispositivo 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

El dispositivo final nRF52840 2 puede recibir respuestas de ping tanto del dispositivo final nRF52840 1 como de la computadora portátil. Esto muestra que OTBR puede reenviar los paquetes de multidifusión IPv6 Ping Reply desde la red Thread a la red Wi-Fi.

9. Felicitaciones

Enhorabuena, ha configurado correctamente un enrutador de borde de subprocesos y ha verificado la multidifusión IPv6 bidireccional.

Para más información sobre OpenThread, visita openthread.io .

Documentos de referencia: