Está en la página 1de 11

ESP-NOW

1. DESCRIPCIÓN GENERAL

ESP-NOW es un tipo de protocolo de comunicación Wi-Fi sin conexión que es


definido por Espressif. En ESP-NOW, los datos de la aplicación se encapsulan en un
marco de acción específico del proveedor y luego se transmiten de un dispositivo Wi-
Fi a otro sin conexión. CTR con protocolo CBC-MAC (CCMP) se utiliza para proteger
el marco de acción para la seguridad. ESP-NOW es ampliamente utilizado en luz
inteligente, control remoto, sensor, etc.

2. FORMATO DE MARCO

ESP-NOW utiliza un marco de acción específico del proveedor para transmitir datos
de ESP-NOW. La velocidad de ESP-NOW predeterminada es de 1 Mbps. El formato
del marco de acción específico del proveedor es el siguiente:

Organization Vendor Specific


MAC Header Category Code Random Values FCS
Identifier Content

24 bytes 1 byte 3 bytes 4 bytes 7~255 bytes 4 bytes

 Category Code: El campo de código de categoría se establece con el valor (127)


que indica la categoría específica del proveedor.
 Organization Identifier: El identificador de organización contiene un identificador
único (0x18fe34), que son los tres primeros bytes de dirección MAC aplicados por
Espressif.
 Random Values: El valor aleatorio archivado se utiliza para evitar ataques de
retransmisión.
 Vendor Specific Content: El contenido específico del proveedor contiene campos
específicos del proveedor de la siguiente manera:

Organization
Element ID Length Type Version Body
Identifier

1 byte 1 byte 3 bytes 1 byte 1 byte 0~250 bytes

 Element ID: El campo ID de elemento se establece en el valor (221), lo que indica


el elemento específico del proveedor.
 Length: Es la longitud total del identificador de la organización, el tipo, la versión y
el cuerpo.
 Organization Identifier: El identificador de la organización contiene un
identificador único (0x18fe34), que son los primeros tres bytes de dirección MAC
aplicados por Espressif.
 Type: El campo tipo se establece en el valor (4) que indica ESP-NOW.
 Version: El campo versión se establece en la versión de ESP-NOW.
 Body: El cuerpo contiene los datos de ESP-NOW.

Como ESP-NOW no tiene conexión, el MAC Header es un poco diferente del de los
marcos estándar. Los bits FromDS y ToDS del campo FrameControl son 0. El primer
campo de dirección se establece en la dirección de destino. El segundo campo de
dirección se establece en la dirección de origen. El tercer campo de dirección se
establece en dirección de difusión (0xff:0xff:0xff:0xff:0xff:0xff).

3. SEGURIDAD

ESP-NOW utiliza el método CCMP, que se describe en IEEE Std. 802.11-2012, para
proteger el marco de acción específico del proveedor. El dispositivo Wi-Fi mantiene
una clave maestra principal (PMK, Primary Master Key) y varias claves maestras
locales (LMK, Local Master Keys). Las longitudes de PMK y LMK son de 16 bytes.
 PMK se utiliza para cifrar LMK con el algoritmo AES-128. Llame a
esp_now_set_pmk() para establecer PMK. Si PMK no está configurado, se
utilizará un PMK predeterminado.
 LMK del dispositivo emparejado se utiliza para cifrar el marco de acción
específico del proveedor con el método CCMP. El número máximo de diferentes
LMK es de seis. Si no se establece el LMK del dispositivo emparejado, no se
cifrará el marco de acción específico del proveedor.

No se admite el cifrado de tramas de acción específicas del proveedor de


multidifusión.

4. INICIALIZACIÓN Y DES INICIALIZACIÓN

Para inicializar ESP-NOW ejecutar la API esp_now_init() y para des inicializar la API
esp_now_deinit(). Los datos de ESP-NOW deben transmitirse después de iniciar el
controlador Wi-Fi, por lo que se recomienda iniciar Wi-Fi antes de inicializar ESP-
NOW y detener Wi-Fi después de desinicializar ESP-NOW. Cuando se llama a
esp_now_deinit(), se eliminará toda la información de los dispositivos emparejados.

5. AGREGAR DISPOSITIVO EMPAREJADO

Para agregar un dispositivo a la lista de dispositivos emparejados antes de enviar


datos a este dispositivo ejecutar la API esp_now_add_peer(). El número máximo de
dispositivos emparejados es de 20. Si la seguridad está habilitada, se debe
establecer el LMK. Puede enviar datos ESP-NOW a través de la interfaz Station y
SoftAP. Asegúrese de que la interfaz esté habilitada antes de enviar datos ESP-
NOW. Se debe agregar un dispositivo con una dirección MAC de difusión antes de
enviar datos de difusión. El rango del canal de 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 está el dispositivo
local.
6. ENVIO DATOS ESP-NOW

Ejecutar la API esp_now_send() para enviar datos de ESP-NOW y


esp_now_register_send_cb para registrar la función de devolución de llamada de
envío. Devolverá ESP_NOW_SEND_SUCCESS en la función de devolución de
llamada de envío si los datos se reciben correctamente en la capa MAC. De lo
contrario, volverá ESP_NOW_SEND_FAIL.Varias razones pueden llevar a que ESP-
NOW no pueda enviar datos. Por ejemplo, el dispositivo de destino no existe; los
canales de los dispositivos no son los mismos; el marco de acción se pierde al
transmitir en el aire, etc. No se garantiza que la capa de aplicación pueda recibir los
datos. Si es necesario, devuelva los datos de ack cuando reciba datos de ESP-NOW.
Si recibe tiempos de espera de datos ack, vuelva a transmitir los datos de ESP-
NOW. También se puede asignar un número de secuencia a los datos de ESP-NOW
para eliminar los datos duplicados.

Si hay muchos datos ESP-NOW para enviar, llame a esp_now_send() para enviar
menos o igual a 250 bytes de datos una vez por vez. Tenga en cuenta que un
intervalo demasiado corto entre el envío de dos datos esp-NOW puede provocar un
desorden en la función de devolución de llamada de envío. Por lo tanto, se
recomienda que se envíen los siguientes datos ESP-NOW después de que haya
regresado la función de devolución de llamada de envío del envío anterior. La
función de devolución de llamada de envío se ejecuta desde una tarea Wi-Fi de alta
prioridad. Por lo tanto, no realice operaciones prolongadas en la función de
devolución de llamada. En su lugar, publique los datos necesarios en una cola y
cálmelos desde una tarea de menor prioridad.

7. RECEPCIÓN DE DATOS DE ESP-NOW

Ejecutar la API esp_now_register_recv_cb para registrar la función de devolución


de llamada recibida. Llame a la función de devolución de llamada de recepción al
recibir ESP-NOW. La función de devolución de llamada recibida también se ejecuta
desde la tarea Wi-Fi. Por lo tanto, no realice operaciones prolongadas en la función
de devolución de llamada. En su lugar, publique los datos necesarios en una cola y
cálmelos desde una tarea de menor prioridad.

8. EJEMPLOS DE APLICACIÓN

Ejemplo de envío y recepción de datos ESP-NOW entre dos dispositivos:


wifi/espnow.

Para obtener más ejemplos de aplicación sobre cómo usar ESP-NOW, visite el
repositorio de ESP-NOW.

9. REFERENCIA DE LA API

9.1 Archivo de Encabezado

components/esp_wifi/include/esp_now.h

9.2 Funciones

esp_err_t esp_now_init (void)

Inicializa la función ESPNOW.

Return:

 ESP_OK: Éxito.
 ESP_ERR_ESPNOW_INTERNAL: Error interno.

esp_err_t esp_now_deinit (void)

Des inicializar la función ESPNOW.

Return:
ESP_OK: Éxito.

esp_err_t esp_now_get_version (uint32_t *version)

Obtiene la versión de ESPNOW.

Return:

 ESP_OK: Éxito.

 ESP_ERR_ESPNOW_ARG: Argumento no válido.

Parámetros:

 [out] version: Versión de ESPNOW.

esp_err_t esp_now_register_recv_cb (esp_now_recv_cb_t cb)

Registrar la función de devolución de llamada de recepción de datos ESPNOW.

Return:

 ESP_OK: Éxito.
 ESP_ERR_ESPNOW_NOT_INIT: ESPNOW no se inicializo.
 ESP_ERR_ESPNOW_INTERNAL: Error interno.

Parámetros:

 [in] cb: Función de devolución de llamada de recepción de datos ESPNOW.

esp_err_t esp_now_unregister_recv_cb (void)

Anular el registro de la función de devolución de llamada de recepción de datos


ESPNOW.

Return:
 ESP_OK: Éxito.
 ESP_ERR_ESPNOW_NOT_INIT: ESPNOW no se inicializo.

esp_err_t esp_now_register_send_cb (esp_now_send_cb_t cb)

Función de devolución de llamada de registro de envío de datos ESPNOW.

Return:

 ESP_OK: Éxito.
 ESP_ERR_ESPNOW_NOT_INIT: ESPNOW no se inicializo.
 ESP_ERR_ESPNOW_INTERNAL: Error interno.

Parámetros:

 [in] cb: Función de devolución de llamada de envío de datos ESPNOW

esp_err_t esp_now_unregister_send_cb (void)

Anular el registro de la función de devolución de llamada de envió de datos


ESPNOW.

Return:

 ESP_OK: Éxito.
 ESP_ERR_ESPNOW_NOT_INIT: ESPNOW no se inicializo.

esp_err_t esp_now_send (
const uint8_t *peer_addr,
const uint8_t *data,
size_t len)

Enviar datos de ESPNOW.

Atención:

1. Si peer_addr no es NULL, envíe los datos al par cuya dirección MAC coincida
con peer_addr.
2. Si peer_addr es NULL, envía los datos a todos los pares que se agregaron a la
lista de pares.
3. La longitud máxima de los datos debe ser inferior a
ESP_NOW_MAX_DATA_LEN.
4. El búfer al que apunta el argumento de datos no necesita ser válido después de
que esp_now_send devuelve.

Return:

 ESP_OK: Éxito.
 ESP_ERR_ESPNOW_NOT_INIT: ESPNOW no inicializado.
 ESP_ERR_ESPNOW_ARG: Parámetros inválidos.
 ESP_ERR_ESPNOW_INTERNAL: Error interno.
 ESP_ERR_ESPNOW_NO_MEM: Sin memoria.
 ESP_ERR_ESPNOW_NOT_FOUND: Par no encontrado.
 ESP_ERR_ESPNOW_IF: Interfaz WiFi actual no coincide con la del par.

Parámetros:

 [in]peer_addr: Dirección MAC del par.


 [in]data: Datos a enviar.
 [in]len: Longitud de los datos.

esp_err_t esp_now_add_peer (const esp_now_peer_info_t *peer)

Agregar un compañero a la lista de compañeros.

Return:

 ESP_OK: Éxito.
 ESP_ERR_ESPNOW_NOT_INIT: ESPNOW no se inicializo.
 ESP_ERR_ESPNOW_ARG: Argumento no valido.
 ESP_ERR_ESPNOW_FULL: Lista de compañeros lleno.
 ESP_ERR_ESPNOW_NO_MEM: Sin memoria.
 ESP_ERR_ESPNOW_EXIST: Compañero existente.

Parámetros:

[in] peer: Información de compañero.

9.3 Estructuras

struct esp_now_peer_info

Parámetros de información del par ESPNOW.

Miembros Públicos:
uint8_t peer_addr[ESP_NOW_ETH_ALEN]

Dirección MAC del par de ESPNOW que también es la dirección MAC de la STA o
SOFTAP.

uint8_t lmk[ESP_NOW_KEY_LEN]

Clave maestra local del par de ESPNOW que se utiliza para cifrar los datos.

uint8_t channel

Canal Wi-Fi que el par utiliza para enviar/recibir datos ESPNOW. Si el valor es 0,
utiliza el canal actual en el que se encuentra la STA o softAP. De lo contrario, debe
establecerse como el canal en el que está la STA o softAP.

wifi_interface_t ifidx

Interfaz Wi-Fi que el par utiliza para enviar/recibir datos ESPNOW.

bool encrypt

Los datos de ESPNOW que este par envía/recibe están cifrados o no.

void *priv

Datos privados del par de ESPNOW

9.4 Definiciones de Tipos

typedef struct esp_now_peer_info esp_now_peer_info_t

Parámetros de información del par ESPNOW.

typedef struct esp_now_peer_num esp_now_peer_num_t

Número de pares ESPNOW que existen actualmente.

typedef void(*esp_now_recv_cb_t) (
const uint8_t *mac_addr,
const uint8_t *data,
int data_len)

Función de devolución de llamada de recepción de datos ESPNOW.

Parámetros:
 mac_addr: Dirección MAC del compañero
 data: Datos recibidos.
 data_len: Longitud de los datos recibidos.

typedef void(*esp_now_send_cb_t) (
const uint8_t *mac_addr,
esp_now_send_status_t status,
int data_len)

Función de devolución de llamada de envío de datos ESPNOW.

Parámetros:

 mac_addr: Dirección MAC del compañero.


 status: Estado del envío de datos ESPNOW (correcto o fallido).

9.5 Enumeraciones

enum esp_now_send_status_t

Estado del envío de datos ESPNOW.

Valores:

ESP_NOW_SEND_SUCCESS = 0 Envió datos de ESPNOW correctamente.

ESP_NOW_SEND_FAIL Error al enviar datos de ESPNOW.

9.6 Macros

También podría gustarte