Criar uma rede Thread com a placa do roteador de borda do Thread ESP32H2 e no ESP

1. Introdução

26b7f4f6b3ea0700.png

O OpenThread, lançado pela equipe do Google Nest, é uma implementação de código aberto do protocolo de rede Thread® projetada para acelerar o desenvolvimento de produtos para casas conectadas. A Especificação Thread define um protocolo de comunicação sem fio entre dispositivos, confiável, seguro e de baixo consumo de energia baseado em IPv6 para aplicativos de construção doméstica e comercial.

O Espressif fez a portabilidade da pilha OpenThread com base em FreeRTOS e LwIP, permitindo que os desenvolvedores criem rapidamente redes Thread. O código-fonte relacionado pode ser encontrado no GitHub. Ao mesmo tempo, o Espressif também implementou um roteador de borda do Thread com base em RTOS.

Neste codelab, você vai programar o OpenThread em hardware real, criar e gerenciar uma rede Thread e transmitir mensagens entre os nós.

Espressif_hardware_setup.jpg

Conteúdo

  • Criar e atualizar binários da CLI OpenThread para placas ESP.
  • Criar e atualizar o roteador de borda na placa do roteador de borda do Thread ESP.
  • Gerenciar manualmente os nós do Thread com o ESP Monitor e a CLI do OpenThread.
  • Formação de uma rede Thread no roteador de borda do Thread.
  • Proteger o comissionamento de dispositivos em uma rede Thread.
  • Um ping de endereço IPv6 entre nós Thread.
  • Como transmitir mensagens entre nós da linha de execução com UDP.

Pré-requisitos

Hardware:

  • Duas placas ESP com módulos IEEE 802.15.4.
  • 1 Placa de roteador de borda do Thread ESP.

Software:

2. Como começar

  1. Instalação do ESP-IDF.

Siga o Guia de programação do ESP-IDF para instalar o ambiente de desenvolvimento de software.

  1. Clone o SDK do roteador de borda do Thread ESP.

ESP-OUTPUT-BR é o SDK oficial do roteador de borda de Thread do ESP. Ele oferece suporte a todos os recursos de rede fundamentais para criar um roteador de borda Thread e integra recursos avançados no nível do produto para uma produtividade rápida.

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

3. Criação e atualização

Para criar e atualizar o arquivo binário ot-cli-ftd em placas ESP com módulos IEEE 802.15.4, consulte o exemplo ot_cli do ESP-IDF para mais detalhes:

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

Ative o recurso de agrupamento via menuconfig:

$ idf.py menuconfig

Configuração do componente > OpenThread > Ativar o Joiner, depois crie e atualize.

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

Para criar e atualizar o arquivo binário ot-br na placa do roteador de borda do Thread ESP, é necessário criar o arquivo binário RCP primeiro. Esse arquivo binário RCP não precisa ser explicitamente atualizado no dispositivo na placa do roteador de borda do Thread do ESP. Ele será incluído no arquivo binário do roteador de borda e atualizado no chip ESP32-H2 na primeira inicialização (ou quando o firmware do RCP mudar). Consulte os documentos do ESP Thread BR para mais detalhes:

$ 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

Ative o recurso do Comissário via menuconfig:

$ idf.py menuconfig

Configuração do componente > OpenThread > Ativar Commissioner, depois crie e atualize.

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

4. Como formar uma rede Thread no roteador de borda do Thread

Agora você pode formar uma rede Thread usando a linha de comando OpenThread na placa do roteador de borda do Thread 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

Confirme este conjunto de dados como o ativo:

> dataset commit active
Done

Chame a interface IPv6:

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

Inicie a operação do protocolo de linha de execução:

> 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

Após alguns instantes, verifique o estado do dispositivo. Tem que ser o Líder.

> state
leader
Done
> 

5. Conectar-se à rede Thread via chave de rede

Neste codelab, duas placas ESP com módulos IEEE 802.15.4 estão preparadas para entrar na rede formada BR. Nesta sessão, vamos adicionar a Board1 à rede.

Consulte a chave de rede no Brasil:

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

Defina essa chave de rede como uma placa ESP (Joiner Board1) com módulos IEEE 802.15.4:

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

Confirme este conjunto de dados como o ativo:

> dataset commit active
Done

Chame a interface IPv6:

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

Inicie a operação do protocolo de linha de execução:

> 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

Após alguns instantes, verifique o estado do dispositivo. Deve ser o Child.

> state
child
Done

Defina a função como "Roteador".

> 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. Conectar-se à rede Thread por comissionamento seguro

Nesta sessão, adicionaremos a Board2 à rede pela comissão de segurança:

Receba o PSKc e o panid do comissário brasileiro:

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

Configure as informações da rede para Placa2:

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

Confirme este conjunto de dados como o ativo:

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

Chame a interface IPv6:

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

Acesse o eui64 no Board2:

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

No BR Commissioner, indique o comissário e especifique o eui64 do dispositivo que pode participar, além da credencial de membro (J01NME, por exemplo). A credencial de agrupamento é uma string específica do dispositivo com todos os caracteres alfanuméricos maiúsculos (0-9 e A-Y, exceto I, O, Q e Z para facilitar a leitura), com um tamanho entre 6 e 32 caracteres.

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

Mude para o Board2 Joiner. Inicie a função de associado com a credencial de Companheiro que você acabou de configurar no BR Commissioner:

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

Em aproximadamente um minuto, você receberá uma confirmação de autenticação:

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

Depois disso, inicie e entre na rede Thread formada pelo BR Commissioner.

Inicie a operação do protocolo de linha de execução:

> 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

Defina a função como "Roteador".

> 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
> 

Agora você recebe uma rede Thread com a topologia mostrada abaixo:

esp_ot_tp_LRR.jpg

7. Como dar um ping de endereço IPv6 entre nós de linha de execução

É possível usar o comando ping para estabelecer a comunicação entre dois quadros. Use o comando ipaddr para imprimir o endereço 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 exemplo, para dar um ping no Board2 MLE-ID do BR Commissioner, execute este comando no BR Commissioner:

## 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. Como transmitir mensagens entre nós da linha de execução com UDP

Nesta sessão, você aprenderá a enviar uma mensagem entre dois dispositivos Thread. Por exemplo, abra o udp e vincule-o à porta 20617 e detecte todos os endereços em BR:

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

Em seguida, envie uma mensagem da Board1 para o endereço BR MLE-ID e a porta 20617:

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

Veja a mensagem recebida no Brasil:

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

9. Parabéns!

Você criou uma rede Thread física usando placas ESP.

esp_ot_final_topology.jpg

Agora você sabe:

  • Criar e atualizar binários da CLI OpenThread para placas ESP.
  • Criação de um roteador de borda piscando para a placa do roteador de borda do Thread ESP.
  • Gerenciar manualmente os nós do Thread com o ESP Monitor e a CLI do OpenThread.
  • Formação de uma rede Thread no roteador de borda do Thread.
  • Proteger o comissionamento de dispositivos em uma rede Thread.
  • Um ping de endereço IPv6 entre nós Thread.
  • Como transmitir mensagens entre nós da linha de execução com UDP.

Leia mais

Confira openthread.io e GitHub para encontrar diversos recursos do OpenThread, incluindo:

Referência: