Simular redes Thread usando OTNS

Sobre este codelab
schedule30 minutos
subjectÚltimo 15 de maio de 2025 atualizado
account_circleEscrito por Simon Lin, Colin Tan, Esko Dijk

1. Introdução

Impressão de uma topologia de rede de malha Thread

O que são o Thread e o OTNS

O Thread é um protocolo de rede mesh sem fio de baixo consumo energético baseado em IP que permite comunicações seguras entre dispositivos e entre dispositivos e a nuvem. As redes Thread podem se adaptar a mudanças de topologia para evitar um único ponto de falha.

O OpenThread lançado pelo Google é uma implementação de código aberto do Thread. Apesar do pequeno tamanho do código e do espaço de armazenamento em memória, o OpenThread oferece suporte a todos os recursos definidos na especificação de linha de execução.

O OpenThread Network Simulator (OTNS) pode ser usado para simular redes Thread executando nós OpenThread simulados em plataformas POSIX. O OTNS oferece uma interface da Web fácil de usar (OTNS-Web) para visualizar e operar redes Thread simuladas. Também é possível fazer simulações com script (com Python).

O que você vai aprender

  • Instalar o OTNS e as dependências
  • Conheça os conceitos básicos da OTNS-CLI
  • Como adicionar/mover/excluir nós do OpenThread no OTNS-Web
  • Use outros recursos úteis do OTNS-Web para controlar a simulação de rede.
  • Verificar se o OpenThread não tem ponto único de falha
  • Conferir o tráfego de dados entre nós do OpenThread no Wireshark

Este codelab se concentra no OTNS-CLI e no OTNS-Web para uso interativo. Outros recursos do OTNS, como o script Python, não são abordados.

O que é necessário

  • De preferência, Linux x86_64 ou Mac OS com Homebrew. O Ubuntu 22/24 no WSL2 do Windows também funciona, mas pode exigir algumas alterações manuais nas configurações.
  • Git.
  • Navegador da Web. O OTNS-Web usa um navegador da Web para mostrar simulações.
  • Introdução à linha de execução. Você precisa conhecer os conceitos básicos de thread para entender o que é ensinado neste codelab.

Terminologia

O termo "roteador" é usado como o termo técnico para o extensor de malha Thread, que inicialmente era chamado de roteador Thread. "Node" se refere a qualquer dispositivo OpenThread simulado em uma simulação de OTNS.

2. Instalação

Receber o código OTNS

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

Todos os comandos de console subsequentes neste codelab são executados no diretório otns.

Inicialização e instalação

O script bootstrap vai instalar dependências (incluindo Python3 e Go/Golang, se necessário) e o OTNS. Ele também cria os vários tipos de nó de OT que podem ser usados diretamente em uma simulação e realiza alguns testes básicos. Devido aos builds de nó, isso pode levar vários minutos.

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

Talvez seja necessário inserir uma senha para sudo.

Se o otns não estiver instalado corretamente

O script pode informar um erro como:

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

Nesse caso, você precisa adicionar $(go env GOPATH)/bin ao $PATH..

No caso de outros erros, é possível criar um problema no GitHub.

3. Executar o OTNS pela primeira vez

Execute otns:

$ otns
>_ ← OTNS-CLI prompt

Quando iniciado, o OTNS entra em um console da CLI (OTNS-CLI) e inicia um navegador da Web para visualização e gerenciamento de rede (OTNS-Web):

Janela OTNS-Web no início

Se você só conseguir acessar uma página em branco para o OTNS-Web, provavelmente a WebGL não está ativada no navegador. Consulte https://superuser.com/a/836833 para saber como ativar o WebGL.

Nas próximas seções, você vai aprender a gerenciar simulações de OTNS usando OTNS-CLI e OTNS-Web.

4. Conheça o OTNS-CLI e o OTNS-Web

OTNS-CLI

OTNS-CLI é a interface de linha de comando (CLI) para gerenciar simulações de OTNS.

$ otns
>_ ← OTNS-CLI prompt

Você pode digitar comandos usando OTNS-CLI. Consulte a referência da CLI do OTNS para conferir uma lista completa de comandos. Não se preocupe, você vai usar apenas alguns desses comandos neste codelab.

Digite o comando help para conferir uma visão geral dos comandos da CLI. Essa lista é idêntica à referência da CLI.

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

Para receber mais ajuda sobre um comando específico, use o nome dele, por exemplo:

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

OTNS-Web

OTNS-Web é a ferramenta de visualização e gerenciamento de rede do OTNS. Ele fornece uma representação visual dos nós, mensagens e links da rede Thread simulada. Observe os vários elementos de OTNS-Web:

Explicação dos elementos OTNS-Web

5. Adicionar nós

Adicionar nós pelo OTNS-CLI

Adicione um roteador Thread à simulação:

> add router
1
Done

Um nó será criado em OTNS-Web. O nó começa como um roteador e se torna um líder em alguns segundos:

Um nó na função de líder

Para facilitar o início das simulações de forma interativa, cada novo nó do OpenThread é comissionado por padrão com um conjunto padrão de parâmetros de rede.

Adicionar mais nós por OTNS-CLI

Agora vamos adicionar alguns nós de tipos diferentes.

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

Aguarde alguns segundos para que os nós sejam mesclados em uma partição. Os nós em OTNS-Web vão aparecer:

Rede Thread com 4 nós

Também em OTNS-Web, é possível selecionar qualquer um dos nós para acessar um painel com mais informações sobre ele. Por exemplo, na figura abaixo, o nó 1 está selecionado. A entrada "Função" no painel confirma que é um líder.

Rede Thread com quatro nós, o nó 1 está selecionado

Adicionar nós por OTNS-Web

Também é possível adicionar nós usando OTNS-Web. Clique no botão New Router do Action Bar. Um nó será criado à direita do nó selecionado. O novo roteador precisa se juntar à partição Thread existente:

Um roteador é adicionado, totalizando 5 nós

Clique também nos botões FED, MED, SSED e BR na barra de ação para criar outros tipos de nós. Agora, há 9 nós no total. Se quiser, arraste alguns nós para outras posições para criar uma topologia de rede física diferente.

Vários nós novos adicionados, total de 9 nós

Agora você criou uma rede Thread de uma partição que contém muitos nós. Na próxima seção, vamos ajustar a velocidade da simulação para que ela seja executada mais rapidamente.

6. Ajustar velocidade

No momento, a simulação precisa estar sendo executada na velocidade 1X, o que significa que o tempo decorrido até agora é o mesmo que o tempo real desde que o primeiro nó foi criado.

Ajustar a velocidade usando OTNS-CLI

É possível ajustar a velocidade de simulação usando OTNS-CLI.

Definir a velocidade de simulação como 100X

> speed 100
Done

Os nós vão enviar mensagens com muito mais frequência do que antes.

Definir a velocidade de simulação como MAX

> speed max
Done

A OTNS está tentando simular o mais rápido possível. Por isso, você vai notar que os nós estão enviando um grande número de mensagens.

Pausar simulação

> speed 0
Done

Definir a velocidade de simulação como 0 pausa a simulação.

Restaurar a simulação na velocidade normal

> speed 1
Done

Definir a velocidade de simulação como um valor maior que 0 retoma a simulação.

Ajustar a velocidade usando OTNS-Web

Botões de controle de velocidade

Encontre os botões de controle de velocidade Botões de controle de velocidade no Action Bar. Os botões mostram a velocidade atual da simulação e podem ser usados para ajustar a velocidade da simulação e pausar/retomar a simulação.

Acelerar a simulação

Para acelerar a simulação, clique no botão Botão de aumento de velocidade até que a velocidade atinja MAX: Indicador de velocidade máxima da simulação.

Simulação lenta

Para desacelerar a simulação, clique no botão Botão de diminuição de velocidade.

Pausar simulação

Clique no botão Botão "Pausar" para pausar a simulação quando ela estiver em execução. O botão será alterado para Botão de reprodução.

Retomar simulação

Clique no botão Botão de reprodução para retomar a simulação quando ela estiver pausada. O botão será alterado de volta para Botão "Pausar".

Definir a velocidade de simulação como 10X

Para economizar tempo, use

OTNS-CLI para ajustar a velocidade de simulação para

10X para que possamos observar as mudanças de topologia na rede muito mais rapidamente.

> speed 10
Done

7. Ativar/desativar o rádio

Agora, a simulação precisa conter pelo menos dois roteadores (forma hexagonal), possivelmente um roteador de borda (forma quadrada) e muitos filhos, e ser executada a 10 vezes a velocidade.

Encontre o líder atual (borda vermelha) dos dois roteadores e clique uma vez para selecioná-lo:

Rede Thread com o nó líder 1 selecionado

Desativar o rádio

Clique no botão Botão "Desativar" do botão de opção na barra de ações para desativar o rádio do nó líder. O líder não poderá enviar nem receber mensagens com o rádio desligado.

Aguarde cerca de 12 segundos (120 segundos no tempo de simulação) para que o outro roteador ou roteador de borda se torne o novo líder:

Uma nova partição é formada com o nó 9 como o novo líder

A rede Thread se recupera automaticamente da falha do líder formando uma nova partição com um novo líder. A nova partição também tem uma cor diferente.

Ativar o rádio

Selecione o líder que desativou o rádio. Clique no botão Botão de opção em Action Bar para restaurar a conectividade do rádio:

O nó 1 se junta à partição depois que o rádio é ativado novamente

O líder precisa se conectar novamente à rede depois que a conectividade de rádio for restaurada.

8. Mover nós

O OTNS permite que os usuários movam os nós facilmente usando OTNS-CLI ou OTNS-Web.

Mover o nó por OTNS-CLI

Mova o nó do roteador de borda 9 para um novo local:

> move 9 50 50
Done

Mover o nó pelo OTNS-Web

Arraste o nó 5 para o canto inferior direito. Como o nó 5 está fora da cobertura de rádio dos outros roteadores, ele forma a própria partição com um novo ID. Os IDs de partição podem ser verificados no painel de informações do nó clicando nos nós.

O nó 5 é afastado dos outros e forma uma nova partição

Uma única linha verde ainda é desenhada entre os nós 5 e 9. Isso geralmente ocorre devido a informações desatualizadas sobre uma criança, que ainda são mantidas na tabela filha de um ex-pai. Ou pode ser informação desatualizada sobre a antiga conexão entre os roteadores 9 e 5. Ou, neste caso, talvez até um bug de renderização. Eventualmente, as informações antigas são limpas nos nós após o tempo limite adequado.

9. Excluir nós

Excluir nós com OTNS-CLI

Exclua o nó 5:

> del 5
Done

O nó 5 vai desaparecer da simulação:

O nó 5 é excluído da simulação

Excluir nós com OTNS-Web

Selecione o nó do roteador de borda 9 e clique no botão Botão "Excluir" no Action Bar para excluir o nó 9:

O nó 9 do roteador de borda é excluído

O Node 1 precisa se tornar o líder de uma nova partição, e todos os nós restantes serão anexados como filhos ao nó 1.

10. Contexto do nó OTNS-CLI

OTNS-CLI fornece o modo de contexto do nó para facilitar a interação com os nós e ajudar os desenvolvedores a diagnosticar o status de um nó. Além disso, as ações de nó podem ser iniciadas nesse modo.

Entrar no modo de contexto do nó

Insira o contexto do nó 1:

> node 1
Done
node 1>

O prompt da CLI mudou para node 1> , indicando o contexto do nó atual. É possível digitar comandos da CLI do OpenThread para serem executados no nó como se você estivesse interagindo com ele diretamente.

Executar comandos no contexto do nó

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

Mudar para outro contexto de nó

node 1> node 2
Done
node 2> 

Sair do contexto do nó

node 1> exit
Done
>

Uma maneira alternativa de sair do contexto do nó é o comando node 0.

11. Como visualizar registros de nó e capturas de pacotes

Registros do nó do OpenThread

Por padrão, o OTNS gera arquivos de registro detalhados para todos os nós OpenThread simulados. Eles podem ser visualizados no diretório ./tmp. O nome do arquivo é 0_.log. Por exemplo, um trecho de arquivo de registro é mostrado abaixo:

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

O tempo absoluto da simulação em microssegundos é mostrado à esquerda. O carimbo de data/hora hh:mm:ss mostra o carimbo de data/hora do registro do próprio nó do OpenThread, que pode ser diferente do tempo de simulação absoluto.

Capturas de pacotes do Wireshark

Por padrão, todos os frames IEEE 802.15.4 transmitidos são capturados no arquivo PCAP current.pcap. Esse arquivo pode ser lido pelo Wireshark durante ou após a simulação. Devido à criptografia de camada de link do Thread, uma ação de configuração única no Wireshark é necessária para definir a chave de descriptografia para OTNS corretamente. Por padrão, uma chave de rede conhecida é usada para facilitar a descriptografia de frames pelo Wireshark.

Confira um exemplo de inspeção de pacotes do OpenThread no Wireshark na captura de tela abaixo.

Captura de tela da análise de pacotes do OpenThread no Wireshark

Para configurar a chave de descriptografia, selecione no menu Edit -> Preferences. Em seguida, na janela de preferências, selecione Protocols -> IEEE 802.15.4. Clique no botão Editar... ao lado de "Chaves de descriptografia". Clique em + para criar uma nova entrada e digite a chave 00112233445566778899aabbccddeeff (32 caracteres) e selecione "Hash de thread" no campo "Hash de chave". O "índice da chave de descriptografia" pode ser deixado como 0. Em seguida, clique em OK e OK novamente. Agora, o arquivo PCAP do OTNS será descriptografado corretamente quando carregado.

Os carimbos de data/hora mostrados na coluna "Tempo" (em segundos) correspondem aos valores absolutos do tempo de simulação mostrados nos registros do nó do OpenThread. Isso facilita a correlação das mensagens de registro com os frames de rádio transmitidos ou recebidos. No entanto, os valores normalmente não são idênticos até a precisão de um microssegundo: o hardware de rádio IEEE 802.15.4 simulado pode adicionar um atraso adicional depois que um frame de rádio é solicitado para ser enviado pela pilha OpenThread.

12. Parabéns

Parabéns, você executou sua primeira simulação de OTNS.

Você aprendeu a instalar o OTNS e as dependências dele. Você iniciou uma simulação de OTNS com nós simulados do OpenThread. Você aprendeu a manipular a simulação de várias maneiras usando OTNS-CLI e OTNS-Web.

Agora você sabe o que é o OTNS e como usá-lo para simular redes OpenThread.

A seguir

Confira alguns destes codelabs:

Documentos de referência