Compila una red Thread con la placa de router de borde de Thread ESP32H2 y ESP

1. Introducción

26b7f4f6b3ea0700.png

OpenThread, lanzado por el equipo de Google Nest, es una implementación de código abierto del protocolo de red Thread® diseñada para acelerar el desarrollo de productos para el hogar conectado. La especificación de Thread define un protocolo de comunicación de dispositivo a dispositivo inalámbrico, seguro y de bajo consumo basado en IPv6 para aplicaciones de edificios comerciales y del hogar.

Espressif transfirió la pila de OpenThread basada en FreeRTOS y LwIP, lo que permite a los desarrolladores compilar redes Thread con rapidez. El código fuente relacionado se puede obtener en GitHub. Al mismo tiempo, Espressif también implementó un router de borde de Thread basado en RTOS.

En este codelab, programarás OpenThread en hardware real, crearás y administrarás una red de Thread, y pasarás mensajes entre nodos.

Espressif_hardware_setup.jpg

Qué aprenderás

  • Compilación e escritura en la memoria flash de objetos binarios de la CLI de OpenThread en las placas ESP.
  • Compilación e instalación del router de borde en la placa del router de borde Thread ESP
  • Administración manual de nodos de subprocesos con ESP Monitor y la CLI de OpenThread
  • Formación de una red Thread en el router de borde de Thread.
  • Asegura la puesta en marcha de dispositivos en una red Thread.
  • Haz ping a la dirección IPv6 entre nodos de Thread.
  • Pasar mensajes entre nodos de subprocesos con UDP

Requisitos

Hardware:

  • 2 placas ESP con módulos IEEE 802.15.4
  • 1 Placa de router de borde de rosca ESP.

Software:

2. Cómo comenzar

  1. Instalación de ESP-IDF.

Sigue la guía de programación ESP-IDF para instalar el entorno de desarrollo de software.

  1. Clona el SDK del router de borde de subprocesos del ESP.

ESP-THREAD-BR es el SDK oficial del ESP del router de borde de subprocesos. Es compatible con todas las funciones de red fundamentales para crear un router de borde de Thread y, además, integra funciones avanzadas a nivel del producto para una productización rápida.

$ cd <your-local-workspace>
$ git clone --recursive https://github.com/espressif/esp-thread-br.git

3. Compila y escribe en la memoria flash

Para compilar y escribir en la memoria flash el archivo binario ot-cli-ftd en placas ESP con módulos IEEE 802.15.4, puedes consultar el ejemplo de ESP-IDF ot_cli para obtener más detalles:

$ cd <your-idf-path>/examples/openthread/ot_cli
$ idf.py set-target <your-board-type>

Habilita la función de unión a través de menuconfig:

$ idf.py menuconfig

Configuración del componente > OpenThread > Habilita Joiner y, luego, compila y escribe en la memoria flash.

$ idf.py -p <your-local-port> build flash monitor

Para compilar e instalar el archivo binario ot-br en la placa de router de borde de Thread Thread, primero debes compilar el archivo binario RCP. No es necesario escribir en la memoria flash de este archivo binario RCP de forma explícita en el dispositivo de la placa de router de borde de Thread del ESP. Se incluirá en el archivo binario del router de borde y se escribirá en la memoria flash del chip ESP32-H2 en el primer inicio (o se cambiará el firmware RCP). Puedes consultar la documentación de ESP Thread BR para obtener más detalles:

$ cd <your-idf-path>/examples/openthread/ot_rcp
$ idf.py set-target esp32h2
$ idf.py build
$ cd <your-esp-thread-br-path>/examples/basic_thread_border_router
$ idf.py set-target esp32s3

Habilita la función de comisión a través de menuconfig:

$ idf.py menuconfig

Configuración del componente > OpenThread > Habilita Commissioner y, luego, compila y escribe en la memoria flash.

$ idf.py -p <your-local-port> build flash monitor

4. Cómo formar una red Thread en el router de borde de Thread

Ahora puedes formar una red Thread con la línea de comandos de OpenThread en la placa del router de borde de Thread Thread (Comisionado de BR):

## BR Commissioner ##
----------------------
> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 21
Channel Mask: 0x07fff800
Ext PAN ID: 151975d11bea97b5
Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64
Network Key: 731ab6a60a64a0a0b14b259b86b2be01
Network Name: OpenThread-1444
PAN ID: 0x1444
PSKc: 54e7f18d2575014da94db09df29c5df0
Security Policy: 672 onrc 0
Done

Confirmar este conjunto de datos como el activo:

> dataset commit active
Done

Abre la interfaz IPv6:

> ifconfig up
I (59329) OPENTHREAD: Platform UDP bound to port 49153
Done
I (59329) OT_STATE: netif up

Inicia la operación del protocolo Thread:

> thread start
I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached
Done
> I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset
I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11
I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00
I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader
I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6
I (69099) OPENTHREAD: Platform UDP bound to port 49154

Después de un momento, revisa el estado del dispositivo. Debe ser el líder.

> state
leader
Done
> 

5. Únete a la red de Thread con una clave de red

En este codelab, se preparan dos placas ESP con módulos IEEE 802.15.4 para unirse a la red formada en BR. En esta sesión, agregaremos Board1 a la red.

Obtén la clave de red de BR:

## BR Commissioner ##
----------------------
> networkkey
731ab6a60a64a0a0b14b259b86b2be01
Done
> 

Configura esta clave de red en una placa ESP (Board1 Joiner) con módulos de IEEE 802.15.4:

## Board1 Joiner ##
----------------------
> dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01
Done

Confirmar este conjunto de datos como el activo:

> dataset commit active
Done

Abre la interfaz IPv6:

> ifconfig up
Done
I (20308) OT_STATE: netif up

Inicia la operación del protocolo Thread:

> thread start
I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached
Done
> I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset
I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds
I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition 
I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444
I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444
I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled
I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached
I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition 
I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01
I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child

Después de un momento, revisa el estado del dispositivo. Debería ser el elemento secundario.

> state
child
Done

Establece el rol en Router.

> state router
Done
I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800
I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router
I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6
> 

esp_ot_tp_LR.jpg

6. Únete a la red de Thread con una puesta en servicio segura

En esta sesión, agregaremos Board2 a la red a través de la puesta en servicio de seguridad:

Obtén la PSKc y el problema del comisionado de Brasil:

## BR Commissioner ##
----------------------
> pskc
54e7f18d2575014da94db09df29c5df0
Done
> panid
0x1444
Done

Configura la información de la red en Board2:

## Board2 Joiner ##
----------------------
> dataset pskc 54e7f18d2575014da94db09df29c5df0
Done
> dataset panid 0x1444
Done

Confirmar este conjunto de datos como el activo:

## Board2 Joiner ##
----------------------
> dataset commit active 
Done

Abre la interfaz IPv6:

## Board2 Joiner ##
----------------------
> ifconfig up
Done
I (29146) OT_STATE: netif up

Obtén el eui64 de Board2:

## Board2 Joiner ##
----------------------
> eui64
4831b7fffec02be1
Done

En el Comisionado de BR, inicia el comisionado y especifica el eui64 del dispositivo que puede unirse, junto con la credencial de Unión, por ejemplo, J01NME. La credencial de unión es una cadena específica del dispositivo de todos los caracteres alfanuméricos en mayúsculas (0-9 y A-Y, sin incluir I, O, Q y Z para facilitar la lectura), con una longitud de entre 6 y 32 caracteres.

## BR Commissioner ##
----------------------
> commissioner start
Commissioner: petitioning
Done
Commissioner: active
> commissioner joiner add 4831b7fffec02be1 J01NME
Done

Cambia a Board2 Joiner. Comienza la función de Unión con la Credencial de Unión que acabas de configurar en el Comisionado de Brasil:

## Board2 Joiner ##
----------------------
> ifconfig up
Done
> joiner start J01NME
Done

En un plazo aproximado de un minuto, recibirás la confirmación de que la autenticación se realizó correctamente:

## Board2 Joiner ##
----------------------
>
Join success

Luego, podrás iniciar y unirte a la red Thread que creó el Comisionado de Brasil.

Inicia la operación del protocolo Thread:

> thread start
I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached
Done
> I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset
I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801
I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child

Establece el rol en Router.

> state router
Done
I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400
I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router
I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6
> 

Ahora, obtendrás una red Thread con la topología que se muestra a continuación:

esp_ot_tp_LRR.jpg

7. Haz ping a la dirección IPv6 entre nodos de Thread

Puedes usar el comando ping para comunicarte entre dos placas cualesquiera. Usa el comando ipaddr para imprimir la dirección IPv6 de cada placa:

## BR Commissioner ##
----------------------
> ipaddr
fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00          # Leader Anycast Locator (ALOC)
fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00          # Routing Locator (RLOC)
fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0     # Mesh-Local EID (ML-EID) 
fe80:0:0:0:687c:7248:cc14:9c4d              # Link-Local Address (LLA)
Done
> 
## Board1 Joiner ##
----------------------
> ipaddr
fd6a:b54b:d6a3:b05a:0:ff:fe00:2800          # Routing Locator (RLOC)
fd6a:b54b:d6a3:b05a:e461:db08:c833:1248     # Mesh-Local EID (ML-EID)
fe80:0:0:0:18ac:df04:4671:6a45              # Link-Local Address (LLA)
Done
## Board2 Joiner ##
----------------------
> ipaddr
fd6a:b54b:d6a3:b05a:0:ff:fe00:4400          # Routing Locator (RLOC)
fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc     # Mesh-Local EID (ML-EID)
fe80:0:0:0:a8cc:1483:f696:91a2              # Link-Local Address (LLA)
Done

Por ejemplo, para hacer ping de MLE-ID de Board2 desde el Comisionado de Brasil, puedes ejecutar este comando en el Comisionado de Brasil:

## BR Commissioner ##
----------------------
> ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc
16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms.
Done

8. Pasa mensajes entre nodos de subprocesos con UDP

En esta sesión, aprenderás a enviar un mensaje entre dos dispositivos Thread. Por ejemplo, abre udp, vincúlalo en el puerto 20617 y busca todas las direcciones en BR:

## BR Commissioner ##
----------------------
> udp open
Done
> udp bind :: 20617
I (1298739) OPENTHREAD: Platform UDP bound to port 20617
Done

Luego, envía un mensaje desde la Board1 a la dirección y el puerto 20617 de MLE-ID de BR:

## Board1 Joiner ##
----------------------
> udp open
Done
> udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP

Puedes ver el mensaje que recibiste en BR:

## BR Commissioner ##
----------------------
3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP

9. ¡Felicitaciones!

Creaste una red Thread física con placas ESP.

esp_ot_final_topology.jpg

Ahora sabes lo siguiente:

  • Compilación e escritura en la memoria flash de objetos binarios de la CLI de OpenThread en las placas ESP.
  • Cómo compilar un router de borde flash en la placa del router de borde Thread ESP
  • Administración manual de nodos de subprocesos con ESP Monitor y la CLI de OpenThread
  • Formación de una red Thread en el router de borde de Thread.
  • Asegura la puesta en marcha de dispositivos en una red Thread.
  • Haz ping a la dirección IPv6 entre nodos de Thread.
  • Pasar mensajes entre nodos de subprocesos con UDP

Lecturas adicionales

Consulta openthread.io y GitHub para ver una variedad de recursos de OpenThread, incluidos los siguientes:

Referencia: