Forum: Mikrocontroller und Digitale Elektronik ESP32: Send udp frame over wifi


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Zo R. (hsch1978)


Angehängte Dateien:

Lesenswert?

Hallo,

mit einem esp32 soll ein udp frame über die wifi Kommunikation zyklisch 
versendet werden. Als erstes habe ich ein Beispielprojekt mit eclipse 
esspressif erzeugt. Im Kommandverzeichnis von diesem Projekt habe ich 
dann "idf.py menuconfig" ausgeführt. Leider könnte ich in deisem Menü 
die wifi ssid und auch das wifi passwort nicht einstellen. Müss ich bei 
Eingaben in dem menuconfig durchführen? Wenn ja wo finde ich die 
Einstellungen?

Mein kleine Applikation sieht so aus:
1
#include <stdio.h>
2
#include <string.h>
3
#include <sys/socket.h>
4
#include <netinet/in.h>
5
#include "esp_wifi.h"
6
#include "esp_event.h"
7
#include "esp_log.h"
8
#include "nvs_flash.h"
9
10
#define WIFI_SSID "MySSID"
11
#define WIFI_PASS "MyPASSWORD"
12
#define HOST_IP_ADDR "192.168.1.100" // Replace with the target IP
13
#define PORT 12345                   // Target UDP port
14
15
static const char *TAG = "UDP_Client";
16
static const char *payload = "Hello, UDP from ESP32!";
17
18
void wifi_init() {
19
    ESP_ERROR_CHECK(esp_netif_init());
20
    ESP_ERROR_CHECK(esp_event_loop_create_default());
21
    esp_netif_create_default_wifi_sta();
22
23
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
24
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
25
26
    wifi_config_t wifi_config = {
27
        .sta = {
28
            .ssid = WIFI_SSID,
29
            .password = WIFI_PASS,
30
        },
31
    };
32
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
33
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
34
    ESP_ERROR_CHECK(esp_wifi_start());
35
36
    ESP_LOGI(TAG, "Connecting to WiFi...");
37
    ESP_ERROR_CHECK(esp_wifi_connect());
38
}
39
40
void udp_send_task(void *pvParameters) {
41
    char addr_str[128];
42
    int addr_family = 0;
43
    int ip_protocol = 0;
44
45
    while (1) {
46
        struct sockaddr_in dest_addr;
47
        dest_addr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR);
48
        dest_addr.sin_family = AF_INET;
49
        dest_addr.sin_port = htons(PORT);
50
        addr_family = AF_INET;
51
        ip_protocol = IPPROTO_IP;
52
53
        int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
54
        if (sock < 0) {
55
            ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
56
            break;
57
        }
58
        ESP_LOGI(TAG, "Socket created");
59
60
        int err = sendto(sock, payload, strlen(payload), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
61
        if (err < 0) {
62
            ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
63
        } else {
64
            ESP_LOGI(TAG, "Message sent");
65
        }
66
67
        close(sock);
68
        vTaskDelay(2000 / portTICK_PERIOD_MS);
69
    }
70
71
    vTaskDelete(NULL);
72
}
73
74
void app_main(void) {
75
    ESP_ERROR_CHECK(nvs_flash_init());
76
    wifi_init();
77
78
    xTaskCreate(udp_send_task, "udp_send_task", 4096, NULL, 5, NULL);
79
}

Wenn ich in eclipse das Projekt neu bauen lasse, erscheint im Anschluss 
folgende Meldung: Siehe Dateianhang
Was müsste ich in eclipse genau einstellen um die maximale FLASH size 
ausnutzen zu können?

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Zo R. schrieb:
> Leider könnte ich in deisem Menü
> die wifi ssid und auch das wifi passwort nicht einstellen. Müss ich bei
> Eingaben in dem menuconfig durchführen? Wenn ja wo finde ich die
> Einstellungen?

Die stehen doch hartcodiert als #defines in Deinem Quelltext.

Zo R. schrieb:
> Was müsste ich in eclipse genau einstellen um die maximale FLASH size
> ausnutzen zu können?

Was wird Dir denn angezeigt, wenn Du den Anweisungen folgst, und "here" 
klickst?

von Dieter B. (nichtgedacht)


Lesenswert?

Zo R. schrieb:
> Was müsste ich in eclipse genau einstellen um die maximale FLASH size
> ausnutzen zu können?

Die ESP32 haben einen partionierten Flashspeicher.
Wegen der OTA Update Möglichkeit ist der Speicher für das Programm 
doppelt vorhanden als Default.
Es gibt 3 weitere Partitionen für Coredump, OTA und ein Filesystem. Wenn 
was nicht gebraucht wird oder die Größen nicht passen, kann der Speicher 
für das Programm mit einer eigenen Partionierung vergrößert werden.
Gruß Dieter

von Zo R. (hsch1978)


Lesenswert?

Hallo,

ich habe nun das Partition file angepasst und den Flashbereich für die 
Applikation erhöht. Nach wie vor erscheint bei mir die Meldung, dass ich 
den Flash Bereich für die Applikation erhöhen sollte.

In Project->EDP-IDF->Partition Table Editor->Custom partition table CSV
1
# ESP-IDF Partition Table
2
# Name,   Type, SubType, Offset,  Size, Flags
3
nvs,      data, nvs,     0x9000,  0x1000,
4
phy_init, data, phy,     0xf000,  0x1000,
5
factory,  app,  factory, 0x10000, 2M,

Was mache ich da noch falsch?

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Ich habe nochmals in der IDE clean ausgeführt un im Anschluss Build all 
gestartet. Der Hinweis kommt nun nicht mehr.

von Zo R. (hsch1978)


Lesenswert?

Guten Abend,

aktuell bin ich noch dran, wie ich über wlan zyklische udp Nachrichten 
vbersenden kann. Ich habe eine kleine Applikation ohne freertos.
Das Projekt lässt sich auch erfolgreich bauen nur kommt an der 
Gegenstelle (Windows PC) keine udp Nachricht vom esp32 an.
Gibt es hier erfahrene Personen die eine udp Kommunikation über wlan 
erfolgreich realisiert haben?

Beitrag #7779573 wurde von einem Moderator gelöscht.
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Also in der Arduino-IDE mit dem entsprechenden ESP8266-Framework im 
Hintergrund, braucht sowas keine 10 Zeilen ... mache ich, um Sensordaten 
aus Transportfahrzeugen in einem Werksgelände zu versenden.

Tip: Mach' Broadcasts an die IP 255.255.255.255 auf einem ansonsten 
ungenutzen Port - und jede UDP-Message einfach 3...4 mal (mit ID, um 
beim Empfänger zu erkennen "hab ich schon"), kommt quasi immer an ...

Beitrag #7779669 wurde von einem Moderator gelöscht.
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Im Zweifelsfall kannst du das erst mal manuell mit der AT Firmware 
ausprobieren. Dass die das kann, weiß ich mit Sicherheit.

Wenn es dann bei dir nicht funktioniert, könnte es an den Einstellungen 
des Routers liegen. Meiner routet zwischen dem drahtlosen und dem 
verkabeltem Netz generell nur, wenn ich das ausdrücklich so aktiviere, 
obwohl beide Netze den gleichen IP-Range haben.

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Hi danke für eure Hilfe.

Woher kann ich die AT Firmware beziehen?
Gibt es eine Möglichkeit nachzuschauen ob sich der ESP32 in den Router 
eingebucht hat oder nicht?

: Bearbeitet durch User
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Zo R. schrieb:
> Woher kann ich die AT Firmware beziehen?

Die ist meistens vorinstalliert. Kannst du bei Espressif herunter laden.

Zo R. schrieb:
> Gibt es eine Möglichkeit nachzuschauen ob sich der ESP32 in den Router
> eingebucht hat oder nicht?

Das zeigen die Router normalerweise auf ihrem Web-Interface an. Du 
kannst Statusmeldungen in dein ESP Programm einbauen und seriell oder 
auf einem Display ausgeben.

: Bearbeitet durch User
von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Nur so nebenbei, es gibt keine UDP Frames. Frames gibt es erst zwei 
Ebenen tiefer.

L4: UDP PDUs heißen Datagrams (das D in UDP), nicht Frames.

L3: Die UDP Datagrams werden in IP Packets (Pakete) gekapselt. Offiziell 
auch IP Datagrams genannt

L2: Die IP Packets werden in Frames (Rahmen) gekapselt. Für WLANs was 
aus dem Zoo von 802.11 und Konsorten. Bei Leitungen was aus 802.3 und 
Konsorten.

Es hilft schon die Begriffe auseinander zu halten wenn man damit 
arbeiten muss, zum Beispiel beim Debuggen.

Ach ja, und bei TCP auf L4 heißen die PDUs Segments (Segmente).

von Zo R. (hsch1978)


Lesenswert?

Hallo ich habe das AT Firmware Projekt mit git heruntergeladen. Leider 
knallt es es an allen Ecken. Es wird eine json Datei vermisst, somit 
kann ich auch keine Konfiguration vornehmen. Das Bauen tut dann 
logischerweise auch nicht.

: Bearbeitet durch User
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Zo R. schrieb:
> Hallo ich habe das AT Firmware Projekt mit git heruntergeladen. Leider
> knallt es es an allen Ecken

Passt eins der binaries?
https://docs.espressif.com/projects/esp-at/en/latest/esp32/AT_Binary_Lists/esp_at_binaries.html

Ansonsten musst du dich wohl mit dem Rest dieser Doku auseinander 
setzen.

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Ich habe heute Morgen doch nochmals das Projekt neu aufgesetzt. Siehe da 
nun erhalte ich zyklisch die UDP Datagramme.

von Harald K. (kirnbichler)


Lesenswert?

Und hast Du das alte aufgehoben?

Dann könntest Du mit einem diff rausfinden, was Du beim ersten Mal 
falschgemacht hast.

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.