Simula redes de Thread con OTNS

1. Introducción

Impresión de una topología de red de malla de Thread

¿Qué son Thread y OTNS?

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 un solo punto de falla.

OpenThread, lanzado por Google, es una implementación de código abierto de Thread. A pesar de su pequeño tamaño de código y su huella de memoria, OpenThread admite todas las funciones definidas en la especificación de Thread.

OpenThread Network Simulator (OTNS) se puede usar para simular redes Thread ejecutando nodos OpenThread simulados en plataformas POSIX. OTNS proporciona una interfaz web fácil de usar (OTNS-Web) para visualizar y operar redes de Thread simuladas. También es posible realizar simulaciones con secuencias de comandos (con Python).

Qué aprenderás

  • Instala OTNS y sus dependencias
  • Conoce los conceptos básicos de OTNS-CLI
  • Cómo agregar, mover o borrar nodos de OpenThread en OTNS-Web
  • Usa otras funciones útiles de OTNS-Web para controlar la simulación de red
  • Verifica que OpenThread no tenga un solo punto de falla
  • Cómo ver el tráfico de datos entre nodos de OpenThread en Wireshark

Este codelab se enfoca en OTNS-CLI y OTNS-Web para el uso interactivo. No se abordan otras funciones de OTNS, como la creación de secuencias de comandos en Python.

Requisitos

  • Thread Primer Deberás conocer los conceptos básicos de Thread para comprender lo que se enseña en este codelab.
  • Preferentemente Linux x86_64 o macOS con Homebrew La versión 24 o posterior de Ubuntu en WSL2 de Windows también debería funcionar, pero es posible que requiera algunos ajustes manuales de la configuración.
  • Git
  • Navegador web OTNS-Web usa un navegador web para mostrar simulaciones.
  • Analizador de protocolos de red Wireshark (opcional)
  • Go, versión 1.23 o posterior
    • La secuencia de comandos de instalación verificará la versión de Go instalada.
    • Si Go no está instalado, se instalará una versión >= 1.23, si está disponible en el administrador de paquetes.
    • Si no está disponible en el administrador de paquetes, se requiere la instalación manual.
    • Ten en cuenta que Ubuntu 24.04 o versiones anteriores no admiten Go 1.23 automáticamente. Consulta la página Available Golang versions en la documentación de Ubuntu para obtener más detalles. Es posible realizar la instalación manual, usar snap o seguir otros procedimientos.
  • Versión 3.9 o posterior de Python
    • La secuencia de comandos de instalación verificará la versión de Python instalada.
    • Si Python 3 aún no está instalado, se instalará una versión >= 3.9 si está disponible en el administrador de paquetes.
    • Si no está disponible en el administrador de paquetes, se requiere la instalación manual.

Terminología

El término "router" se usa como el término técnico para el amplificador de malla de Thread, que inicialmente se denominó router de Thread. "Nodo" hace referencia a cualquier dispositivo OpenThread simulado en una simulación de OTNS.

2. Instalación

Obtén el código de OTNS

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

Todos los comandos de la consola posteriores en este codelab se ejecutan desde el directorio otns.

Cómo iniciar y realizar la instalación

La secuencia de comandos bootstrap instalará las dependencias (incluidos Python 3 y Go/Golang, si es necesario) y OTNS. Ten en cuenta que es posible que la secuencia de comandos se detenga si no puede instalar automáticamente ciertas dependencias, como Python versión >= 3.9 o Go versión >= 1.23. La instalación automática requiere que los paquetes se puedan encontrar en el repositorio de paquetes configurado del sistema operativo.

La secuencia de comandos también compila los distintos tipos de nodos de OT que se pueden usar directamente en una simulación y realiza algunas pruebas básicas. Debido a estas compilaciones de nodos, el proceso puede tardar varios minutos.

$ ./script/bootstrap
....
....
OTNS installed - use 'otns' to start it.
$

Es posible que se te solicite que ingreses una contraseña para sudo durante la ejecución de la secuencia de comandos.

Si otns no está instalado correctamente

Es posible que la secuencia de comandos informe un error como el siguiente:

....
OTNS installed - please add ~/go/bin to your PATH variable first, to use it.
$

En este caso, debes agregar $(go env GOPATH)/bin a tu variable $PATH.

En caso de otros errores, se puede crear un problema de GitHub.

3. Cómo ejecutar OTNS por primera vez

Ejecuta otns:

$ otns
>_ ← OTNS-CLI prompt

Cuando se inicie correctamente, OTNS ingresará a una consola de CLI (OTNS-CLI) y lanzará un navegador web para la visualización y administración de la red (OTNS-Web):

Ventana de OTNS-Web al inicio

Si solo ves una página en blanco en OTNS-Web, es probable que WebGL no esté habilitado en tu navegador. Consulta https://superuser.com/a/836833 para saber cómo habilitar WebGL.

En las siguientes secciones, aprenderás a administrar simulaciones de OTNS a través de OTNS-CLI y OTNS-Web.

4. Conoce OTNS-CLI y OTNS-Web

OTNS-CLI

OTNS-CLI es la interfaz de línea de comandos (CLI) para administrar simulaciones de OTNS.

$ otns
>_ ← OTNS-CLI prompt

Puedes escribir comandos a través de OTNS-CLI. Consulta la referencia de la CLI de OTNS para obtener una lista completa de los comandos. No te preocupes, solo usarás algunos de estos comandos en este codelab.

Escribe el comando help para obtener una descripción general de los comandos de la CLI. Esta lista es idéntica a la referencia de la CLI.

> help
add             Add a node to the simulation and get the node ID.
....
....
Done
> 

Para obtener más ayuda sobre un comando específico, usa el nombre del comando, por ejemplo:

> help add
add
  Add a node to the simulation and get the node ID.
  
Definition:
....
....
> 

OTNS-Web

OTNS-Web es la herramienta de administración y visualización de redes de OTNS. Proporciona una representación visual de los nodos, los mensajes y los vínculos de la red Thread simulada. Observa los distintos elementos de OTNS-Web:

Explicación de los elementos de OTNS-Web

5. Agregar nodos

Agrega nodos a través de OTNS-CLI

Agrega un router de subprocesos a la simulación:

> add router
1
Done

Deberías ver un nodo creado en OTNS-Web. El nodo comienza como un router y se convierte en líder en unos segundos:

Un nodo con el rol de líder

Para facilitar el inicio de simulaciones de forma interactiva, cada nodo nuevo de OpenThread se pone en servicio de forma predeterminada con un conjunto estándar de parámetros de red.

Agregar más nodos a través de OTNS-CLI

Ahora agregaremos algunos nodos de diferentes tipos.

> add fed
2
Done
> add med
3
Done
> add sed
4
Done

Espera unos segundos para que los nodos se combinen en una partición. Deberías ver los nodos en OTNS-Web:

Red de Thread con 4 nodos

También en OTNS-Web, es posible seleccionar cualquiera de los nodos para obtener un panel con más información sobre él. Por ejemplo, en la siguiente figura, se selecciona el nodo 1. La entrada “Rol” en el panel confirma que es un líder.

Red de Thread con 4 nodos, se selecciona el nodo 1

Agregar nodos por OTNS-Web

También puedes agregar nodos a través de OTNS-Web. Haz clic en el botón New Router de Action Bar. Deberías ver que se crea un nodo a la derecha del nodo seleccionado. El nuevo router debe unirse a la partición de Thread existente:

Se agrega un router, lo que da un total de 5 nodos.

También haz clic en los botones FED, MED, SSED y BR de la barra de acciones para crear estos otros tipos de nodos. Ahora debería haber 9 nodos en total. Si quieres, arrastra algunos nodos a otras posiciones para crear una topología de red física diferente.

Se agregaron varios nodos nuevos, con un total de 9 nodos

Ahora creaste una red de Thread de una partición que contiene muchos nodos. En la siguiente sección, ajustaremos la velocidad de simulación para que la simulación se ejecute más rápido.

6. Ajustar velocidad

Actualmente, la simulación debería ejecutarse a una velocidad de 1X, lo que significa que el tiempo de simulación transcurrido hasta el momento es el mismo que el tiempo real desde que creamos el primer nodo.

Cómo ajustar la velocidad con OTNS-CLI

Puedes ajustar la velocidad de simulación con OTNS-CLI.

Establece la velocidad de simulación en 100X

> speed 100
Done

Deberías ver que los nodos envían mensajes con mucha más frecuencia que antes.

Establece la velocidad de simulación en MAX

> speed max
Done

Ahora, OTNS intenta simular lo más rápido posible, por lo que deberías ver nodos que envían una gran cantidad de mensajes.

Poner simulación en pausa

> speed 0
Done

Si configuras la velocidad de simulación en 0, se pausará la simulación.

Restablece la simulación a la velocidad normal

> speed 1
Done

Si se establece la velocidad de simulación en un valor mayor que 0, se reanuda la simulación.

Cómo ajustar la velocidad con OTNS-Web

Botones de control de velocidad

Busca los botones de control de velocidad Botones de control de velocidad en el Action Bar. Los botones muestran la velocidad de simulación actual y se pueden usar para ajustar la velocidad de simulación y pausar o reanudar la simulación.

Cómo acelerar la simulación

Para acelerar la simulación, haz clic en el botón Botón para aumentar la velocidad hasta que la velocidad alcance MAX: Indicador de velocidad de simulación MÁXIMA.

Cómo reducir la velocidad de la simulación

Para ralentizar la simulación, haz clic en el botón Botón para disminuir la velocidad.

Poner simulación en pausa

Haz clic en el botón Botón para pausar para pausar la simulación mientras se ejecuta. El botón cambiará a Botón de reproducción.

Reanudar la simulación

Haz clic en el botón Botón de reproducción para reanudar la simulación cuando esté en pausa. El botón volverá a ser Botón para pausar.

Establece la velocidad de simulación en 10X

Para ahorrar tiempo, usa

OTNS-CLI para ajustar la velocidad de simulación a

10X para que podamos observar los cambios de topología en la red mucho más rápido.

> speed 10
Done

7. Cómo encender o apagar la radio

Ahora, la simulación debería contener al menos 2 routers (forma de hexágono), posiblemente un router de borde (forma cuadrada) y muchos dispositivos secundarios, y ejecutarse a una velocidad 10 veces mayor.

Busca el líder actual (borde rojo) de los 2 routers y haz un solo clic para seleccionarlo:

Red de subprocesos con el nodo líder 1 seleccionado

Apagar la radio

Haz clic en el botón Botón de radio apagada de la barra de acciones para desactivar la radio del nodo líder. El líder no podrá enviar ni recibir mensajes con la radio apagada.

Espera unos 12 s (120 s en tiempo de simulación) para que el otro router o router de borde se convierta en el nuevo líder:

Se forma una nueva partición con el nodo 9 como el nuevo líder.

La red de Thread se recupera automáticamente de la falla del líder formando una nueva partición con un nuevo líder. La nueva partición también tiene un color nuevo.

Encender la radio

Selecciona el líder cuya radio se apagó. Haz clic en el botón Botón de radio activado en Action Bar para restablecer la conectividad de la radio:

El nodo 1 se une a la partición después de que se vuelve a encender la radio.

El líder debe volver a conectarse a la red después de que se restablezca la conectividad de radio.

8. Cómo mover nodos

OTNS permite a los usuarios mover nodos fácilmente a través de OTNS-CLI o OTNS-Web.

Mover el nodo a través de OTNS-CLI

Mueve el nodo del Border Router 9 a una nueva ubicación:

> move 9 50 50
Done

Cómo mover un nodo a través de OTNS-Web

Arrastra el nodo 5 hasta la esquina inferior derecha. Debido a que el nodo 5 ahora está fuera de la cobertura de radio de los otros routers, forma su propia partición con un nuevo ID de partición. Puedes verificar los IDs de partición en el panel de información del nodo haciendo clic en los nodos.

El nodo 5 se aleja de los demás nodos y forma una nueva partición.

Ten en cuenta que aún se dibuja una sola línea verde entre el nodo 5 y el nodo 9. Esto suele deberse a información obsoleta sobre un menor, que aún se conserva en la tabla de menores de un antiguo padre o madre. O bien podría ser información obsoleta sobre la anterior vinculación de router a router entre el nodo 9 y el nodo 5. (O, posiblemente, en este caso, incluso un error de renderización). Finalmente, la información obsoleta se limpia en los nodos después del tiempo de espera adecuado.

9. Borrar nodos

Cómo borrar nodos a través de OTNS-CLI

Borra el nodo 5:

> del 5
Done

El nodo 5 debería desaparecer de la simulación:

Se borra el nodo 5 de la simulación.

Cómo borrar nodos a través de OTNS-Web

Selecciona el nodo 9 del Border Router y haz clic en el botón Botón para borrar en el Action Bar para borrar el nodo 9:

Se borró el nodo 9 del router de borde

Node 1 debe convertirse en el líder de una nueva partición, y todos los nodos restantes se adjuntarán como secundarios al nodo 1.

10. Contexto del nodo de OTNS-CLI

OTNS-CLI proporciona el modo de contexto de nodo para facilitar la interacción con los nodos y ayudar a los desarrolladores a diagnosticar el estado de un nodo. También se pueden iniciar acciones de nodos desde este modo.

Cómo ingresar al modo de contexto de nodo

Ingresa el contexto del nodo 1:

> node 1
Done
node 1>

El mensaje de la CLI cambió a node 1> , lo que indica el contexto del nodo actual. Puedes escribir comandos de la CLI de OpenThread para que se ejecuten en el nodo como si interactuaras con él directamente.

Ejecuta comandos en el contexto del nodo

node 1> state
leader
Done
node 1> channel
11
Done
node 1> panid
0xface
Done
node 1> networkname
otns
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:b400
fd00:f00d:cafe:0:2505:8719:3685:ebfb
fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb
fe80:0:0:0:e86a:e07:ec97:777
Done

Cómo cambiar a otro contexto de nodo

node 1> node 2
Done
node 2> 

Contexto del nodo de salida

node 1> exit
Done
>

Una forma alternativa de salir del contexto del nodo es el comando node 0.

11. Cómo ver los registros de nodos y las capturas de paquetes

Registros de nodos de OpenThread

De forma predeterminada, OTNS genera archivos de registro detallados para todos los nodos simulados de OpenThread. Se pueden ver en el directorio ./tmp. El nombre del archivo es 0_.log. Por ejemplo, a continuación, se muestra un fragmento de un archivo de registro:

7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-:     src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6    | ..&..!.eSZCN.Y.  |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-:     src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---:     12 0x3000 - me - leader

El tiempo de simulación absoluto en microsegundos se muestra a la izquierda. La marca de tiempo hh:mm:ss muestra la marca de tiempo del registro del nodo de OpenThread, que puede diferir de la hora absoluta de la simulación.

Capturas de paquetes de Wireshark

De forma predeterminada, todos los fotogramas IEEE 802.15.4 transmitidos se capturan en el archivo PCAP current.pcap. Wireshark puede leer este archivo durante la simulación o después de ella. Debido al cifrado de la capa de vínculo de Thread, se necesita una acción de configuración única en Wireshark para establecer correctamente la clave de descifrado para OTNS. De forma predeterminada, se usa una clave de red conocida para facilitar la desencriptación de tramas con Wireshark.

Consulta la siguiente captura de pantalla para ver un ejemplo de la inspección de paquetes de OpenThread en Wireshark.

Captura de pantalla del análisis de paquetes de OpenThread en Wireshark

Para configurar la clave de desencriptación, selecciona en el menú Editar -> Preferencias. Luego, en la ventana de preferencias, selecciona Protocols -> IEEE 802.15.4. Haz clic en el botón Editar… junto a “Claves de desencriptación”. Haz clic en + para crear una entrada nueva, ingresa la clave 00112233445566778899aabbccddeeff (32 caracteres) y selecciona "Hash del subproceso" en el campo "Hash de la clave". El "Índice de clave de desencriptación" se puede dejar en 0. Luego, haz clic en Aceptar y, luego, en Aceptar nuevamente. Ahora, el archivo PCAP de OTNS debería desencriptarse correctamente cuando se cargue.

Las marcas de tiempo que se muestran en la columna "Tiempo" (en segundos) corresponden a los valores absolutos de tiempo de simulación que se muestran en los registros de nodos de OpenThread. Esto facilita la correlación de los mensajes de registro con los fotogramas de radio transmitidos o recibidos. Sin embargo, los valores no suelen ser idénticos con una precisión de un microsegundo: el hardware de radio IEEE 802.15.4 simulado puede agregar una demora adicional después de que la pila de OpenThread solicita que se envíe un fotograma de radio.

12. Felicitaciones

¡Felicitaciones! Ejecutaste con éxito tu primera simulación de OTNS.

Ya aprendiste a instalar OTNS y sus dependencias. Iniciaste una simulación de OTNS con nodos simulados de OpenThread. Aprendiste a manipular la simulación de varias maneras a través de OTNS-CLI y OTNS-Web.

Ahora sabes qué es OTNS y cómo puedes usarlo para simular redes de OpenThread.

Próximos pasos

Consulta algunos codelabs sobre los siguientes temas:

Documentos de referencia