O ESP-NOW é um protocolo de comunicação alternativo para o ESP8266 e o ​​ESP32. Conceitos Básicos



O ESP-NOW é um protocolo WiFi simplificado para transferência de pacotes curtos entre pares de dispositivos emparelhados, desenvolvido e lançado pela Espressif em 2016.07 para os microcontroladores ESP8266 e ESP32. Ao mesmo tempo, procedimentos adicionais relacionados ao suporte ao protocolo WiFi não são usados, o que acelera o processo de troca de pacotes.

O ESP-NOW pode ser usado na Internet das Coisas para controlar fontes de luz inteligentes, relés, soquetes e outros dispositivos de controle remoto, receber informações de sensores e outras aplicações.

O ESP-NOW suporta os seguintes recursos


  • Comunicação criptografada e não criptografada entre dispositivos emparelhados.
  • Comunicação mista criptografada e não criptografada entre dispositivos emparelhados.
  • Transfira até 250 bytes de informações úteis.
  • Configurando uma função de retorno de chamada para informar a camada de aplicativo, em particular, sobre o sucesso ou falha da transmissão.


O ESP-NOW também possui os seguintes recursos e limitações.


  • Velocidade de transmissão - não mais que 1 Mbps a uma frequência de 2,4 GHz, ou seja, O ESP-NOW opera na mesma frequência e canais do seu roteador WiFi.
  • Protocolo WiFi não usado
  • Semelhante ao protocolo de baixa energia usado em um mouse sem fio de 2,4 GHz.
  • Somente o emparelhamento inicial é necessário.
  • Após o emparelhamento, a conexão não quebra.
  • A transmissão não é suportada - apenas várias distribuições para pares de dispositivos emparelhados.
  • No máximo 20 pares, incluindo os criptografados, são suportados em um dispositivo, incluindo pares criptografados.
  • No máximo 10 pares criptografados são suportados no modo Estação.
  • Máximo 6 no modo SoftAP ou SoftAP + Station.
  • A criptografia multicast não é suportada.

Segurança


O ESP-NOW adota a tecnologia de quadro IEEE802.11 Action Vendor com a função IE desenvolvida pela tecnologia de criptografia Espressif e CCMP, fornecendo uma solução de comunicação segura e sem conexão. Um dispositivo Wi-Fi suporta uma chave mestra principal (PMK) e várias chaves mestras locais (LMK)

  • O PMK é usado para criptografar o LMK usando o algoritmo AES-128.
  • O dispositivo emparelhado com LMK é usado para criptografar informações do usuário usando o CCMP. O número máximo de LMKs diferentes é 6. Se nenhum LMK estiver definido para o dispositivo emparelhado, os dados do usuário não serão criptografados.

Um nível básico de


No nível inferior do protocolo ESP_NOW, é mantida uma lista vinculada contendo informações sobre o dispositivo local e o dispositivo emparelhado, incluindo endereços e chaves MAC. O ESP-NOW também armazena dados freqüentemente usados ​​para a camada de aplicativo para evitar a sobrecarga de reprocessar a lista vinculada. As informações sobre dispositivos são usadas para enviar e receber dados e incluem

informações sobre o dispositivo local:

  • PMK : 16 bytes - a chave principal principal usada para criptografar a chave no dispositivo conectado (KOK na API) ESP_NOW suporta PMK por padrão, portanto, nenhuma configuração é necessária. Se necessário, você pode verificar se o valor PMK corresponde ao dispositivo local.
  • Modo : 1 byte - o modo do dispositivo local que define a interface WiFi de transmissão (SoftAP ou STA) ESP-NOW. O modo de dispositivo emparelhado não afeta nenhuma função, mas salva apenas as informações do modo para a camada de aplicativo. No modo STA WiFi, apenas a Estação é aplicável e o SoftAP WiFi é apenas o SoftAP.
    Modos de operação do dispositivo local ESP_NOW
    WiFi
    IDLE
    CONTROLLERSTA
    SLAVESoftAP

    COMBO&SoftAP


Informações do dispositivo emparelhado (incluindo informações usadas com frequência e outras informações do usuário):

  • LMK : 16 bytes - uma chave principal local usada para criptografar a chave de informações úteis durante a comunicação neste par.
  • MAC-: 6 — , . , Station, MAC- Station.
  • : 1 — (SoftAP STA) ESP-NOW.
  • : 1 — , , . 0..255. , . . , 0 , ; 1 ~ 14 ; , .

O Espressif não recomenda o uso de operações demoradas nas funções de retorno de chamada ao enviar / enviar pacotes, o que provavelmente está relacionado à implementação de algoritmos usando o mecanismo de interrupção. Essa suposição também é suportada pelos problemas associados à alocação dinâmica de memória nas funções de retorno de chamada, resolvidas pelo uso preferencial de variáveis ​​estáticas, bem como pela ambiguidade de usar o mecanismo de exceção MicroPython .

A implementação da assincronia dos processos de início / fim, emparelhamento, recebimento / transmissão de pacotes Espressif não é descrita, o que também não facilita a aplicação da ideologia assíncrona MicroPython .

Formato do pacote ESP-NOW


  • Cabeçalho MAC : 24 bytes.
  • Categoria : 1 byte indicando a categoria do criador do pacote. O valor está definido (127).
  • ID da organização : 3 bytes, contém um identificador exclusivo, que é os três primeiros bytes do endereço MAC usado pelo Espressif. Definir valor (0x18fe34)
  • Valor aleatório : 4 bytes, usado para proteger os dados.
  • Dados do criador do pacote : 7-255Bytes

Os dados do criador do pacote contêm os seguintes campos:

  • ID : 1 byte, defina como (221).
  • Comprimento : 1 byte, comprimento total do ID da organização, tipo, versão e dados do usuário.
  • ID da organização : 3 bytes, contém um identificador exclusivo, que é os três primeiros bytes do endereço MAC usado pelo Espressif. Definir valor (0x18fe34)
  • Tipo : 1 byte, protocolo ESP-NOW. Valor ajustado (4)
  • Versão : 1 byte, versão atual do ESP-NOW. Instalado (1)
  • Conteúdo : 0-250 bytes de dados do usuário.
  • FCS : 4 bytes, soma de verificação

Como o ESP-NOW não usa WiFi, o cabeçalho MAC é um pouco diferente do cabeçalho do pacote padrão. Os bits FromDS e ToDS do campo FrameControl são 0. O endereço de destino é especificado no primeiro campo de endereço. O segundo campo de endereço mostra o endereço de origem. O terceiro campo de endereço é definido como o endereço de broadcast (0xff: 0xff: 0xff: 0xff: 0xff: 0xff).

Algoritmo básico de aplicação


Início e fim


Antes de usar o ESP-NOW, é recomendável que você defina a interface Wi-Fi no modo desejado. Normalmente, a interface Station é definida para CONTROLLER , a interface SoftAP para SLAVE e COMBO . Também é aconselhável interromper o Wi-Fi depois de usar o ESP-NOW.

Para iniciar o ESP-NOW, chame esp_now_init () e esp_now_deinit () para concluir. Quando esp_now_deinit () é chamado , todas as informações sobre dispositivos emparelhados são excluídas.

Funções de retorno de chamada vinculativas


A função de processamento de chamadas ao enviar o pacote esp_now_register_send_cb () pode ser usada para informar o nível do aplicativo da parte remetente em um par sobre o sucesso ou falha da transmissão, por exemplo, se as informações na subcamada MAC forem transmitidas com êxito.

Ao usar esp_now_register_send_cb () , considere o seguinte:

Em um par vinculado:

  • Se a camada de aplicativo não recebeu o pacote, mas a função de retorno de chamada retornou "sucesso", o motivo pode ser:
    - ataques de um dispositivo fraudulento
    - erros de instalação de chave criptografada
    - perda de pacote no nível do aplicativo Espressif
  • Se a camada de aplicação recebeu o pacote, mas a função de retorno de chamada retorna um erro, a causa pode ser:
    - O canal está ocupado e o ACK não é recebido.

Com várias comunicações com todos os pares do dispositivo local:

  • Se o retorno de chamada retornar "sucesso", significa que o pacote foi enviado com sucesso.
  • Se a função de retorno de chamada retornar um erro, significa que o pacote não foi enviado com sucesso.

A função de processamento de chamadas após o recebimento do pacote esp_now_register_receive_cb () retorna informações, incluindo o endereço MAC do dispositivo remetente em um par e informações úteis. Também pode ser usado para informar a camada de aplicação do dispositivo de envio emparelhado com o receptor que o pacote foi recebido com sucesso.

Adicionando um par de dispositivos emparelhados


Antes de enviar dados, você deve adicionar o dispositivo à lista de pares de dispositivos emparelhados chamando esp_now_add_peer () . Antes de enviar dados para um grupo de pares estabelecidos, você deve adicionar um dispositivo com um endereço MAC multicast. O intervalo de canais de dispositivos emparelhados é de 0 a 14. Se o canal estiver definido como 0, os dados serão enviados no canal atual. Caso contrário, o canal deve ser definido como o canal no qual o dispositivo local está localizado.

Segurança


Se a chave precisar ser criptografada, você pode chamar esp_now_set_pmk () para configurá-la para definir o PMK. Se o PMK não estiver instalado, o PMK será usado por padrão e selecione a mesma chave para todos os dispositivos. Defina também o LMK para os pares selecionados.

Enviando dados com pacotes ESP-NOW


Use esp_now_send () para enviar dados do ESP-NOW . Ao mesmo tempo, a função definida anteriormente em esp_now_register_send_cb () retornará ESP_NOW_SEND_SUCCESS ao enviar uma função de retorno de chamada se os dados foram recebidos com êxito no nível MAC. Caso contrário, o ESP_NOW_SEND_FAIL retornará . Vários motivos podem fazer com que o ESP-NOW não consiga enviar dados. Em particular,

  • dispositivo de destino não existe;
  • os canais do dispositivo não coincidem;
  • os dados são perdidos durante a transmissão.

Não é garantido que a camada de aplicação aceite necessariamente dados. Se necessário, você pode enviar uma confirmação ao receber dados do ESP-NOW. Se ocorrer um tempo limite de confirmação, a transmissão de dados ESP-NOW deve ser repetida. Um número de sequência também pode ser atribuído aos dados do ESP-NOW para remover dados duplicados.

Ao enviar dados do ESP-NOW via esp_now_send (), observe que não é possível enviar mais de 250 bytes de informações por vez.

ATENÇÃO! Um intervalo muito curto entre o envio de dois pacotes ESP-NOW pode levar a erros na execução da função de retorno de chamada; portanto, é recomendável enviar o próximo pacote de dados ESP-NOW após a função de retorno de chamada concluir com êxito o processamento do envio anterior. A função de retorno de chamada é enviada a partir de uma tarefa Wi-Fi de alta prioridade. Portanto, não é recomendável executar operações longas na função de retorno de chamada. Em vez disso, você pode colocar os dados necessários em uma fila estática e processá-los a partir de um processo com prioridade mais baixa.

Se a função de envio retornar um endereço MAC, ela será enviada para o dispositivo com este endereço MAC. Se a função de envio retornar NULL, o pacote será enviado a todos os dispositivos conectados ao dispositivo de envio, o que pode levar à falha ou atraso na transmissão devido ao congestionamento da rede.

Receber dados ESP-NOW


A função de retorno de chamada também inicia em uma tarefa de Wi-Fi. Portanto, não é recomendável executar operações longas na função de retorno de chamada. Em vez disso, você pode colocar os dados necessários em uma fila estática e processá-los com um processo de prioridade mais baixa.

Em conclusão, o que precede


Minha experiência na criação do Espressif IDE e MicroPython com ESP-NOW, descrevendo os erros que encontrei durante a montagem e corrigindo -os depois de obter um resultado estável. Depois, faço uma descrição da biblioteca ESP-NOW no MicroPython com os erros detectados e maneiras de resolvê-los. Infelizmente, devido ao fato de o código fonte do ESP-NOW ser fechado e distribuído apenas em formato binário, o entendimento dos algoritmos do protocolo ESP-NOW é empírico e existem vários problemas que já foram identificados, para os quais nem sempre há opções para superá-los logicamente, mas em geral o ESP -NOW foi aplicado com sucesso na comunidade de usuários C e Pythonists com base em mais de 300 aplicativos apresentados no GitHub.

Descrição da biblioteca ESP-NOW C da Espressif

Descrição e fontes abertas do MicroPython ESP-NOW

All Articles