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® (em inglês) projetado para acelerar o desenvolvimento de produtos para a casa conectada. A especificação do Thread define um protocolo de comunicação sem fio confiável, seguro e de baixo consumo de energia entre dispositivos com base em IPv6 para aplicações em casas e edifícios comerciais.

A Espressif portou a pilha OpenThread com base no FreeRTOS e no LwIP, permitindo que os desenvolvedores criem redes Thread rapidamente. O código-fonte relacionado pode ser obtido no GitHub. Ao mesmo tempo, a Espressif também implementou um roteador de borda Thread com base no 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

  • Como criar e gravar binários da CLI OpenThread em placas ESP.
  • Criando e gravando o roteador de borda na placa do roteador de borda do Thread ESP.
  • Gerenciar manualmente nós do Thread com o ESP Monitor e a CLI OpenThread.
  • Formar uma rede Thread no roteador de borda do Thread.
  • Proteção do provisionamento de dispositivos em uma rede Thread.
  • Ping de endereço IPv6 entre nós do Thread.
  • Passar mensagens entre nós de encadeamento com UDP.

O que é necessário

Hardware:

  • 2 placas ESP com módulos IEEE 802.15.4.
  • 1 placa de 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 (link em inglês) para instalar o ambiente de desenvolvimento de software.

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

ESP-THREAD-BR é o SDK oficial do roteador de borda do Thread 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 gravar 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 junção usando o menuconfig:

$ idf.py menuconfig

Configuração do componente > OpenThread > Ativar Joiner. Depois, crie e faça o flash.

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

Para criar e atualizar o arquivo binário ot-br na placa ESP Thread Border Router, primeiro crie o arquivo binário RCP. Não é necessário fazer o flash explícito desse arquivo binário RCP no dispositivo na placa do roteador de borda do Thread ESP. Ele será incluído no arquivo binário do roteador de borda e gravado no chip ESP32-H2 na primeira inicialização (ou quando o firmware do RCP for alterado). 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 de comissário usando o menuconfig:

$ idf.py menuconfig

Configuração do componente > OpenThread > Ativar o Commissioner e, em seguida, crie e faça o flash.

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

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

Faça o commit desse conjunto de dados como o ativo:

> dataset commit active
Done

Ative a interface IPv6:

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

Iniciar operação do protocolo de conversa:

> 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 precisa ser o líder.

> state
leader
Done
> 

5. Entrar na rede Thread usando a networkkey

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

Extraia a networkkey do BR:

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

Defina essa networkkey para uma placa ESP (Board1 Joiner) com módulos IEEE 802.15.4:

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

Faça o commit desse conjunto de dados como o ativo:

> dataset commit active
Done

Ative a interface IPv6:

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

Iniciar operação do protocolo de conversa:

> 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 a criança.

> 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. Participar da rede Thread por comissionamento seguro

Nesta sessão, vamos adicionar o Board2 à rede usando o provisionamento de segurança:

Receba o PSKc e o panid do BR Commissioner:

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

Configure as informações de rede para o Board2:

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

Faça o commit desse conjunto de dados como o ativo:

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

Ative a interface IPv6:

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

Acesse o eui64 do Board2:

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

No BR Commissioner, inicie o comissário e especifique o eui64 do dispositivo que pode participar, junto com a credencial de junção, por exemplo, J01NME. A credencial do associador é uma string específica do dispositivo com todos os caracteres alfanuméricos maiúsculos (0 a 9 e A a Y, exceto I, O, Q e Z para facilitar a leitura), com um comprimento 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 participante com a credencial de participante que você acabou de configurar no comissário do BR:

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

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

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

Depois disso, é possível iniciar e participar da rede Thread formada pelo BR Commissioner.

Iniciar operação do protocolo de conversa:

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

esp_ot_tp_LRR.jpg

7. Como dar um ping no endereço IPv6 entre nós do Thread

Você pode usar o comando ping para se comunicar entre duas placas. 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 fazer ping do MLE-ID do Board2 no 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 de encadeamento com UDP

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

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

Em seguida, envie uma mensagem do Board1 para o endereço e a porta BR MLE-ID 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:

  • Como criar e gravar binários da CLI OpenThread em placas ESP.
  • Como criar e programar um roteador de borda para a placa ESP Thread Border Router.
  • Gerenciar manualmente nós do Thread com o ESP Monitor e a CLI OpenThread.
  • Formar uma rede Thread no roteador de borda do Thread.
  • Proteção do provisionamento de dispositivos em uma rede Thread.
  • Ping de endereço IPv6 entre nós do Thread.
  • Passar mensagens entre nós de encadeamento com UDP.

Leitura adicional

Confira openthread.io e GitHub para acessar vários recursos do OpenThread, incluindo:

Referência: