Router de borde Thread - Thread 1.2 multidifusión

1. Introducción

608c4c35050eb280.png

¿Qué es Thread?

Thread es un protocolo de red en malla inalámbrica de bajo consumo basado en IP que permite comunicaciones seguras de dispositivo a dispositivo y de dispositivo a nube. Las redes de 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 de OpenThread?

El router de borde de Thread (OTBR) lanzado por 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 compatibles con la multidifusión en una red heterogénea (segmentos de Thread y redes Wi-Fi/Ethernet) para direcciones multidifusión con un alcance mayor que el realm local.

Un router de borde Thread 1.2 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 de la operación entrante/saliente de multidifusión.

Un dispositivo Thread 1.2 envía un mensaje de CoAP para registrar la dirección de multidifusión en PBBR (Multicast Listener Registration, MLR para abreviar) si la dirección es más grande que el dominio. PBBR utiliza MLDv2 en su interfaz externa para comunicarse con la LAN/WAN IPv6 más amplia sobre grupos multidifusión IPv6 que debe escuchar, en nombre de su red Thread local. Además, el PBBR reenvía el tráfico multidifusión a la red Thread si al menos un dispositivo Thread está suscrito al destino.

En el caso de los dispositivos finales mínimos de Thread 1.2, es posible que dependan de su elemento superior para agregar la dirección de multidifusión y realizar el AAR en su nombre, o registrarse a sí mismos si son superiores de Thread 1.1.

Para obtener más información, consulta la Sección 5.24 Reenvío de multidifusión de Thread 1.2 para permisos de alcance local más grande.

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 de Thread y dispositivos 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

Requisitos

  • Un dispositivo Raspberry Pi de 3/4 y una tarjeta SD con capacidad de 8 GB como mínimo.
  • 3 placas nRF52840 DK de semiconductores nórdicos.
  • Un PA de Wi-Fi sin Guarding de publicidad de router IPv6 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 basados en DNS para configurar un router de borde de Thread en Raspberry Pi.

Cuando se complete, la Raspberry Pi debería haber creado una red Thread en funcionamiento y estar conectada a una red Wi-Fi.

OTBR debería convertirse en el router de red 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 y de Flash Flash

Compila la aplicación de la CLI Thread 1.2 con Multicast e instala las dos placas DK nRF52840.

Cómo compilar el 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 hexadecimal de compilación exitoso en ot-cli-ftd.hex.

Firmware nRF52840 de Flash

Instala el firmware en nRF52840 DK mediante nrfjprog, que forma parte de las herramientas de línea de comandos nRF.

$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset

4. Cómo conectar dispositivos de Thread a la red de Thread

OTBR creó una red de Thread en pasos anteriores. Ahora podemos agregar los DK nRF52840 a la red Thread:

Obtener conjuntos de datos activos sin procesar de OTBR:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Conéctalo a una placa DK nRF52840:

$ screen /dev/ttyACM0 115200

Configure el conjunto de datos activo para el DK nRF52840:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Inicia la pila 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 DK nRF52840 a la red Thread.

Configuramos correctamente la red Thread con 3 dispositivos Thread: 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 al mismo PA de Wi-Fi.

Podemos usar raspi-config para configurar el SSID y la frase de contraseña de Wi-Fi en el OTBR de Raspberry Pi.

A continuación, se muestra la topología de red final:

5d0f36fd69ebcc9a.png.

6. Suscríbete a la dirección multidifusión IPv6

Suscribirse a ff05::abcd en nRF52840 End Device 1:

> ipmaddr add ff05::abcd
Done

Verifica si ff05::abcd se suscribió 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 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:

b118448c98b2d583.png

Ahora que hemos suscrito la dirección IPv6 de multidifusión en el dispositivo final nRF52840 de la red Thread y la laptop en la red Wi-Fi, verificaremos la accesibilidad bidireccional de la multidifusión IPv6 en las siguientes secciones.

7. Verifica la multidifusión IPv6 entrante

Ahora deberíamos poder llegar al dispositivo final nRF52840 en la red Thread y a la laptop mediante la dirección IPv6 de multidifusión ff05::abcd de la red Wi-Fi.

Ping 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

Vemos que OTBR puede recibir dos respuestas de ping del nRF52840 End Device 1 y del Laptop porque ambos se suscribieron a ff05::abcd. Esto muestra que el OTBR puede reenviar los paquetes de multidifusión de la solicitud de ping IPv6 de la red Wi-Fi a la red de Thread.

8. Verifica la multidifusión 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 el OTBR puede reenviar los paquetes de multidifusión IPv6 Ping Reply de la red de Thread a la red Wi-Fi.

9. Felicitaciones

¡Felicitaciones! Configuraste correctamente un router de borde de Thread y verificaste la multidifusión IPv6 bidireccional.

Para obtener más información sobre OpenThread, visita openthread.io.

Documentos de referencia: