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. 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:
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:
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: