Forum: Mikrocontroller und Digitale Elektronik Daten mit ESP-NOW versenden


von Vincent (Gast)


Lesenswert?

Guten morgen,
ich möchte mit ESP32 sensordaten über ESP-NOW versenden.
Das funktioniert auch schon soweit
1
typedef struct
2
{
3
    uint16_t id;
4
    uint8_t x;
5
    uint8_t y;
6
}message_ts;
7
8
static message_ts message_s;
9
10
static void onDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len);
11
12
// callback when data is received
13
static void onDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len)
14
{
15
    static const char *TAG = "onDataRecv";
16
17
    memcpy(&message_s, incomingData, sizeof(message_s));
18
    ESP_LOGI(TAG, "Packet received from: %02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
19
    ESP_LOGI(TAG, "\tid: 0x%02X\tx: %d\ty: %d", message_s.id, message_s.x, message_s.y);
20
}
Die Idee war es, eine ID zu schicken (welcher ESP (z.B. 
Küche/Wohnzimmer..)), x für den Sensor (Temperatur/Fensterkontakt...) y 
für den Wert.

Diese bekomme ich  (getestet mit einem HAL-Sensor)

Reichen diese Werte? Also sorgt ESP-NOW schon dafür, dass die Daten 
richtig ankommen? Oder sollte ich auch einen CRC dazu packen? und diesen 
dann überprüfen das das alles richtig ist?

von Wolfgang (Gast)


Lesenswert?

Vincent schrieb:
> Diese bekomme ich  (getestet mit einem HAL-Sensor)

Was ist ein HAL-Sensor?
Gewöhnlich steht HAL in der Software eines uC für Hardware Abstraction 
Layer.

von Vincent (Gast)


Lesenswert?

Wolfgang schrieb:
> Was ist ein HAL-Sensor?
> Gewöhnlich steht HAL in der Software eines uC für Hardware Abstraction
> Layer.

Ja, da bin ich bei was ganz großem neuem dran. Das wird die Welt 
revolutionieren ;)

meinte einen HALL-Sensor

von Stefan F. (Gast)


Lesenswert?

Vincent schrieb:
> Also sorgt ESP-NOW schon dafür, dass die Daten
> richtig ankommen? Oder sollte ich auch einen CRC dazu packen?

Ethernet Pakete sind bereits durch eine CRC abgesichert. Fehlerhafte 
Pakete werden verworfen.

Beim TCP Protokoll werden automatisch mehrere Wiederholversuche gemacht. 
Falls auch das erfolglos warm bricht TCP die Verbindung ab. TCP kennst 
du vom Web Browser.

Beim UDP Protokoll werden (vom Netzwerk Stack/Treiber) keine 
Wiederholungen gemacht. Es gibt keine Verbindung, also auch keinen 
Abbruch. Es gibt auch kein Signal an das Anwendungsprogramm, dass ein 
Paket verloren wurde. Oft ergänzen die Anwendungsprogramme das 
Protokoll, um verlorene Pakete wenigstens zu bemerken (z.B. anhand einer 
fortlaufenden Sequenz-Nummer). UDP kennst du vom Video Streaming (z.B. 
Netflix).

ESP-NOW ist ein Spezialfall, weil es weder TCP noch UDP nutzt. Ich bin 
nicht 100% sicher, aber ich denke dass fehlerhafte Pakete nicht 
entschlüsselt werden können.

Ofenbar findet wie bei UDP keine automatische Wiederholung statt, und 
das Anwendungsprogramm erfährt nicht, ob das Paket beim Empfänger 
angekommen ist. Denn Espressif empfielt:

"If necessary, send back ack data when receiving ESP-NOW data. If 
receiving ack data timeouts, retransmit the ESP-NOW data. A sequence 
number can also be assigned to ESP-NOW data to drop the duplicate data."

Siehe 
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html

Zusammengefasst: Was du sendest, kann verloren gehen. Was du empfängst 
ist garantiert richtig (unverändert).

von J. S. (jojos)


Lesenswert?

Sequence Counter halte ich auch für eine gute Idee, damit kann man eine 
Anzeige der Verbindungsqualität in Prozent realisieren. Bei einem Sensor 
der zyklisch sendet spielt es ja keine Rolle wenn mal ein paar Pakete 
verloren gehen. Schlechter wäre das bei einm Kontakt der nur bei 
Ereignis sendet, da macht ein Protokoll mit Quittung und Watchdog Sinn.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.