Router de borde Thread: multidifusión Thread 1.2

1. Introducción

608c4c35050eb280.png

¿Qué es Thread?

Thread es un protocolo de red en malla inalámbrica de bajo consumo basado en IP que permite comunicaciones seguras entre dispositivos y entre dispositivos. 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 router de borde OpenThread?

El router de borde de OpenThread (OTBR) que lanzó Google es una implementación de código abierto del router de borde de Thread.

Thread 1.2 Multicast

Thread 1.2 define una serie de funciones que admiten la multidifusión en una red heterogénea (segmentos de Thread y de red Wi-Fi/Ethernet) para direcciones multicast con un alcance mayor que el dominio local.

Un router de borde de Thread 1.2 registra su conjunto de datos de router troncal (BBR), y el servicio de BBR seleccionado es el router troncal principal (PBBR), responsable de la entrada y salida de multidifusión.

Un dispositivo con subproceso 1.2 envía un mensaje CoAP para registrar la dirección de multicast en el PBBR (registro de escucha de multicast, MLR, para abreviar) si la dirección es mayor que el dominio local. PBBR usa 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 Thread local. Además, PBBR solo reenvía tráfico multicast a la red de Thread si el destino está suscrito por al menos un dispositivo Thread.

En el caso de los dispositivos finales mínimos con el subproceso 1.2, es posible que dependan de su elemento superior para agregar la dirección multicast y realizar el MLR en su nombre, o que se registren si el elemento superior es del subproceso 1.1.

Para obtener más información, consulta el artículo 5.24 de la especificación de Thread 1.2, 5.24 Reenvío de multidifusión para un permiso de permiso local o real.

Qué compilarás

En este codelab, configurarás un router de borde de Thread y dos dispositivos Thread. Luego, habilitarás y verificarás las funciones de multicast en dispositivos Thread y dispositivos Wi-Fi.

Qué aprenderá

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

Requisitos

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

2. Configurar OTBR

Sigue el codelab Router de borde de Thread: conectividad IPv6 bidireccional y descubrimiento de servicios basado en DNS para configurar un router de borde de Thread en la placa Raspberry Pi.

Cuando se complete el proceso, la Raspberry Pi debería haber creado una red Thread que funcione y debería estar conectada a una red Wi-Fi.

OTBR debe convertirse en el router troncal 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. Dispositivos de compilación y escritura en la memoria flash de Thread

Compila la aplicación CLI Thread 1.2 con multicast y escribe en la memoria flash de las dos placas nRF52840 DK.

Compilación del firmware nRF52840 DK

Sigue 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 correctamente en ot-cli-ftd.hex.

Firmware de Flash nRF52840 DK

Instala el firmware en nRF52840 DK con nrfjprog, que forma parte de las herramientas de línea de comandos de nRF.

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

4. Cómo conectar dispositivos Thread a la red de Thread

OTBR creó una red Thread en los pasos anteriores. Ahora podemos agregar los DK nRF52840 a la red Thread:

Obtén un conjunto de datos activos sin procesar de OTBR:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Conéctate a una placa nRF52840 DK:

$ screen /dev/ttyACM0 115200

Configura el conjunto de datos activo para el DK nRF52840:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Inicia la pila de Thread, espera unos segundos y verifica que el dispositivo se haya conectado correctamente:

> ifconfig up
Done
> thread start
Done
> state
child

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

Configuramos correctamente la red Thread con 3 dispositivos Thread: OTBR y dos placas nRF52840 DK.

5. Configurar red Wi-Fi

Configura la red Wi-Fi en el OTBR y la laptop para que estén conectados al mismo PA de Wi-Fi.

Podemos usar raspi-config para configurar el SSID y la frase de contraseña de Wi-Fi en la OTBR Raspberry Pi.

A continuación, se muestra la topología de red final:

5d0f36fd69ebcc9a.png

6. Suscribirse a la dirección de multidifusión IPv6

Suscríbete a ff05::abcd en nRF52840 End Device 1:

> ipmaddr add ff05::abcd
Done

Verifica que ff05::abcd se haya suscrito correctamente:

> 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íbete a ff05::abcd en la laptop:

Necesitamos una secuencia de comandos Python subscribe6.py para suscribirte a una dirección de multidifusión en la laptop.

Copia el siguiente código y guárdalo 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.')

Ejecuta subscribe6.py para suscribir 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.

A continuación, se muestra la topología de red final con suscripciones a multidifusión:

b118448c98b2d583.png

Ahora que suscribimos la dirección de multidifusión IPv6 en el dispositivo final 1 nRF52840 en la red Thread y en la laptop en la red Wi-Fi, verificaremos la accesibilidad de la multidifusión IPv6 bidireccional en las siguientes secciones.

7. Verifica la multidifusión IPv6 entrante

Ahora, deberíamos poder comunicarnos con el dispositivo final 1 nRF52840 en la red Thread y con la laptop usando la dirección de multidifusión IPv6 ff05::abcd de la red Wi-Fi.

Haz ping a 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!)

# If using MacOS, use this command. The interface is typically not "wlan0" for Mac.
$ ping6 -h 5 -I wlan0 ff05::abcd

Observamos que OTBR puede recibir dos respuestas de ping tanto desde el dispositivo final 1 nRF52840 como desde la laptop porque ambos se suscribieron a ff05::abcd. Esto muestra que el OTBR puede reenviar los paquetes de multidifusión de solicitudes de ping IPv6 de la red Wi-Fi a la red Thread.

8. Verifica la multidifusión IPv6 saliente

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 2 nRF52840 puede recibir respuestas de ping tanto del dispositivo final 1 de nRF52840 como de la laptop. Esto muestra que el OTBR puede reenviar los paquetes de multidifusión IPv6 Ping Reply de la red Thread a la red Wi-Fi.

9. Felicitaciones

¡Felicitaciones! Configuraste correctamente un router de borde de Thread y verificaste la multidifusión bidireccional IPv6.

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

Documentos de referencia: