1. Introdução

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.

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
- Instalação do ESP-IDF.
Siga o guia de programação do ESP-IDF para instalar o ambiente de desenvolvimento de software.
- 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 >

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:

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!

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:
- Plataformas compatíveis: descubra todas as plataformas que oferecem suporte ao OpenThread.
- Criar o OpenThread: mais detalhes sobre como criar e configurar o OpenThread.
- Noções básicas do Thread: aborda todos os conceitos do Thread apresentados neste codelab.
Referência: