ESP-NOW ist ein alternatives Kommunikationsprotokoll für ESP8266 und ESP32. Grundlegendes Konzept



ESP-NOW ist ein vereinfachtes WiFi-Protokoll zum Übertragen kurzer Pakete zwischen gepaarten Gerätepaaren , das von Espressif im Jahr 2016.07 für die Mikrocontroller ESP8266 und ESP32 entwickelt und veröffentlicht wurde . Gleichzeitig werden keine zusätzlichen Verfahren zur Unterstützung des WLAN-Protokolls verwendet, was den Austausch von Paketen beschleunigt.

ESP-NOW kann im Internet der Dinge verwendet werden, um intelligente Lichtquellen, Relais, Steckdosen und andere Fernbedienungsgeräte zu steuern und Informationen von Sensoren und anderen Anwendungen zu empfangen.

ESP-NOW unterstützt die folgenden Funktionen


  • Verschlüsselte und unverschlüsselte Kommunikation zwischen gekoppelten Geräten.
  • Gemischte verschlüsselte und unverschlüsselte Kommunikation zwischen gekoppelten Geräten.
  • Übertragen Sie bis zu 250 Byte nützliche Informationen.
  • Einrichten einer Rückruffunktion, um die Anwendungsschicht insbesondere über den Erfolg oder Misserfolg der Übertragung zu informieren.


ESP-NOW bietet außerdem die folgenden Funktionen und Einschränkungen.


  • Übertragungsgeschwindigkeit - nicht mehr als 1 Mbit / s bei einer Frequenz von 2,4 GHz, d.h. ESP-NOW arbeitet auf derselben Frequenz und denselben Kanälen wie Ihr WLAN-Router.
  • WiFi-Protokoll nicht verwendet
  • Ähnlich dem Low-Power-Protokoll einer drahtlosen 2,4-GHz-Maus.
  • Es ist nur eine anfängliche Paarung erforderlich.
  • Nach dem Pairing wird die Verbindung nicht unterbrochen.
  • Broadcast wird nicht unterstützt - nur Mehrfachverteilung an gekoppelte Gerätepaare.
  • Auf einem Gerät werden maximal 20 Paare, einschließlich verschlüsselter Paare, unterstützt, einschließlich verschlüsselter Paare.
  • Im Stationsmodus werden maximal 10 verschlüsselte Paare unterstützt.
  • Maximal 6 im SoftAP- oder SoftAP + Station-Modus.
  • Multicast-Verschlüsselung wird nicht unterstützt.

Sicherheit


ESP-NOW verwendet die IEEE 802.11 Action Vendor-Rahmentechnologie mit der von Espressif und der CCMP-Verschlüsselungstechnologie entwickelten IE-Funktion und bietet eine sichere, verbindungsfreie Kommunikationslösung. Ein Wi-Fi-Gerät unterstützt einen primären Hauptschlüssel (PMK) und mehrere lokale Hauptschlüssel (LMK).

  • PMK wird verwendet, um LMK mit dem AES-128-Algorithmus zu verschlüsseln.
  • Das gekoppelte LMK- Gerät wird zum Verschlüsseln von Benutzerinformationen mithilfe von CCMP verwendet. Die maximale Anzahl verschiedener LMKs beträgt 6. Wenn für das gekoppelte Gerät kein LMK festgelegt ist, werden Benutzerdaten nicht verschlüsselt.

Eine Grundstufe von


Auf der unteren Ebene des ESP_NOW-Protokolls wird eine verknüpfte Liste geführt, die Informationen über das lokale Gerät und das gekoppelte Gerät enthält, einschließlich MAC-Adressen und Schlüssel. ESP-NOW speichert auch häufig verwendete Daten für die Anwendungsschicht, um den Aufwand für die Wiederaufbereitung der verknüpften Liste zu vermeiden. Informationen zu Geräten werden zum Senden und Empfangen von Daten verwendet und enthalten

Informationen zum lokalen Gerät:

  • PMK : 16 Byte - Der Haupthauptschlüssel, mit dem der Schlüssel auf dem angeschlossenen Gerät verschlüsselt wird (KOK in der API). ESP_NOW unterstützt standardmäßig PMK, sodass keine Konfiguration erforderlich ist. Bei Bedarf können Sie überprüfen, ob der PMK-Wert mit dem lokalen Gerät übereinstimmt.
  • Modus : 1 Byte - Der lokale Gerätemodus, der die sendende WiFi-Schnittstelle (SoftAP oder STA) ESP-NOW definiert. Der gekoppelte Gerätemodus wirkt sich nicht auf eine Funktion aus, sondern speichert nur Modusinformationen für die Anwendungsschicht. Im STA WiFi-Modus ist nur Station anwendbar und SoftAP WiFi ist nur SoftAP.
    Betriebsarten des lokalen Geräts ESP_NOW
    WiFi
    IDLE
    CONTROLLERSTA
    SLAVESoftAP

    COMBO&SoftAP


Gepaarte Geräteinformationen (einschließlich häufig verwendeter Informationen und anderer Benutzerinformationen):

  • LMK : 16 Byte - ein lokaler Hauptschlüssel, mit dem der Schlüssel nützlicher Informationen während der Kommunikation in diesem Paar verschlüsselt wird.
  • MAC-: 6 — , . , Station, MAC- Station.
  • : 1 — (SoftAP STA) ESP-NOW.
  • : 1 — , , . 0..255. , . . , 0 , ; 1 ~ 14 ; , .

Espressif empfiehlt nicht die Verwendung langwieriger Operationen in Rückruffunktionen beim Senden / Senden von Paketen, was vermutlich mit der Implementierung von Algorithmen unter Verwendung des Interrupt-Mechanismus zusammenhängt. Diese Annahme wird auch durch die Probleme unterstützt, die mit der dynamischen Speicherzuweisung in Rückruffunktionen verbunden sind, die durch die bevorzugte Verwendung statischer Variablen sowie die Mehrdeutigkeit der Verwendung des MicroPython- Ausnahmemechanismus gelöst werden .

Die Umsetzung der Asynchronität der Start / End - Prozesse, Paarung, Empfangen / Senden Espressif Pakete nicht beschrieben , das auch nicht die Anwendung der erleichtert asyncio MicroPython Ideologie .

ESP-NOW-Paketformat


  • MAC-Header : 24 Bytes.
  • Kategorie : 1 Byte, das die Kategorie des Paketerstellers angibt. Der Wert wird eingestellt (127).
  • Organisations-ID : 3 Byte, enthält eine eindeutige Kennung, die die ersten drei Bytes der von Espressif verwendeten MAC-Adresse sind. Wert einstellen (0x18fe34)
  • Zufälliger Wert : 4 Bytes zum Schutz von Daten.
  • Package Creator Daten : 7-255Bytes

Die Paketerstellungsdaten enthalten die folgenden Felder:

  • ID : 1 Byte, auf (221) setzen.
  • Länge : 1 Byte, Gesamtlänge der Organisations-ID, Typ, Version und Benutzerdaten.
  • Organisations-ID : 3 Byte, enthält eine eindeutige Kennung, die die ersten drei Bytes der von Espressif verwendeten MAC-Adresse sind. Wert einstellen (0x18fe34)
  • Typ : 1 Byte, ESP-NOW-Protokoll. Wert einstellen (4)
  • Version : 1 Byte, aktuelle Version von ESP-NOW. Installiert (1)
  • Inhalt : 0-250 Byte Benutzerdaten.
  • FCS : 4 Bytes, Prüfsumme

Da ESP-NOW kein WLAN verwendet, unterscheidet sich der MAC-Header geringfügig vom Standard-Paket-Header. Die FromDS- und ToDS-Bits des FrameControl-Felds sind 0. Die Zieladresse wird im ersten Adressfeld angegeben. Das zweite Adressfeld zeigt die Quelladresse. Das dritte Adressfeld wird als Broadcast-Adresse festgelegt (0xff: 0xff: 0xff: 0xff: 0xff: 0xff).

Grundlegender Anwendungsalgorithmus


Start und Ende


Bevor Sie ESP-NOW verwenden, wird empfohlen, die Wi-Fi-Schnittstelle auf den gewünschten Modus einzustellen. In der Regel ist die Stationsschnittstelle für CONTROLLER , die SoftAP-Schnittstelle für SLAVE und COMBO eingestellt . Es ist auch ratsam, Wi-Fi nach der Verwendung von ESP-NOW zu beenden.

Um ESP-NOW zu starten, rufen Sie zum Abschluss esp_now_init () und esp_now_deinit () auf. Beim Aufruf von esp_now_deinit () werden alle Informationen zu gekoppelten Geräten gelöscht.

Bindungsrückruffunktionen


Die Anrufverarbeitungsfunktion beim Senden des Pakets esp_now_register_send_cb () kann verwendet werden, um die Anwendungsebene des sendenden Teilnehmers in einem Paar über den Erfolg oder Misserfolg der Übertragung zu informieren, beispielsweise wenn die Informationen auf der MAC-Unterschicht erfolgreich übertragen werden. Beachten Sie bei der

Verwendung von esp_now_register_send_cb () Folgendes:

In einem verknüpften Paar:

  • Wenn die Anwendungsschicht das Paket nicht empfangen hat, die Rückruffunktion jedoch "Erfolg" zurückgegeben hat, kann dies folgende Gründe haben:
    - Angriffe von einem betrügerischen Gerät
    - Fehler
    bei der Installation verschlüsselter Schlüssel - Paketverlust auf Espressif-Anwendungsebene
  • Wenn die Anwendungsschicht das Paket empfangen hat, die Rückruffunktion jedoch einen Fehler zurückgibt, kann dies folgende Ursache haben:
    - Der Kanal ist besetzt und die ACK wird nicht empfangen.

Bei mehrfacher Kommunikation mit allen Paaren des lokalen Geräts:

  • Wenn der Rückruf "Erfolg" zurückgibt, bedeutet dies, dass das Paket erfolgreich gesendet wurde.
  • Wenn die Rückruffunktion einen Fehler zurückgibt, bedeutet dies, dass das Paket nicht erfolgreich gesendet wurde.

Die Anrufverarbeitungsfunktion gibt beim Empfang des Pakets esp_now_register_receive_cb () Informationen zurück, einschließlich der MAC-Adresse des sendenden Geräts in einem Paar und nützlicher Informationen. Es kann auch verwendet werden, um die Anwendungsschicht des mit dem Empfänger gekoppelten sendenden Geräts darüber zu informieren, dass das Paket erfolgreich empfangen wurde.

Hinzufügen eines Paares gekoppelter Geräte


Vor dem Senden von Daten müssen Sie das Gerät zur Liste der gepaarten Gerätepaare hinzufügen, indem Sie esp_now_add_peer () aufrufen . Bevor Sie Daten an eine Gruppe etablierter Paare senden, müssen Sie ein Gerät mit einer Multicast-MAC-Adresse hinzufügen. Der Kanalbereich der gekoppelten Geräte reicht von 0 bis 14. Wenn der Kanal auf 0 eingestellt ist, werden Daten auf dem aktuellen Kanal gesendet. Andernfalls muss der Kanal als der Kanal festgelegt werden, auf dem sich das lokale Gerät befindet.

Sicherheit


Wenn der Schlüssel verschlüsselt werden muss, können Sie esp_now_set_pmk () aufrufen, um ihn zum Festlegen von PMK zu konfigurieren . Wenn PMK nicht installiert ist, wird standardmäßig PMK verwendet und es wird für alle Geräte derselbe Schlüssel ausgewählt. Stellen Sie auch LMK für ausgewählte Paare ein.

Senden von Daten mit ESP-NOW-Paketen


Verwenden Sie esp_now_send () , um ESP-NOW-Daten zu senden . Zur gleichen Zeit wird die Funktion gesetzt früher in esp_now_register_send_cb () kehrt ESP_NOW_SEND_SUCCESS wenn eine Rückruffunktion sendet , wenn die Daten erfolgreich auf der MAC - Ebene empfangen wurden. Andernfalls wird ESP_NOW_SEND_FAIL zurückgegeben . Mehrere Gründe können dazu führen, dass ESP-NOW keine Daten senden kann. Insbesondere,

  • Zielgerät existiert nicht;
  • Gerätekanäle stimmen nicht überein;
  • Daten gehen während der Übertragung verloren.

Es kann nicht garantiert werden, dass die Anwendungsschicht notwendigerweise Daten akzeptiert. Bei Bedarf können Sie eine Bestätigung senden, wenn Sie ESP-NOW-Daten erhalten. Wenn ein Bestätigungszeitlimit auftritt, sollte die ESP-NOW-Datenübertragung wiederholt werden. ESP-NOW-Daten können auch eine Sequenznummer zugewiesen werden, um doppelte Daten zu entfernen. Beachten Sie

beim Senden von ESP-NOW-Daten über esp_now_send (), dass nicht mehr als 250 Byte Informationen gleichzeitig gesendet werden können.

BEACHTUNG! Ein zu kurzes Intervall zwischen dem Senden von zwei ESP-NOW-Paketen kann zu Fehlern bei der Ausführung der Rückruffunktion führen. Daher wird empfohlen, das nächste Datenpaket ESP-NOW zu senden, nachdem die Rückruffunktion die Verarbeitung des vorherigen Sendens erfolgreich abgeschlossen hat. Die Rückruffunktion wird von einer Wi-Fi-Aufgabe mit hoher Priorität gesendet. Daher wird nicht empfohlen, längere Vorgänge in der Rückruffunktion auszuführen. Stattdessen können Sie die erforderlichen Daten in eine statische Warteschlange stellen und aus einem Prozess mit niedrigerer Priorität verarbeiten.

Wenn die Sendefunktion eine MAC-Adresse zurückgibt, wird diese mit dieser MAC-Adresse an das Gerät gesendet. Wenn die Sendefunktion NULL zurückgibt, wird das Paket an alle an das sendende Gerät angeschlossenen Geräte gesendet, was zu einem Übertragungsfehler oder einer Verzögerung aufgrund einer Netzwerküberlastung führen kann.

ESP-NOW Daten empfangen


Die Rückruffunktion startet auch von einer Wi-Fi-Aufgabe. Daher wird nicht empfohlen, längere Vorgänge in der Rückruffunktion auszuführen. Stattdessen können Sie die erforderlichen Daten in eine statische Warteschlange stellen und mit einem Prozess mit niedrigerer Priorität verarbeiten.

Abschließend das Vorstehende


Meine Erfahrung beim Erstellen der Espressif IDE und von MicroPython mit ESP-NOW, Beschreiben der Fehler, die während der Montage aufgetreten sind, und Beheben dieser Fehler, nachdem ich ein stabiles Ergebnis erzielt habe. Anschließend beschreibe ich die ESP-NOW-Bibliothek in MicroPython mit den erkannten Fehlern und Möglichkeiten zu deren Behebung. Leider ist das Verständnis der Algorithmen des ESP-NOW-Protokolls aufgrund der Tatsache, dass der Quellcode von ESP-NOW geschlossen und nur in binärer Form verteilt ist, empirisch und es gibt eine Reihe von Problemen, die bereits identifiziert wurden, für die es nicht immer Optionen gibt, sie logisch zu überwinden, sondern im Allgemeinen ESP -NOW wurde erfolgreich in der Community von C-Benutzern und Pythonisten basierend auf mehr als 300 auf GitHub präsentierten Anwendungen angewendet.

Beschreibung der ESP-NOW C-Bibliothek von Espressif

MicroPython ESP-NOW Beschreibung und Open Sources

All Articles