1. Introducción
¿Qué es Thread?
Thread es un protocolo de red en malla inalámbrico de bajo consumo basado en IP que permite establecer comunicaciones seguras de un dispositivo a otro y de un dispositivo a la nube. Las redes de subprocesos pueden adaptarse a los cambios de topología para evitar fallas en un solo punto.
¿Qué es OpenThread?
OpenThread publicado por Google es una implementación de código abierto de Thread®.
¿Qué es un router de borde de OpenThread?
El router de bordes de Thread (OTBR) que lanzó Google es una implementación de código abierto del router de borde de Thread.
Thread 1.2 Multicast
El subproceso 1.2 define una serie de funciones para admitir la multidifusión en una red heterogénea (segmentos Wi-Fi y Ethernet) para direcciones multidifusión con un alcance mayor que el local.
Un router de borde Thread 1.2 registra el conjunto de datos del router de red troncal (BBR), y el servicio de BBR seleccionado es el principal, el responsable de la transmisión entrante o saliente de salida.
Un dispositivo Thread 1.2 envía un mensaje de CoAP para registrar la dirección de multidifusión en el PBBR (registro de escucha de multidifusión, MLR) si la dirección es más grande que el dominio local. PBBR usa MLDv2 en su interfaz externa para comunicarse con la LAN/WAN de IPv6 más amplia sobre grupos de multidifusión de IPv6 que necesita detectar, en nombre de su red Thread local. Además, PBBR solo reenvía el tráfico de multidifusión a la red de Thread si el destino está suscrito por al menos un dispositivo de Thread.
En el caso de los dispositivos finales mínimos de Thread 1.2, es posible que necesiten que sus superiores agreguen la dirección multidifusión y realicen la MLR en su nombre, o se registren si son superiores.
Para obtener más información, consulta la sección 5.24 del reenvío de multidifusión de subprocesos 1.2 para obtener un alcance más grande que el real local.
Qué compilarás
En este codelab, configurarás un router de borde de Thread y dos dispositivos de Thread, y luego habilitarás y verificarás las funciones de multidifusión en dispositivos Thread y Wi-Fi.
Qué aprenderá
- Cómo compilar el firmware nRF52840 con las funciones de multidifusión de Thread 1.2
- Cómo suscribirte a direcciones IPv6 de multidifusión en dispositivos Thread.
Qué necesitará
- Un dispositivo Raspberry Pi 3/4 y una tarjeta SD con al menos 8 GB de capacidad
- 3 placas nórdicas semiconductoras nRF52840 DK.
- Un PA de Wi-Fi sin la protección de publicidad del router IPv6 habilitada 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 Raspberry Pi.
Cuando se complete, Raspberry Pi debería crear una red Thread que funcione y conectarse a una Wi-Fi.
OTBR debería convertirse en el router troncal principal en 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 e Flash
Compila la aplicación de la CLI de Thread 1.2 con multidifusión y instala las dos placas DK nRF52840.
Compilación de 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
Encontraremos el firmware hexadecimal compilado correctamente en ot-cli-ftd.hex
.
firmware nRF52840 DK de Flash
Instala el firmware en nRF52840 DK mediante nrfjprog
, que forma parte de las nRF Command Line Tools.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. Cómo conectar dispositivos Thread a la red Thread
OTBR creó una red Thread en pasos anteriores. Ahora podemos agregar los DK nRF52840 a la red Thread:
Obtener conjuntos de datos activos de OTBR sin procesar:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Se conecta a una placa DK nRF52840:
$ screen /dev/ttyACM0 115200
Configure el conjunto de datos activos 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 de Thread.
Configuramos correctamente la red Thread con 3 dispositivos ThreadBR: OTBR y dos placas DK nRF52840.
5. Configurar red Wi-Fi
Configura la red Wi-Fi en OTBR y en la laptop para que estén conectadas a la misma red Wi-Fi PA.
Podemos usar raspi-config para configurar el SSID de Wi-Fi y la frase de contraseña en el OTBR de Raspberry Pi.
A continuación, se muestra la topología de red final:
6. Suscribirse a la dirección multidifusión IPv6
Suscribirse a ff05::abcd en nRF52840 Dispositivo final 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 de Python subscribe6.py
para suscribirte a una dirección 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 suscribirte a 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 hemos suscrito la dirección multidifusión IPv6 en el dispositivo final nRF52840 de la red Thread y la laptop en la red Wi-Fi, verificaremos la accesibilidad multidifusión bidireccional de IPv6 en las siguientes secciones.
7. Verifica la multidifusión de IPv6 entrante
Ahora deberíamos poder llegar al dispositivo final nRF52840 en la red de Thread y a la laptop usando la dirección multidifusión IPv6 ff05::abcd
de la red Wi-Fi.
Ping ff05::abcd en OTBR mediante 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!)
Podemos ver que OTBR puede recibir dos respuestas de ping de la laptop nRF52840 y del laptop porque ambas están suscritas a ff05::abcd
. Esto muestra que 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 de IPv6 saliente
Ping ff05::abcd en nRF52840 End Device 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 puede recibir respuestas de ping del dispositivo final nRF52840 y de la laptop. Esto muestra que OTBR puede reenviar los paquetes de multidifusión de IPv6 P6 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 de las IPv6.
Para obtener más información sobre OpenThread, visita openthread.io.
Documentos de referencia: