1. Introdução

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.

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

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:

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.

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:
- Plataformas compatíveis: descubra todas as plataformas que oferecem suporte ao OpenThread.
- Criar o OpenThread: mais detalhes sobre como criar e configurar o OpenThread.
- Fundamentos de linhas de execução: aborda todos os conceitos de linhas de execução apresentados neste codelab.
Referência: