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 de casa conectada. A Especificação Thread define um protocolo de comunicação entre dispositivos sem fio confiável, seguro e de baixa potência baseado em IPv6 para aplicativos domésticos e comerciais.

A Espressif fez a portabilidade da pilha do OpenThread com base em FreeRTOS e LwIP, o que permitiu que os desenvolvedores criassem redes Thread rapidamente. O código-fonte relacionado pode ser encontrado no GitHub (link em inglês). Ao mesmo tempo, a 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 nós.

Espressif_hardware_setup.jpg

O que você vai aprender

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

O que é necessário

Hardware:

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

Software:

2. Primeiros passos

  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 de linha de execução ESP do ESP.

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

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

3. Criar e atualizar

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:

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

Ative o recurso de mesclagem via menuconfig:

$ idf.py menuconfig

Configuração do componente > OpenThread > Ative 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, primeiro é necessário criar o arquivo binário RCP. Esse arquivo binário RCP não precisa ser atualizado explicitamente no dispositivo na placa do roteador de borda do Thread ESP. Ela será incluída no arquivo binário do roteador de borda e atualizada no chip ESP32-H2 na primeira inicialização (ou a mudança do firmware do RCP). Veja mais detalhes nos documentos do ESP Thread BR:

$ 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 da comissão por meio do menuconfig:

$ idf.py menuconfig

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

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

4. Formar uma rede Thread no roteador de borda dele

Agora é possível 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

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

Após alguns instantes, verifique o estado do dispositivo. Ele deve ser o líder.

> state
leader
Done
> 

5. Conectar-se à rede Thread via networkkey

Neste codelab, duas placas ESP com módulos IEEE 802.15.4 estão preparadas para ingressar na rede formada por BR. Nesta sessão, adicionaremos o Board1 à rede.

Para receber a chave de rede do BR:

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

Abra a interface IPv6:

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

Inicie a operação do 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

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

> state
child
Done

Defina o papel 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. Entre na rede Thread por meio de comissionamento seguro

Nesta sessão, adicionaremos o Board2 à rede por comissionamento de segurança:

Receba a PSKc e o panid do Comissário Brasileiro:

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

Configure as informações da rede para Board2:

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

Confirme este conjunto de dados como o ativo:

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

Abra a interface IPv6:

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

Extrair eui64 do Board2:

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

Em BR Commissioner, inicie o comissário e especifique o eui64 do dispositivo que pode ser usado, além da credencial do Joiner, por exemplo, J01NME. A credencial do Joiner é uma string específica do dispositivo com todos os caracteres alfanuméricos maiúsculos (0-9 e A-Y, excluindo I, O, Q e Z para facilitar a leitura), com 6 a 32 caracteres.

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

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

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

Em cerca de um minuto, você receberá a confirmação de uma autenticação bem-sucedida:

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

Depois disso, você pode iniciar e entrar na rede Thread formada pelo BR Commissioner.

Inicie a operação do 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

Defina o papel 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ê tem uma rede Thread com a topologia mostrada abaixo:

esp_ot_tp_LRR.jpg

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

É possível usar o comando ping para a comunicação entre duas placas. Use o comando ipaddr para exibir 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:

## 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 do Thread com UDP

Nesta sessão, você vai 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 na BR:

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

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

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

Você pode ver a mensagem recebida no BR:

## 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 em placas ESP.
  • Criar um roteador de borda intermitente na placa do roteador de borda do Thread ESP.
  • Gerenciar manualmente os nós do Thread com o ESP Monitor e a CLI OpenThread.
  • Formar uma rede Thread no roteador de borda dele.
  • Proteger o comissionamento de dispositivos em uma rede Thread.
  • Ping de endereços IPv6 entre nós de linha de execução.
  • Transmitir mensagens entre nós do Thread com UDP.

Leitura adicional

Acesse openthread.io e GitHub (links em inglês) para ver uma variedade de recursos do OpenThread, incluindo:

Referência: