ESP-NOW est un protocole de communication alternatif pour ESP8266 et ESP32. Concepts de base



ESP-NOW est un protocole WiFi simplifié pour le transfert de paquets courts entre des paires d'appareils couplés, développé et publié par Espressif en 2016.07 pour les microcontrôleurs ESP8266 et ESP32. Dans le même temps, les procédures supplémentaires liées à la prise en charge du protocole WiFi ne sont pas utilisées, ce qui accélère le processus d'échange de paquets.

ESP-NOW peut être utilisé sur l'Internet des objets pour contrôler des sources lumineuses intelligentes, des relais, des prises, d'autres dispositifs de télécommande, recevoir des informations de capteurs et d'autres applications.

ESP-NOW prend en charge les fonctionnalités suivantes


  • Communication cryptée et non cryptée entre les appareils couplés.
  • Communication mixte cryptée et non cryptée entre les appareils couplés.
  • Transférez jusqu'à 250 octets d'informations utiles.
  • Mise en place d'une fonction de rappel pour informer la couche application, notamment, du succès ou de l'échec de la transmission.


ESP-NOW présente également les fonctionnalités et limitations suivantes.


  • Vitesse de transmission - pas plus de 1 Mbps à une fréquence de 2,4 GHz, c'est-à-dire ESP-NOW fonctionne sur la même fréquence et les mêmes canaux que votre routeur WiFi.
  • Protocole WiFi non utilisé
  • Similaire au protocole basse consommation utilisé dans une souris sans fil 2,4 GHz.
  • Seul le couplage initial est requis.
  • Après le couplage, la connexion ne se rompt pas.
  • La diffusion n'est pas prise en charge - seule la distribution multiple aux paires d'appareils couplés.
  • Un maximum de 20 paires, y compris celles cryptées, sont prises en charge sur un seul appareil, y compris les paires cryptées.
  • Un maximum de 10 paires chiffrées sont prises en charge en mode Station.
  • Maximum 6 en mode SoftAP ou SoftAP + Station.
  • Le chiffrement multidiffusion n'est pas pris en charge.

sécurité


ESP-NOW adopte la technologie de trame IEEE802.11 Action Vendor avec la fonction IE développée par Espressif et la technologie de cryptage CCMP, fournissant une solution de communication sécurisée et sans connexion. Un appareil Wi-Fi prend en charge une clé principale principale (PMK) et plusieurs clés principales locales (LMK)

  • PMK est utilisé pour chiffrer LMK à l'aide de l'algorithme AES-128.
  • Le périphérique couplé LMK est utilisé pour crypter les informations utilisateur à l'aide de CCMP. Le nombre maximal de LMK différents est de 6. Si aucun LMK n'est défini pour le périphérique couplé, les données utilisateur ne seront pas cryptées.

Un niveau de base de


Au niveau inférieur du protocole ESP_NOW, une liste liée est conservée contenant des informations sur le périphérique local et le périphérique couplé, y compris les adresses MAC et les clés. ESP-NOW stocke également les données fréquemment utilisées pour la couche application pour éviter les frais généraux de retraitement de la liste liée. Les informations sur les appareils sont utilisées pour envoyer et recevoir des données et incluent des

informations sur l'appareil local:

  • PMK : 16 octets - la clé principale principale utilisée pour chiffrer la clé sur le périphérique connecté (KOK dans l'API) ESP_NOW prend en charge PMK par défaut, donc aucune configuration n'est requise. Si nécessaire, vous pouvez vérifier que la valeur PMK correspond au périphérique local.
  • Mode : 1 octet - le mode d'appareil local qui définit l'interface WiFi de transmission (SoftAP ou STA) ESP-NOW. Le mode d'appareil couplé n'affecte aucune fonction, mais enregistre uniquement les informations de mode pour la couche application. En mode WiFi STA, seule Station est applicable et SoftAP WiFi n'est que SoftAP.
    Modes de fonctionnement de l'appareil local ESP_NOW
    WiFi
    IDLE
    CONTROLLERSTA
    SLAVESoftAP

    COMBO&SoftAP


Informations sur l' appareil couplé (y compris les informations fréquemment utilisées et d'autres informations sur l'utilisateur):

  • LMK : 16 octets - une clé principale locale qui est utilisée pour crypter la clé des informations utiles lors de la communication dans cette paire.
  • MAC-: 6 — , . , Station, MAC- Station.
  • : 1 — (SoftAP STA) ESP-NOW.
  • : 1 — , , . 0..255. , . . , 0 , ; 1 ~ 14 ; , .

Espressif ne recommande pas l'utilisation d'opérations longues dans les fonctions de rappel lors de l'envoi / l'envoi de paquets, ce qui est vraisemblablement lié à la mise en œuvre d'algorithmes utilisant le mécanisme d'interruption. Cette hypothèse est également soutenue par les problèmes associés à l'allocation dynamique de mémoire dans les fonctions de rappel, qui sont résolus par l'utilisation préférée de variables statiques, ainsi que par l'ambiguïté de l'utilisation du mécanisme d' exception MicroPython .

L'implémentation de l'asynchronie des processus de début / fin, appariement, réception / transmission de paquets Espressif n'est pas décrite, ce qui ne facilite pas non plus l'application de l'idéologie asyncio MicroPython .

Format de package ESP-NOW


  • En - tête MAC : 24 octets.
  • Catégorie : 1 octet indiquant la catégorie du créateur du package. La valeur est définie (127).
  • ID d'organisation : 3 octets, contient un identifiant unique, qui est les trois premiers octets de l'adresse MAC utilisée par Espressif. Définir la valeur (0x18fe34)
  • Valeur aléatoire : 4 octets, utilisée pour protéger les données.
  • Données du créateur du package : 7-255 octets

Les données du créateur de package contiennent les champs suivants:

  • ID : 1 octet, réglé sur (221).
  • Longueur : 1 octet, longueur totale de l'ID de l'organisation, type, version et données utilisateur.
  • ID d'organisation : 3 octets, contient un identifiant unique, qui est les trois premiers octets de l'adresse MAC utilisée par Espressif. Définir la valeur (0x18fe34)
  • Type : 1 octet, protocole ESP-NOW. Valeur de consigne (4)
  • Version : 1 octet, version actuelle d'ESP-NOW. Installé (1)
  • Contenu : 0-250 octets de données utilisateur.
  • FCS : 4 octets, somme de contrôle

Étant donné que ESP-NOW n'utilise pas le WiFi, l'en-tête MAC est légèrement différent de l'en-tête de paquet standard. Les bits FromDS et ToDS du champ FrameControl sont 0. L'adresse de destination est spécifiée dans le premier champ d'adresse. Le deuxième champ d'adresse affiche l'adresse source. Le troisième champ d'adresse est défini comme adresse de diffusion (0xff: 0xff: 0xff: 0xff: 0xff: 0xff).

Algorithme d'application de base


Début et fin


Avant d'utiliser ESP-NOW, il est recommandé de régler l'interface Wi-Fi dans le mode souhaité. En règle générale, l'interface Station est définie pour CONTROLLER , l'interface SoftAP pour SLAVE et COMBO . Il est également conseillé d'arrêter le Wi-Fi après avoir utilisé ESP-NOW.

Pour démarrer ESP-NOW, appelez esp_now_init () et esp_now_deinit () pour terminer. Lorsque esp_now_deinit () est appelé , toutes les informations sur les appareils couplés sont supprimées.

Fonctions de rappel de liaison


La fonction de traitement d'appel lors de l'envoi du paquet esp_now_register_send_cb () peut être utilisée pour informer le niveau d'application de l'expéditeur dans une paire du succès ou de l'échec de la transmission, par exemple, si les informations sur la sous-couche MAC sont transmises avec succès.

Lorsque vous utilisez esp_now_register_send_cb () , tenez compte des éléments suivants:

Dans une paire liée:

  • Si la couche application n'a pas reçu le paquet, mais que la fonction de rappel a renvoyé "succès", la raison pourrait être:
    - les attaques d'un appareil frauduleux
    - les erreurs d'installation de clé cryptée
    - la perte de paquet au niveau de l'application Espressif
  • Si la couche application a reçu le paquet, mais que la fonction de rappel renvoie une erreur, la cause peut être:
    - Le canal est occupé et l'ACK n'est pas reçu.

Avec plusieurs communications avec toutes les paires de l'appareil local:

  • Si le rappel renvoie «succès», cela signifie que le paquet a été envoyé avec succès.
  • Si la fonction de rappel renvoie une erreur, cela signifie que le paquet n'a pas été envoyé avec succès.

La fonction de traitement des appels lors de la réception du paquet esp_now_register_receive_cb () renvoie des informations comprenant l'adresse MAC du périphérique émetteur dans une paire et des informations utiles. Il peut également être utilisé pour informer la couche application du périphérique émetteur associé au récepteur que le paquet a été reçu avec succès.

Ajout d'une paire d'appareils couplés


Avant d'envoyer des données, vous devez ajouter le périphérique à la liste des paires de périphériques couplés en appelant esp_now_add_peer () . Avant d'envoyer des données à un groupe de paires établies, vous devez ajouter un périphérique avec une adresse MAC de multidiffusion. La plage de canaux des appareils couplés va de 0 à 14. Si le canal est réglé sur 0, les données seront envoyées sur le canal actuel. Sinon, le canal doit être défini comme le canal sur lequel se trouve le périphérique local.

sécurité


Si la clé doit être chiffrée, vous pouvez appeler esp_now_set_pmk () pour la configurer pour définir PMK. Si PMK n'est pas installé, PMK sera utilisé par défaut et sélectionnera la même clé pour tous les appareils. Définissez également LMK pour les paires sélectionnées.

Envoi de données avec les packages ESP-NOW


Utilisez esp_now_send () pour envoyer des données ESP-NOW . Dans le même temps, la fonction définie précédemment dans esp_now_register_send_cb () renverra ESP_NOW_SEND_SUCCESS lors de l'envoi d'une fonction de rappel si les données ont été reçues avec succès au niveau MAC. Sinon, ESP_NOW_SEND_FAIL reviendra . Plusieurs raisons peuvent empêcher ESP-NOW d'envoyer des données. En particulier,

  • le périphérique cible n'existe pas;
  • les canaux de l'appareil ne correspondent pas;
  • les données sont perdues pendant la transmission.

Il n'est pas garanti que la couche application accepte nécessairement les données. Si nécessaire, vous pouvez envoyer une confirmation lorsque vous recevez des données ESP-NOW. Si un délai de confirmation se produit, la transmission des données ESP-NOW doit être répétée. Un numéro de séquence peut également être attribué aux données ESP-NOW pour supprimer les données en double.

Lors de l'envoi de données ESP-NOW via esp_now_send (), veuillez noter que pas plus de 250 octets d'informations peuvent être envoyés à la fois.

ATTENTION! Un intervalle trop court entre l'envoi de deux paquets ESP-NOW peut entraîner des erreurs dans l'exécution de la fonction de rappel, il est donc recommandé d'envoyer le prochain paquet de données ESP-NOW une fois que la fonction de rappel a terminé avec succès le traitement de l'envoi précédent. La fonction de rappel est envoyée à partir d'une tâche Wi-Fi de haute priorité. Par conséquent, il n'est pas recommandé d'effectuer de longues opérations dans la fonction de rappel. Au lieu de cela, vous pouvez placer les données nécessaires dans une file d'attente statique et les traiter à partir d'un processus avec une priorité inférieure.

Si la fonction d'envoi renvoie une adresse MAC, celle-ci sera envoyée à l'appareil avec cette adresse MAC. Si la fonction d'envoi retourne NULL, le paquet sera envoyé à tous les périphériques attachés à celui d'envoi, ce qui peut entraîner une défaillance ou un retard de transmission en raison de l'encombrement du réseau.

ESP-NOW Recevoir des données


La fonction de rappel démarre également à partir d'une tâche Wi-Fi. Par conséquent, il n'est pas recommandé d'effectuer de longues opérations dans la fonction de rappel. Au lieu de cela, vous pouvez placer les données nécessaires dans une file d'attente statique et les traiter avec un processus de priorité inférieure.

En conclusion, ce qui précède


Mon expérience dans la construction de Espressif IDE et MicroPython avec ESP-NOW, décrivant les erreurs que j'ai rencontrées lors de l'assemblage et allant les corriger après avoir obtenu un résultat stable. Ensuite, je ferai une description de la bibliothèque ESP-NOW sur MicroPython avec les erreurs détectées et les moyens de les résoudre. Malheureusement, étant donné que le code source d'ESP-NOW est fermé et distribué uniquement sous forme binaire, la compréhension des algorithmes du protocole ESP-NOW est empirique et il existe un certain nombre de problèmes qui ont déjà été identifiés, pour lesquels il n'y a pas toujours des options pour les surmonter logiquement, mais en général ESP -NOW a été appliqué avec succès dans la communauté des utilisateurs C et des pythonistes sur la base de plus de 300 applications présentées sur GitHub.

Description de la bibliothèque ESP-NOW C par Espressif

Description de MicroPython ESP-NOW et sources ouvertes

All Articles