1. Introducción
¿Qué es Thread?
Thread es un protocolo de red en malla inalámbrica de baja potencia 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 OpenThread Border Router (OTBR) que lanzó Google es una implementación de código abierto del Thread Border Router.
Multicast de IPv6
Thread define una serie de funciones para admitir la transmisión 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 local del dominio.
Un router de borde de Thread registra su conjunto de datos del router de red troncal (BBR), y el servicio de BBR seleccionado es el router de red troncal principal (PBBR), que es responsable del reenvío entrante y saliente de multidifusión.
Un dispositivo Thread 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 más grande que la local del dominio. El PBBR usa MLDv2 en su interfaz externa para comunicarse con la LAN/WAN IPv6 más amplia sobre los grupos de multidifusión IPv6 a los que debe escuchar, en nombre de su red de Thread local. Además, el PBBR solo reenvía el tráfico de multidifusión a la red de Thread si al menos un dispositivo Thread se suscribió al destino.
En el caso de los dispositivos finales mínimos de Thread, es posible que dependan de su dispositivo principal para agregar la dirección de multidifusión y realizar MLR en su nombre, o bien registrarse por sí mismos si su dispositivo principal es de Thread 1.1.
Para obtener más detalles, consulta la Especificación de subprocesos.
Qué compilarás
En este codelab, configurarás un router de borde Thread y dos dispositivos Thread, y, luego, habilitarás y verificarás las funciones de multidifusión en dispositivos Thread y Wi-Fi.
Qué aprenderás
- Cómo compilar el firmware nRF52840 con compatibilidad para la 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 Nordic Semiconductor nRF52840 (una para el RCP y dos para los dispositivos finales de Thread)
2. Cómo configurar el OTBR
La forma más rápida de configurar un OTBR es seguir 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 principal de la red troncal 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 de dispositivos Thread
Compila la aplicación de la CLI de Thread con transmisión multidifusión y graba las dos placas nRF52840 DK.
Cómo compilar el firmware de la placa de desarrollo nRF52840
Sigue las instrucciones para clonar el proyecto y compilar el firmware del 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 de Thread con placas nRF52840 y OpenThread tal como se escribió. Después de que el dispositivo final se haya programado con la imagen de la CLI, sigue los pasos que se indican en 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 Thread.
4. Suscríbete a la dirección de multidifusión IPv6
Suscríbete a ff05::abcd en el dispositivo final 1 de nRF52840:
> 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
Suscríbete 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 de multidifusión:
Ahora que suscribimos la dirección de multidifusión IPv6 en el dispositivo final nRF52840 1 en la red de Thread y en la laptop en la red Wi-Fi, verificaremos la accesibilidad de multidifusión IPv6 bidireccional en las siguientes secciones.
5. Verifica la multidifusión IPv6 entrante
Ahora, deberíamos poder acceder al dispositivo final 1 nRF52840 en la red de Thread y a la laptop con la dirección de multidifusión IPv6 ff05::abcd
desde la red Wi-Fi.
Haz ping a ff05::abcd en el OTBR a través de la interfaz de 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 el OTBR puede recibir dos respuestas de ping del dispositivo final 1 nRF52840 y de la laptop, ya que ambos se suscribieron a ff05::abcd
. Esto demuestra que el OTBR puede reenviar los paquetes de multidifusión de 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 2 de nRF52840:
> 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 del dispositivo final 1 nRF52840 y de la laptop. Esto demuestra que el OTBR puede reenviar los paquetes de multidifusión de respuesta a Ping de IPv6 desde la red de 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: