1. Introdução
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.
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
- 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 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 >
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:
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.
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:
- Plataformas compatíveis: descubra todas as plataformas compatíveis com o OpenThread
- Build OpenThread: mais detalhes sobre a criação e a configuração do OpenThread
- Thread Primer: abrange todos os conceitos do Thread apresentados neste codelab.
Referência: