Router de borde Thread: multidifusión IPv6

Acerca de este codelab
schedule17 minutos
subjectÚltima actualización: 5 de mayo de 2025
account_circleEscrito por Simon Lin, Jonathan Hui

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 y la nube. Las redes Thread 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 OpenThread (OTBR) que lanzó Google es una implementación de código abierto del router de borde Thread.

Multicast IPv6

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

Un router de borde de Thread registra su conjunto de datos de router de backbone (BBR) y el servicio de BBR seleccionado es el router de backbone principal (PBBR), que es responsable del reenvío de multicast entrante o saliente.

Un dispositivo Thread envía un mensaje CoAP para registrar la dirección de multidifusión en el PBBR (registro de objetos de escucha de multidifusión, MLR, en resumen) si la dirección es más grande que el reino local. PBBR usa MLDv2 en su interfaz externa para comunicarse con la LAN/WAN IPv6 más amplia sobre los grupos multicast IPv6 que debe escuchar en nombre de su red Thread local. Además, el PBBR solo reenvía el tráfico multicast a la red Thread si al menos un dispositivo Thread se suscribe al destino.

En el caso de los dispositivos finales mínimos de Thread, es posible que dependan de su elemento superior para agregar la dirección multicast y realizar la MLR en su nombre, o bien registrarse ellos mismos si su elemento superior es Thread 1.1.

Para obtener más información, consulta la especificación de Thread.

Qué compilarás

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

Qué aprenderá

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

Requisitos

  • Una estación de trabajo de Linux para compilar y escribir en la memoria flash un RCP de Thread, la CLI de OpenThread y probar la multidifusión IPv6
  • Una Raspberry Pi para el router de borde Thread
  • 2 llaves USB nRF52840 de Nordic Semiconductor (una para el RCP y dos para los dispositivos finales de Thread)

2. Cómo configurar OTBR

La forma más rápida de configurar un OTBR es siguiendo la Guía de configuración de OTBR.

Una vez que se complete la configuración del OTBR, usa ot-ctl para validar que el OTBR se haya convertido en el router de red principal en cuestión de segundos.

> bbr state
Primary
Done
> bbr
BBR Primary:
server16: 0xF800
seqno:    21
delay:    5 secs
timeout:  3600 secs
Done

3. Cómo compilar y escribir en la memoria flash dispositivos Thread

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

Cómo compilar el firmware del DK nRF52840

Sigue las instrucciones para clonar el proyecto y compilar el firmware nRF52840.

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_MLR=ON

Continúa con el codelab Cómo compilar una red Thread con placas nRF52840 y OpenThread como está escrito. Después de que se actualice el dispositivo final con la imagen de CLI, sigue las instrucciones de Cómo unir el segundo nodo a la red Thread para agregar el dispositivo Thread a la red Thread. Repite el proceso para el segundo dispositivo final de Thread.

4. Suscríbete a la dirección de multidifusión IPv6

Suscripción a ff05::abcd en el dispositivo final nRF52840 1:

> ipmaddr add ff05::abcd
Done

Verifica que ff05::abcd se haya suscrito correctamente:

> ipmaddr
ff05:0:0:0:0:0:0:abcd            <--- ff05::abcd subscribed
ff33:40:fdde:ad00:beef:0:0:1
ff32:40:fdde:ad00:beef:0:0:1
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

Suscripción a ff05::abcd en la laptop:

Necesitamos una secuencia de comandos de Python subscribe6.py para suscribirnos 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 (p.ej., 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 multicast:

b118448c98b2d583.png

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

5. Verifica la multidifusión IPv6 entrante

Ahora, deberíamos poder acceder al dispositivo final nRF52840 1 en la red Thread y a la laptop con la dirección multicast 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

Podemos ver que OTBR puede recibir dos respuestas de ping del dispositivo final nRF52840 1 y de la laptop porque ambos se suscribieron a ff05::abcd. Esto demuestra que el OTBR puede reenviar los paquetes de multidifusión de la solicitud de ping IPv6 de la red Wi-Fi a la red Thread.

6. Verifica la multidifusión IPv6 saliente

Ping ff05::abcd en el dispositivo 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

El dispositivo final nRF52840 2 puede recibir respuestas de ping del dispositivo final nRF52840 1 y de la laptop. Esto demuestra que el OTBR puede reenviar los paquetes de multidifusión de respuesta de ping IPv6 de la red Thread a la red Wi-Fi.

7. Felicitaciones

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

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

Documentos de referencia: