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

1. Introdução

26b7f4f6b3ea0700.png

OpenThread, lançado pela equipe do Google Nest, é uma implementação de código aberto do protocolo de rede Thread® 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 baixa potência baseado em IPv6 para aplicações domésticas e comerciais.

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 acessado no GitHub. Ao mesmo tempo, a Espressif também implementou um roteador de borda do 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 atualizar binários da CLI do OpenThread para placas ESP.
  • Como criar e atualizar o roteador de borda para a placa de roteador de borda do Thread ESP.
  • Como gerenciar manualmente nós do Thread com o ESP Monitor e a CLI do OpenThread.
  • Como formar uma rede Thread no roteador de borda do Thread.
  • Como proteger o comissionamento de dispositivos em uma rede Thread.
  • Como dar um ping no endereço IPv6 entre nós do Thread.
  • Como 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 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 para instalar o ambiente de desenvolvimento de software.

  1. Clone o SDK do roteador de borda do 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 de nível de 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 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

Component config > OpenThread > Enable 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 de 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 para o dispositivo na placa de roteador de borda do Thread ESP. Ele será incluído no arquivo binário do roteador de borda e atualizado para o chip ESP32-H2 na primeira inicialização (ou o firmware RCP será 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 comissionamento usando o menuconfig:

$ idf.py menuconfig

Component config > OpenThread > Enable 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 do OpenThread na placa de roteador de borda do Thread ESP (comissionário de BR):

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

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 um momento, verifique o estado do dispositivo. Ele precisa ser o líder.

> state
leader
Done
> 

5. Como participar da rede Thread usando a chave de rede

Neste codelab, duas placas ESP com módulos IEEE 802.15.4 são preparadas para participar da rede formada pelo BR. Nesta sessão, vamos adicionar a placa 1 à rede.

Receba a chave de rede do BR:

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

Defina essa chave de rede para uma placa ESP (participante da placa 1) com módulos IEEE 802.15.4:

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

Confirme esse conjunto de dados como o ativo:

> dataset commit active
Done

Ative 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 um momento, verifique o estado do dispositivo. Ele precisa ser o filho.

> state
child
Done

Defina o papel como extensor de malha (referido como router na CLI e nos registros).

> 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. Como participar da rede Thread usando o comissionamento seguro

Nesta sessão, vamos adicionar a placa 2 à rede usando o comissionamento de segurança:

Receba o PSKc e o panid do comissionário de BR:

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

Configure as informações de rede para a placa 2:

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

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

Receba o eui64 da placa 2:

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

No comissionário de BR, inicie o comissionário e especifique o eui64 do dispositivo que pode participar, junto com a credencial do participante, por exemplo, J01NME. A credencial do participante é uma string específica do dispositivo de todos os caracteres alfanuméricos em maiúsculas (0-9 e A-Y, excluindo I, O, Q e Z para legibilidade), 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 participante da placa 2. Inicie o papel de participante com a credencial do participante que você acabou de configurar no comissionário de BR:

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

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

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

Depois disso, você pode iniciar e participar da rede Thread formada pelo comissionário de BR.

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 extensor de malha (referido como router na CLI e nos registros).

> 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 dar um ping no MLE-ID da placa 2 do comissionário de BR, execute este comando no comissionário de BR:

## 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 ouça todos os endereços no 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 placa 1 para o endereço e a porta 20617 do MLE-ID do BR:

## 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 atualizar binários da CLI do OpenThread para placas ESP.
  • Como criar e atualizar o roteador de borda para a placa de roteador de borda do Thread ESP.
  • Como gerenciar manualmente nós do Thread com o ESP Monitor e a CLI do OpenThread.
  • Como formar uma rede Thread no roteador de borda do Thread.
  • Como proteger o comissionamento de dispositivos em uma rede Thread.
  • Como dar um ping no endereço IPv6 entre nós do Thread.
  • Como transmitir mensagens entre nós do Thread com UDP.

Leitura adicional

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

Referência: