ESP32: Send udp frame over wifi

OP #7778535
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?

Angehängte Dateien:
#7778567
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?

#7778662
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

OP #7779386
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?

OP #7779553
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.
(Firma: Q3) #7779665
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.
Gast #7779735
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.

Gast #7779918
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.

#7780162
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren