1. Introducción
OpenThread, lanzada 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 baja potencia basado en IPv6 para aplicaciones de edificios comerciales y domésticos.
Espressif trasladó la pila de OpenThread basada en FreeRTOS y LwIP, lo que les permite a los desarrolladores compilar redes Thread rápidamente. El código fuente relacionado se puede obtener en GitHub. Al mismo tiempo, Espressif 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 Thread y pasarás mensajes entre nodos.
Qué aprenderás
- Compilar y escribir en la memoria flash de objetos binarios de la CLI de OpenThread en las placas del ESP
- Cómo compilar y escribir en la memoria flash del router de borde a la placa del router de borde Thread del ESP
- Administra de forma manual los nodos de Thread con el ESP Monitor y la CLI de OpenThread.
- Cómo formar una red Thread en el router de borde de Thread.
- Protección de la puesta en marcha de dispositivos en una red Thread.
- Hacer ping a la dirección IPv6 entre los nodos de Thread
- Pasar mensajes entre los nodos de Thread con UDP
Qué necesitarás
Hardware:
Software:
2. Primeros pasos
- Instalación del ESP-IDF.
Sigue la Guía de programación de ESP-IDF para instalar el entorno de desarrollo de software.
- Clona el SDK del router de borde del subproceso de ESP.
ESP-THREAD-BR es el SDK oficial del router de borde del subproceso ESP. Admite todas las funciones de red fundamentales para crear un router de borde de Thread e integra funciones completas a nivel de producto para lograr 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 las placas ESP con módulos IEEE 802.15.4, puedes consultar el ejemplo de ESP-IDF ot_cli para obtener más información:
$ 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
Component config > OpenThread > Enable Joiner, luego compila y escribe en la memoria flash.
$ idf.py -p <your-local-port> build flash monitor
Para compilar y escribir en la memoria flash el archivo binario OT-BR en la placa del router de borde del subproceso de ESP, primero debes compilar el archivo binario RCP. No es necesario escribir este archivo binario RCP de forma explícita en la memoria flash del dispositivo de la placa del router de borde del subproceso del ESP. Se incluirá en el archivo binario del router de borde y se actualizará en el chip ESP32-H2 la primera vez que se inicia (o se cambia el firmware RCP). Para obtener más información, puedes consultar los documentos de BR del subproceso de ESP:
$ 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 comisionado a través de menuconfig:
$ idf.py menuconfig
Component config > OpenThread > Enable Commissioner, 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 del Thread del ESP (BR Commissioner):
## 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
Confirma 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
Espera unos minutos y comprueba el estado del dispositivo. Debería ser el líder.
> state leader Done >
5. Únete a la red Thread mediante una clave de red
En este codelab, se preparan dos placas de ESP con módulos IEEE 802.15.4 para unirse a la red formada por 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 IEEE 802.15.4:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
Confirma 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
Espera unos minutos y comprueba el estado del dispositivo. Debe ser el campo Secundario.
> state child Done
Configura la función como 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 >
6. Únete a la red Thread mediante la puesta en marcha segura
En esta sesión, agregaremos Board2 a la red a través de la comisión de seguridad:
Solicite la solicitud de asistencia personal al comisionado de Brasil:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Configura la información de la red para Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Confirma 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 encargado y especifica el eui64
del dispositivo que se puede unir, junto con la credencial de unión, por ejemplo, J01NME
. La credencial de unión es una string específica del dispositivo compuesta por todos los caracteres alfanuméricos en mayúscula (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. Comience el rol de unión con la credencial de unión que acaba de configurar en el comisionado de BR:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
En aproximadamente un minuto, recibirás una confirmación de que la autenticación se realizó correctamente:
## Board2 Joiner ## ---------------------- > Join success
Luego, podrás iniciar y unirte a la red Thread formada por el comisionado de BR.
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
Configura la función como 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 obtienes una red Thread con la topología que se muestra a continuación:
7. Haz ping a la dirección IPv6 entre los nodos Thread
Puedes usar el comando ping para comunicarte entre dos tableros 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 al Board2 MLE-ID desde el Comisionado de BR, puedes ejecutar este comando en el Comisionado de BR:
## 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 Thread 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 escucha 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 de Board1 a la dirección BR MLE-ID y al puerto 20617
:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Puedes ver el mensaje recibido 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 de ESP.
Ahora sabes cómo:
- Compilar y escribir en la memoria flash de objetos binarios de la CLI de OpenThread en las placas del ESP
- Cómo compilar un router de borde parpadeante en la placa del router de borde Thread del ESP
- Administra de forma manual los nodos de Thread con el ESP Monitor y la CLI de OpenThread.
- Cómo formar una red Thread en el router de borde de Thread.
- Protección de la puesta en marcha de dispositivos en una red Thread.
- Hacer ping a la dirección IPv6 entre los nodos de Thread
- Pasar mensajes entre los nodos de Thread con UDP
Lecturas adicionales
Consulta openthread.io y GitHub para obtener una variedad de recursos de OpenThread, incluidos los siguientes:
- Plataformas compatibles: Descubre todas las plataformas que admiten OpenThread.
- Compilación de OpenThread: Más detalles sobre la compilación y configuración de OpenThread
- Thread Primer: Cubre todos los conceptos de Thread que se presentan en este codelab.
Referencia: