1. Introducción
¿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:
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: