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 para casas conectadas. A Especificação Thread define um protocolo de comunicação sem fio entre dispositivos, confiável, seguro e de baixo consumo de energia baseado em IPv6 para aplicativos de construção doméstica e comercial.
O Espressif fez a portabilidade da pilha OpenThread com base em FreeRTOS e LwIP, permitindo que os desenvolvedores criem rapidamente redes Thread. O código-fonte relacionado pode ser encontrado no GitHub. Ao mesmo tempo, o 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 os nós.
Conteúdo
- Criar e atualizar binários da CLI OpenThread para placas ESP.
- Criar e atualizar o roteador de borda na placa do roteador de borda do Thread ESP.
- Gerenciar manualmente os nós do Thread com o ESP Monitor e a CLI do OpenThread.
- Formação de uma rede Thread no roteador de borda do Thread.
- Proteger o comissionamento de dispositivos em uma rede Thread.
- Um ping de endereço IPv6 entre nós Thread.
- Como transmitir mensagens entre nós da linha de execução com UDP.
Pré-requisitos
Hardware:
- Duas placas ESP com módulos IEEE 802.15.4.
- 1 Placa de roteador de borda do Thread ESP.
Software:
2. Como começar
- 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-OUTPUT-BR é o SDK oficial do roteador de borda de Thread do ESP. Ele oferece suporte a todos os recursos de rede fundamentais para criar um roteador de borda Thread e integra recursos avançados no nível do produto para uma produtividade rápida.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Criação e atualização
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 agrupamento via menuconfig:
$ idf.py menuconfig
Configuração do componente > OpenThread > Ativar 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, é necessário criar o arquivo binário RCP primeiro. Esse arquivo binário RCP não precisa ser explicitamente atualizado no dispositivo na placa do roteador de borda do Thread do ESP. Ele será incluído no arquivo binário do roteador de borda e atualizado no chip ESP32-H2 na primeira inicialização (ou quando o firmware do RCP mudar). 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 do Comissário via menuconfig:
$ idf.py menuconfig
Configuração do componente > OpenThread > Ativar 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 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
Chame 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 de linha de execução:
> 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. Tem que ser o Líder.
> state leader Done >
5. Conectar-se à rede Thread via chave de rede
Neste codelab, duas placas ESP com módulos IEEE 802.15.4 estão preparadas para entrar na rede formada BR. Nesta sessão, vamos adicionar a Board1 à rede.
Consulte a chave de rede no Brasil:
## 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
Chame a interface IPv6:
> ifconfig up Done I (20308) OT_STATE: netif up
Inicie a operação do protocolo de linha de execução:
> 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 Child.
> 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. Conectar-se à rede Thread por comissionamento seguro
Nesta sessão, adicionaremos a Board2 à rede pela comissão de segurança:
Receba o PSKc e o panid do comissário brasileiro:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Configure as informações da rede para Placa2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Confirme este conjunto de dados como o ativo:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Chame a interface IPv6:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Acesse o eui64 no Board2:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
No BR Commissioner, indique o comissário e especifique o eui64
do dispositivo que pode participar, além da credencial de membro (J01NME
, por exemplo). A credencial de agrupamento é uma string específica do dispositivo com todos os caracteres alfanuméricos maiúsculos (0-9 e A-Y, exceto I, O, Q e Z para facilitar a leitura), com um tamanho 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 associado com a credencial de Companheiro que você acabou de configurar no BR Commissioner:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
Em aproximadamente um minuto, você receberá uma confirmação de autenticação:
## Board2 Joiner ## ---------------------- > Join success
Depois disso, inicie e entre na rede Thread formada pelo BR Commissioner.
Inicie a operação do protocolo de linha de execução:
> 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ê recebe uma rede Thread com a topologia mostrada abaixo:
7. Como dar um ping de endereço IPv6 entre nós de linha de execução
É possível usar o comando ping para estabelecer a comunicação entre dois quadros. 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 Board2 MLE-ID do 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 da linha de execução com UDP
Nesta sessão, você 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 em 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 Board1 para o endereço BR MLE-ID e a porta 20617
:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Veja a mensagem recebida no Brasil:
## 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 para placas ESP.
- Criação de um roteador de borda piscando para a placa do roteador de borda do Thread ESP.
- Gerenciar manualmente os nós do Thread com o ESP Monitor e a CLI do OpenThread.
- Formação de uma rede Thread no roteador de borda do Thread.
- Proteger o comissionamento de dispositivos em uma rede Thread.
- Um ping de endereço IPv6 entre nós Thread.
- Como transmitir mensagens entre nós da linha de execução com UDP.
Leia mais
Confira openthread.io e GitHub para encontrar diversos 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
- Thread Primer: aborda todos os conceitos do Thread apresentados neste codelab.
Referência: