ESP-NOW es un protocolo de comunicación alternativo para ESP8266 y ESP32. Conceptos básicos



ESP-NOW es un protocolo WiFi simplificado para transferir paquetes cortos entre pares de dispositivos emparejados, desarrollado y lanzado por Espressif en 2016.07 para los microcontroladores ESP8266 y ESP32. Al mismo tiempo, no se utilizan procedimientos adicionales relacionados con el soporte del protocolo WiFi, lo que acelera el proceso de intercambio de paquetes.

ESP-NOW se puede usar en Internet de las cosas para controlar fuentes de luz inteligentes, relés, enchufes, otros dispositivos de control remoto, recibir información de sensores y otras aplicaciones.

ESP-NOW admite las siguientes funciones


  • Comunicación cifrada y no cifrada entre dispositivos emparejados.
  • Comunicación mixta encriptada y no encriptada entre dispositivos emparejados.
  • Transfiera hasta 250 bytes de información útil.
  • Configurar una función de devolución de llamada para informar a la capa de aplicación, en particular, sobre el éxito o el fracaso de la transmisión.


ESP-NOW también tiene las siguientes características y limitaciones.


  • Velocidad de transmisión: no más de 1 Mbps a una frecuencia de 2.4 GHz, es decir ESP-NOW funciona en la misma frecuencia y canales que su enrutador WiFi.
  • Protocolo WiFi no utilizado
  • Similar al protocolo de baja potencia utilizado en un mouse inalámbrico de 2.4 GHz.
  • Solo se requiere emparejamiento inicial.
  • Después del emparejamiento, la conexión no se rompe.
  • La transmisión no es compatible, solo distribución múltiple a pares de dispositivos emparejados.
  • Se admite un máximo de 20 pares, incluidos los cifrados, en un dispositivo, incluidos los pares cifrados.
  • Se admite un máximo de 10 pares encriptados en el modo Estación.
  • Máximo 6 en modo SoftAP o SoftAP + Station.
  • El cifrado de multidifusión no es compatible.

La seguridad


ESP-NOW adopta la tecnología de trama IEEE802.11 Action Vendor con la función IE desarrollada por Espressif y la tecnología de cifrado CCMP, que proporciona una solución de comunicación segura y sin conexión. Un dispositivo Wi-Fi admite una clave maestra principal (PMK) y varias claves maestras locales (LMK)

  • PMK se utiliza para cifrar LMK utilizando el algoritmo AES-128.
  • El dispositivo emparejado LMK se utiliza para cifrar la información del usuario mediante CCMP. El número máximo de LMK diferentes es 6. Si no se establece LMK para el dispositivo emparejado, los datos del usuario no se cifrarán.

Un nivel básico de


En el nivel inferior del protocolo ESP_NOW, se mantiene una lista vinculada que contiene información sobre el dispositivo local y el dispositivo emparejado, incluidas las direcciones MAC y las claves. ESP-NOW también almacena datos de uso frecuente para la capa de aplicación para evitar la sobrecarga de reprocesar la lista vinculada. La información sobre los dispositivos se utiliza para enviar y recibir datos e incluye

información sobre el dispositivo local:

  • PMK : 16 bytes: la clave maestra principal que se utiliza para cifrar la clave en el dispositivo conectado (KOK en la API) ESP_NOW admite PMK de forma predeterminada, por lo que no se requiere configuración. Si es necesario, puede verificar que el valor PMK coincida con el dispositivo local.
  • Modo : 1 byte: el modo de dispositivo local que define la interfaz WiFi de transmisión (SoftAP o STA) ESP-NOW. El modo de dispositivo emparejado no afecta a ninguna función, sino que solo guarda la información del modo para la capa de aplicación. En el modo STA WiFi, solo es aplicable la estación y SoftAP WiFi es solo SoftAP.
    Modos de operación del dispositivo local ESP_NOW
    WiFi
    IDLE
    CONTROLLERSTA
    SLAVESoftAP

    COMBO&SoftAP


Información del dispositivo emparejado (incluida la información de uso frecuente y otra información del usuario):

  • LMK : 16 bytes: una clave maestra local que se utiliza para cifrar la clave de información útil durante la comunicación en este par.
  • MAC-: 6 — , . , Station, MAC- Station.
  • : 1 — (SoftAP STA) ESP-NOW.
  • : 1 — , , . 0..255. , . . , 0 , ; 1 ~ 14 ; , .

Espressif no recomienda el uso de operaciones largas en las funciones de devolución de llamada al enviar / enviar paquetes, lo que presumiblemente está relacionado con la implementación de algoritmos utilizando el mecanismo de interrupción. Esta suposición también está respaldada por los problemas asociados con la asignación de memoria dinámica en las funciones de devolución de llamada, que se resuelve mediante el uso preferido de variables estáticas, así como la ambigüedad de usar el mecanismo de excepción MicroPython . No se describe la

implementación de la asincronía de los procesos de inicio / finalización, emparejamiento, recepción / transmisión de paquetes Espressif , lo que tampoco facilita la aplicación de la ideología asyncio MicroPython .

Formato del paquete ESP-NOW


  • Encabezado MAC : 24 bytes.
  • Categoría : 1 byte que indica la categoría del creador del paquete. El valor está establecido (127).
  • ID de la organización : 3 bytes, contiene un identificador único, que son los primeros tres bytes de la dirección MAC utilizada por Espressif. Valor establecido (0x18fe34)
  • Valor aleatorio : 4 bytes, utilizado para proteger datos.
  • Datos del creador del paquete : 7-255 Bytes

Los datos del creador del paquete contienen los siguientes campos:

  • ID : 1 byte, establecido en (221).
  • Longitud : 1 byte, longitud total de identificación de la organización, tipo, versión y datos del usuario.
  • ID de la organización : 3 bytes, contiene un identificador único, que son los primeros tres bytes de la dirección MAC utilizada por Espressif. Valor establecido (0x18fe34)
  • Tipo : 1 byte, protocolo ESP-NOW. Valor establecido (4)
  • Versión : 1 byte, versión actual de ESP-NOW. Instalado (1)
  • Contenido : datos de usuario de 0-250 bytes.
  • FCS : 4 bytes, suma de verificación

Como ESP-NOW no usa WiFi, el encabezado MAC es ligeramente diferente del encabezado de paquete estándar. Los bits FromDS y ToDS del campo FrameControl son 0. La dirección de destino se especifica en el primer campo de dirección. El segundo campo de dirección muestra la dirección de origen. El tercer campo de dirección se establece como la dirección de difusión (0xff: 0xff: 0xff: 0xff: 0xff: 0xff).

Algoritmo de aplicación básica


Inicio y fin


Antes de usar ESP-NOW, se recomienda que configure la interfaz Wi-Fi en el modo deseado. Por lo general, la interfaz de la estación está configurada para CONTROLLER , la interfaz SoftAP para SLAVE y COMBO . También es recomendable detener el Wi-Fi después de usar ESP-NOW.

Para iniciar ESP-NOW, llame a esp_now_init () y esp_now_deinit () para completar. Cuando se llama a esp_now_deinit () , se elimina toda la información sobre dispositivos emparejados.

Funciones de devolución de llamada vinculantes


La función de procesamiento de llamadas al enviar el paquete esp_now_register_send_cb () se puede usar para informar al nivel de la aplicación de la parte que envía en un par sobre el éxito o el fracaso de la transmisión, por ejemplo, si la información en la subcapa MAC se transmite con éxito.

Cuando use esp_now_register_send_cb () , considere lo siguiente:

En un par vinculado:

  • Si la capa de aplicación no recibió el paquete, pero la función de devolución de llamada devolvió "éxito", la razón podría ser:
    - ataques desde un dispositivo fraudulento
    - errores de instalación de claves cifradas
    - pérdida de paquetes en el nivel de aplicación Espressif
  • Si la capa de aplicación recibió el paquete, pero la función de devolución de llamada devuelve un error, la causa puede ser:
    - El canal está ocupado y no se recibe el ACK.

Con comunicación múltiple con todos los pares del dispositivo local:

  • Si la devolución de llamada devuelve "éxito", significa que el paquete se envió correctamente.
  • Si la función de devolución de llamada devuelve un error, significa que el paquete no se envió correctamente.

La función de procesamiento de llamadas al recibir el paquete esp_now_register_receive_cb () devuelve información que incluye la dirección MAC del dispositivo emisor en un par e información útil. También se puede utilizar para informar a la capa de aplicación del dispositivo de envío emparejado con el receptor que el paquete se recibió con éxito.

Agregar un par de dispositivos emparejados


Antes de enviar datos, debe agregar el dispositivo a la lista de pares de dispositivos emparejados llamando a esp_now_add_peer () . Antes de enviar datos a un grupo de pares establecidos, debe agregar un dispositivo con una dirección MAC de multidifusión. El rango de canales de los dispositivos emparejados es de 0 a 14. Si el canal se establece en 0, los datos se enviarán en el canal actual. De lo contrario, el canal debe establecerse como el canal en el que se encuentra el dispositivo local.

La seguridad


Si la clave necesita ser encriptada, puede llamar a esp_now_set_pmk () para configurarla para configurar PMK. Si PMK no está instalado, PMK se usará de manera predeterminada y seleccionará la misma clave para todos los dispositivos. También configure LMK para los pares seleccionados.

Envío de datos con paquetes ESP-NOW


Use esp_now_send () para enviar datos ESP-NOW . Al mismo tiempo, la función establecida anteriormente en esp_now_register_send_cb () devolverá ESP_NOW_SEND_SUCCESS al enviar una función de devolución de llamada si los datos se recibieron con éxito en el nivel MAC. De lo contrario, ESP_NOW_SEND_FAIL volverá . Varias razones pueden hacer que ESP-NOW no pueda enviar datos. En particular,

  • el dispositivo de destino no existe;
  • los canales del dispositivo no coinciden;
  • los datos se pierden durante la transmisión.

No se garantiza que la capa de aplicación necesariamente acepte datos. Si es necesario, puede enviar una confirmación cuando reciba datos de ESP-NOW. Si se produce un tiempo de espera de confirmación, la transmisión de datos ESP-NOW debe repetirse. También se puede asignar un número de secuencia a los datos ESP-NOW para eliminar datos duplicados.

Al enviar datos ESP-NOW a través de esp_now_send (), tenga en cuenta que no se pueden enviar más de 250 bytes de información a la vez.

¡ATENCIÓN! Un intervalo demasiado corto entre el envío de dos paquetes ESP-NOW puede conducir a errores en la ejecución de la función de devolución de llamada, por lo tanto, se recomienda enviar el siguiente paquete de datos ESP-NOW después de que la función de devolución de llamada haya completado con éxito el procesamiento del envío anterior. La función de devolución de llamada se envía desde una tarea de Wi-Fi de alta prioridad. Por lo tanto, no se recomienda realizar operaciones largas en la función de devolución de llamada. En su lugar, puede colocar los datos necesarios en una cola estática y procesarlos desde un proceso con una prioridad más baja.

Si la función de envío devuelve una dirección MAC, se enviará al dispositivo con esta dirección MAC. Si la función de envío devuelve NULL, el paquete se enviará a todos los dispositivos conectados al remitente, lo que puede provocar fallas o retrasos en la transmisión debido a la congestión de la red.

ESP-NOW recibe datos


La función de devolución de llamada también comienza desde una tarea de Wi-Fi. Por lo tanto, no se recomienda realizar operaciones largas en la función de devolución de llamada. En su lugar, puede colocar los datos necesarios en una cola estática y procesarlos con un proceso de menor prioridad.

En conclusión, lo anterior


Mi experiencia en la construcción de Espressif IDE y MicroPython con ESP-NOW, describiendo los errores que encontré durante el ensamblaje y los solucionaré después de lograr un resultado estable. Luego, haré una descripción de la biblioteca ESP-NOW en MicroPython con los errores detectados y las formas de resolverlos. Desafortunadamente, debido al hecho de que el código fuente de ESP-NOW está cerrado y se distribuye solo en forma binaria, la comprensión de los algoritmos del protocolo ESP-NOW es empírica y hay una serie de problemas que ya se han identificado, para los cuales no siempre hay opciones para superarlos lógicamente, pero en general ESP -NOW se ha aplicado con éxito en la comunidad de usuarios de C y Pythonists en base a más de 300 aplicaciones presentadas en GitHub.

Descripción de la biblioteca ESP-NOW C de Espressif

MicroPython ESP-NOW Descripción y fuentes abiertas

All Articles