ESP8266 Kommunikation Über WLAN Mit PC funktioniert nicht

Hallo, ich habe ein Problem bei der Kommunikation zwischen einem ESP8266 und meinem PC. Die beiden sollen mit dem UDP Protokoll miteinander Kommunizieren.
Ich habe mein Problem weiter Analysiert und folgendes herausgefunden:
Der PC kann eine Nachricht an seine eigene IP Adresse über das UDP-Protokoll senden und empfängt diese dann auch. Der PC kann auch eine Nachricht über das UDP-Protokoll an den ESP8266 senden und dieser Empfängt sie. Jedoch kann der ESP8266 sich selber keine Nachricht über das UDP-Protokoll senden(der ESP behauptet die Absendung war erfolgreich, doch empfangen tut er diese Nachricht nicht). Wenn der ESP Versucht eine Nachricht über das UDP-Protokoll an den PC zu schicken kommt diese auch nicht an, trotz, dass er die Nachricht als erfolgreich abgesendet ausgibt.
Meine Vermutungen, wo der Fehler liegen könnte sind:
-Der ESP8266 ist in gewisser Weise kaputt, aber da der ESP32 es auch nicht hinkriegt ist diese Vermutung unwahrscheinlich.
-Die nächste Vermutung wäre, dass der ESP8266 durch das WLAN geblockt wird, aber ich habe auch teste mit einem ESP32 als Soft Access Points versucht und dies hat auch nicht funktioniert.
-Es gäbe noch die Möglichkeit, dass der ESP8266 vom PC geblockt wird, das würde aber nicht erklären, weshalb der ESP8266 sich selbst keine Nachricht zukommen lassen könnte.
-Das Wahrscheinlichste Problem ist ein Problem nach der Absendung, da der ESP8266 ausgibt das die Absendung erfolgreich war, aber es gibt keine Möglichkeit herauszufinden, ob Sie auch ihr Ziel erreicht hat. Es kann entweder daran liegen, das irgendwie die IP Adresse nicht gefunden wird oder der Port falsch ist(dies habe ich beides aber mehrfach kontrolliert), oder das generell etwas nach der Absendung schief geht.
Also ist am Wahrscheinlichsten das nach der Absendung etwas schief läuft, oder?

Also Kommunikation PC → WLAN–>PC und PC–>WLAN–>ESP8266 funktioniert.
Nicht funktionieren tut ESP8266 → WLAN–>ESP8266 und ESP8266 → WLAN–>PC.

Mein PC gibt lediglich die Empfangene UDP Nachricht aus und das Programm funktioniert auch

Der ESP8266 wird über die ArduinoIDE programmiert und hat folgenden Code:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "XXXX";
const char* password = "XXXXXX";

IPAddress IPAdresseEmpfaenger(192,168,XX,XXX);
char packetBuffer[50];
String inString;
char replyBuffer[50];

unsigned int localPort = 2000;
WiFiUDP udp;

void setup() 
{
  ESP.eraseConfig(); 
  WiFi.mode(WIFI_STA);

  Serial.begin(115200);
  delay(250);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(250);
  }

  udp.begin(localPort);


  Serial.println();
  Serial.print("WLAN: ");Serial.println(ssid);
  Serial.print("IP: ");Serial.println(WiFi.localIP());
  Serial.print("Local Port: ");Serial.println(udp.localPort());
}


void loop() 
{
  receive_packet();

  while (Serial.available() > 0) 
  {
    String inString = Serial.readString();
    inString = inString.substring(0, inString.length()-1);
    
    inString.toCharArray(replyBuffer, 50);
    udp.beginPacket(IPAdresseEmpfaenger, 2000);
    udp.write(replyBuffer);
    int check = udp.endPacket();
    inString = "";

    if (check == 1)
    {
      Serial.print("Gesendet: "); Serial.println(replyBuffer);
    }
    else
    {
      Serial.print("Senden Fehler!");
    }
    delay(1000);
  }
}


void receive_packet() 
{
  int packetSize = udp.parsePacket();
  if (packetSize) 
  {
    int len = udp.read(packetBuffer, 50);
    Serial.print("Empfangen: "); Serial.println(packetBuffer); 
  }
}

Schritt 1 würde ich mal exakt das Beispiel aus der IDE probieren.

ESP8266Wifi / UDP

im Kopf steht:
UDPSendReceive.pde:

Hallo,

was hast Du denn auf der PC Seite installiert um das zu testen. Ich empfehle Dir das Programm Paketsender.

Die Portadressen hast Du richtig eingestsellt ?

Versuch doch erst mal das Beispiel udp für den ESP8266

Heinz

Und warum testest du nicht zwischen dem ESP8266 und dem ESP32 ?
UDP funktioniert sicher auch auf deinem ESP, du machst da sicher etwas falsch.

Mit dem PC habe ich es selber noch nicht probiert, weil nicht nötig.

noiasca:
Schritt 1 würde ich mal exakt das Beispiel aus der IDE probieren.

ESP8266Wifi / UDP

im Kopf steht:
UDPSendReceive.pde:

Ich habe es mal so ausprobiert bzw. etwas umgeändert. Der ESP sendet sich selber jetzt jede Sekunde “Hallo World”.

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#ifndef STASSID
#define STASSID "XXXX"
#define STAPSK  "XXXXXXXXX"
#endif

unsigned int localPort = 8888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "Hallo World!";       // a string to send back

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  Serial.printf("UDP server on port %d\n", localPort);
  Udp.begin(localPort);
}

void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.printf("Received packet of size %d from %s:%d\n    (to %s:%d, free heap = %d B)\n",
                  packetSize,
                  Udp.remoteIP().toString().c_str(), Udp.remotePort(),
                  Udp.destinationIP().toString().c_str(), Udp.localPort(),
                  ESP.getFreeHeap());

    // read the packet into packetBufffer
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
    Serial.println("Contents:");
    Serial.println(packetBuffer);   
  }
  else 
  {
    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(WiFi.localIP(), Udp.localPort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
    Serial.println("Antwort:");
    Serial.println(ReplyBuffer);
    delay(1000);
  }
}

Dies ist die Ausgabe des Monitors:
13:08:58.184 → …Connected! IP address: 192.168.10.125
13:09:01.970 → UDP server on port 8888
13:09:01.970 → Antwort:
13:09:01.970 → Hallo World!
13:09:02.952 → Antwort:
13:09:02.986 → Hallo World!
13:09:03.966 → Antwort:
13:09:03.966 → Hallo World!

Der ESP8266 empfängt also die Nachrichten noch nicht, habe ich da was falsch verändert?
Und danke für die schnelle Rückmeldung :wink:

Ich kann mir nicht vorstellen, dass das so funktioniert.
Der ESP8266 kann nicht gleichzeitig senden und empfangen.

Du solltest das wie ich schon schrieb, in Verbindung mit dem ESP32 oder einem 2. ESP8266 testen.

mach keine halbherzigen loopback Tests.

Die IDE Beispiele funktionieren normalerweise! Lass es so wie es ist.
Nimm den originalen Sketch und schicke von einem anderem Device zum ESP.

Hast du es denn mal mit den originalen Beispielen versucht ?

Was mir aufgefallen ist, du verwendest "UDP.write" als Anweisung. Hast du es mal mit "UDP.print" versucht ?

Was auch immer funktioniert, sind die Beispiele von fips: Esp8266 Udp Sender Tab

Danke für die ganze schnelle Hilfe. :slight_smile:
Ich habe eure Vorschläge alle ausprobiert und habe herausgefunden, dass der ESP8266 vollkommen in Takt ist, er hat perfekt mit dem ESP32 kommunizieren können. Mit sich selber hat er nicht Kommunizieren können, wo ich ja jetzt weiß das das auch gar nicht gehen kann.
Der Fehler lag am Code auf dem PC ich habe ein Programm geschrieben mit zwei UDPs in VB, einen zum Empfangen, einen zum Senden. Aus Ratlosigkeit habe ich einfach mal einen der beiden UDPs herraus gelöscht und diesen dann für Empfangen und Senden verwendet, dann funktionierte alles.
Wieso weiß ich nicht, aber alles läuft wieder.

leab:
.....
Wieso weiß ich nicht, aber alles läuft wieder.

Prima, danke für die Rückmeldung.

Bitte poste noch deinen jetzt verwendeten Sketch des ESP, dann können auch andere davon profittieren.

Mein jetzt funktionierender Code ist folgender:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

//WLAN Daten:
#ifndef STASSID
#define STASSID "XXXX"
#define STAPSK  "XXXXXXX"
#endif

//Buffer:
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1];
char  ReplyBuffer[] = "HALLO WORLD";

//UDP
unsigned int localPort = 8888;
WiFiUDP Udp;

void setup() 
{
  Serial.begin(115200);
  
  //Auf richtigen Modus setzten:
  ESP.eraseConfig(); 
  WiFi.mode(WIFI_STA);

  //Mit WLAN verbinden:
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) 
  {
    Serial.print('.');
    delay(500);
  }
  Serial.println("Connected!");Serial.print("IP address: ");Serial.println(WiFi.localIP());

  //UDP starten:
  Udp.begin(localPort);
  Serial.printf("UDP Server auf Port %d\n", localPort);
}

void loop() 
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    //Annehmen vom PC        
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
    Serial.printf("Packet von %s:%d\n",
                  Udp.remoteIP().toString().c_str(), Udp.remotePort());
    Serial.print("Empfangener Inhalt: ");Serial.println(packetBuffer);Serial.println();



    //Antwort an PC
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    int check = Udp.endPacket();
    if (check == 1)
    {
      Serial.printf("Packet gesendet an %s:%d\n",
                  Udp.remoteIP().toString().c_str(), Udp.remotePort());
      Serial.print("Gesendeter Inhalt: ");Serial.println(ReplyBuffer);
    }
    else
    {
      Serial.print("Fehler beim senden");
    }
    Serial.println();
  }
}