Router de borde de Thread: conectividad IPv6 bidireccional y descubrimiento de servicios basado en DNS

Acerca de este codelab
schedule22 minutos
subjectÚltima actualización: 25 de julio de 2025
account_circleEscrito por Kangping Dong, Jonathan Hui

1. Introducción

699d673d05a55535.png

¿Qué es Thread?

Thread es un protocolo de red en malla inalámbrica de baja potencia 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 Thread?

Un router de borde Thread conecta una red Thread a otras redes basadas en IP, como Wi-Fi o Ethernet. Una red de Thread requiere un router de borde para conectarse a otras redes. Un router de borde de Thread admite, como mínimo, las siguientes funciones:

  • Conectividad IP bidireccional entre las redes de Thread y Wi-Fi o Ethernet
  • Descubrimiento de servicios bidireccional a través de mDNS (en la conexión Wi-Fi o Ethernet) y SRP (en la red Thread).
  • Es una infraestructura de subprocesos que combina particiones de subprocesos a través de vínculos basados en IP.
  • Comisionamiento externo de Thread (por ejemplo, un teléfono celular) para autenticar y unir un dispositivo Thread a una red Thread

El OpenThread Border Router (OTBR) que lanzó Google es una implementación de código abierto del Thread Border Router.

Qué compilarás

En este codelab, configurarás un router de borde Thread y conectarás tu teléfono celular a un dispositivo final Thread a través del router de borde.

Qué aprenderás

  • Cómo configurar un OTBR
  • Cómo formar una red de Thread con un OTBR
  • Cómo compilar un dispositivo de la CLI de OpenThread con la función de SRP
  • Cómo registrar un servicio en el SRP
  • Cómo descubrir y acceder a un dispositivo final de 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 Nordic Semiconductor nRF52840 (una para el RCP y otra para el dispositivo final Thread)
  • Un teléfono iOS con al menos iOS 14 o un teléfono Android con al menos Android 8.1

2. Configura el OTBR

La forma más rápida de configurar un OTBR es seguir 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 actúe como un leader de Thread.

$ sudo ot-ctl state
leader
Done

También valida que el OTBR haya configurado automáticamente un prefijo off-mesh-routable (OMR) en los datos de la red de Thread.

$ sudo ot-ctl netdata show
Prefixes:
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
$ sudo ot-ctl ipaddr      
fda8:5ce9:df1e:6620:0:ff:fe00:fc11
fda8:5ce9:df1e:6620:0:0:0:fc38
fda8:5ce9:df1e:6620:0:ff:fe00:fc10
fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
fda8:5ce9:df1e:6620:0:ff:fe00:fc00
fda8:5ce9:df1e:6620:0:ff:fe00:4000
fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d
fe80:0:0:0:a6:301c:3e9f:2f5b
Done

3. Configura el dispositivo final del cliente de SRP

Compila y escribe la CLI de OT en la memoria flash

Sigue el paso 5 del codelab Compila una red de Thread con placas nRF52840 y OpenThread para compilar y grabar un dispositivo final de la CLI de nRF52840.

Sin embargo, en lugar de tener habilitados OT_COMMISSIONER y OT_JOINER, el nodo de la CLI requiere las funciones OT_SRP_CLIENT y OT_ECDSA.

Por lo tanto, la invocación de compilación completa debería verse de la siguiente manera:

$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Cómo unirse a la red de Thread

Para unirse a la red de Thread, debemos obtener el conjunto de datos operativos activos del dispositivo OTBR. Volvamos a ot-ctl y obtengamos el conjunto de datos activo:

$ sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Regresa a la sesión de pantalla del nodo cliente de SRP y establece el conjunto de datos activo:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Luego, inicia la interfaz de Thread:

> ifconfig up
Done
> thread start
Done

Espera unos segundos y verifica si se unió correctamente a la red Thread:

> state
child
Done
> netdata show
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
> ipaddr
fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
fda8:5ce9:df1e:6620:0:ff:fe00:4001
fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba
fe80:0:0:0:d4a9:39a0:abce:b02e
Done

Asegúrate de que los datos de la red coincidan con los que se imprimieron en el OTBR. Ahora podemos hacer ping a la dirección OMR del OTBR:

> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
Done
> 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms

4. Publica el servicio en el dispositivo final

mDNS se usó ampliamente para publicar el servicio DNS-SD en la vinculación local. Sin embargo, los mensajes de transmisión múltiple consumen demasiado ancho de banda y agotan rápidamente la batería de los dispositivos de bajo consumo. Thread usa el protocolo SRP de transmisión unidifusión para registrar sus servicios con el router de borde y depende de este para anunciar los servicios en la conexión Wi-Fi o Ethernet.

Podemos registrar un servicio con el comando srp client.

Ve a la sesión de pantalla del nodo cliente del SRP y, luego, inicia automáticamente el cliente del SRP:

> srp client autostart enable
Done

Establece el nombre de host que se anunciará en la conexión Wi-Fi o Ethernet:

> srp client host name ot-host
Done

Para que un dispositivo en la vinculación Wi-Fi o Ethernet llegue a un dispositivo final de Thread, se debe anunciar la dirección OMR del dispositivo final:

> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
Done

Al final, registra un servicio _ipps._tcp falso:

> srp client service add ot-service _ipps._tcp 12345
Done

Espera unos segundos y deberíamos poder ver el servicio registrado:

> srp client service
instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0
Done

Completamos todo el trabajo de configuración, y el servicio _ipps._tcp debería haberse anunciado en el vínculo de Wi-Fi o Ethernet. Ahora es el momento de descubrir el dispositivo final y llegar a él.

5. Descubre el servicio

Descubre el servicio con un teléfono celular

54a136a8940897cc.png

Usamos la app de Service Browser para descubrir servicios mDNS con el teléfono Android. También se puede encontrar una app equivalente para dispositivos móviles iOS. Abre la app y el servicio _ipps._tcp debería aparecer.

Descubre el servicio con un host de Linux

Si deseas descubrir el servicio desde otro host de Linux, puedes usar el comando avahi-browse.

Instala avahi-daemon y avahi-utils:

$ sudo apt-get install -y avahi-daemon avahi-utils

Resuelve el servicio:

$ sudo service avahi-daemon start # Ensure the avahi daemon is started.
$ avahi-browse -r _ipps._tcp
+ wlan0 IPv6 ot-service                                    Secure Internet Printer local
= wlan0 IPv6 ot-service                                    Secure Internet Printer local
   hostname = [ot-host.local]
   address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927]
   port = [12345]
   txt = []
...

Descubre el servicio con un host de macOS

Puedes usar dns-sd en macOS para resolver el servicio:

$ dns-sd -Z _ipps._tcp local.
Browsing for _ipps._tcp.local.
DATE: ---Sun 14 Mar 2021---
21:31:42.125  ...STARTING...

; To direct clients to browse a different domain, substitute that domain in place of '@'
lb._dns-sd._udp                                 PTR     @

; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names.
; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local
; names with the correct fully-qualified (unicast) domain name of the target host offering the service.

_ipps._tcp                                      PTR     ot-service._ipps._tcp
ot-service._ipps._tcp                           SRV     0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host
ot-service._ipps._tcp                           TXT     ""
...

6. Hacer ping al dispositivo final

Haz ping desde un teléfono celular

Tomemos como ejemplo el teléfono Pixel. Podemos encontrar la dirección OMR del servicio "ot-service" registrado anteriormente en la página de detalles de la instancia del servicio en la app de Service Browser.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Ahora podemos hacer ping a la dirección de OMR con otra app de Network Analyzer.

Lamentablemente, la versión para Android de la app de Network Analyzer no admite consultas de mDNS para la utilidad de ping, y no podemos hacer ping al nombre de host ot-host.local directamente (sí podemos hacerlo con la versión para iOS de la app).

Hacer ping desde un host Linux o macOS

El Border Router de Thread envía anuncios de router (RA) de ICMPv6 para anunciar prefijos (a través de la opción de información de prefijo) y rutas (a través de la opción de información de ruta) en la conexión Wi-Fi o Ethernet.

Prepara el host de Linux

Es importante asegurarse de que RA y RIO estén habilitados en tu host:

  1. net.ipv6.conf.wlan0.accept_ra debe ser al menos 1 si el reenvío de IP no está habilitado y 2 en caso contrario.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen no debe ser menor que 64.

accept_ra se establece de forma predeterminada en 1 para la mayoría de las distribuciones. Sin embargo, es posible que haya otros daemons de red que anulen esta opción (por ejemplo, dhcpcd en Raspberry Pi anulará accept_ra a 0). Puedes verificar el valor de accept_ra con el siguiente comando:

$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra
0

Establece el valor en 1 (o 2 en caso de que esté habilitado el reenvío de IP) con el siguiente comando:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1
Net.ipv6.conf.wlan0.accept_ra = 1

La opción accept_ra_rt_info_max_plen en la mayoría de las distribuciones de Linux está configurada de forma predeterminada en 0. Para establecerla en 64, usa el siguiente comando:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

El cambio se perderá después de reiniciar el host. Por ejemplo, agrega los siguientes comandos a /etc/sysctl.conf para habilitar RIO de forma permanente:

$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

Es posible que sea demasiado tarde para cambiar esos parámetros de configuración, ya que el OTBR ya envió mensajes RA y el intervalo entre dos mensajes RA no solicitados podría ser de varios cientos de segundos. Una forma es desconectarse y volver a conectarse al AP de Wi-Fi para enviar mensajes de Router Solicitation, de modo que el OTBR responda con RA solicitados. Otra opción es reiniciar la función de Border Routing en el Border Router:

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

Si intentas volver a conectar la red Wi-Fi o reiniciar la interfaz Ethernet, asegúrate de que dhcpcd no se use para administrar tu red IPv6 de Wi-Fi o Ethernet. Esto se debe a que dhcpcd siempre anula la opción accept_ra cada vez que se reinicia la interfaz, y se perderá tu configuración de accept_ra. Agrega las siguientes líneas al archivo de configuración de dhcpcd (p.ej., /etc/dhcpcd.conf) para inhabilitar explícitamente IPv6 en dhcpcd:

noipv6
noipv6rs

Debes reiniciar el dispositivo para que se aplique el cambio.

Prepara el host de macOS

Ambas opciones de accept_ra* están habilitadas de forma predeterminada, pero debes actualizar tu sistema a macOS Big Sur como mínimo.

Hacer ping al nombre de host o a la dirección IPv6

Ahora podemos hacer ping al nombre de host ot-host.local con el comando ping -6 (ping6 para macOS):

$ ping -6 ot-host.local.
PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms
...

Es posible que este comando falle en hosts de Linux con el error "Name or service not known". Esto se debe a que el comando ping no resuelve el nombre ot-host.local. con consultas de mDNS. Abre /etc/nsswitch.conf y agrega mdns6_minimal a la línea que comienza con hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

Por supuesto, siempre puedes hacer ping a la dirección IPv6 directamente:

$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms
...

7. Anula la publicación del servicio en el dispositivo final

Para quitar la dirección y el servicio registrados del nodo cliente del SRP, haz lo siguiente:

> srp client host remove
Done

Ahora no deberías poder descubrir el servicio _ipps._tcp.

8. Felicitaciones

Felicitaciones. Configuraste correctamente el OTBR como router de borde de Thread para proporcionar conectividad IP bidireccional y detección de servicios para los dispositivos finales de Thread.

Próximos pasos

Consulta algunos codelabs sobre los siguientes temas:

Documentos de referencia