Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Router de borde de Thread - Thread 1.2 Multicast

1. Introducción

608c4c35050eb280.png

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

5d0f36fd69ebcc9a.png

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:

b118448c98b2d583.png

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: