Danke Moppi für deine Mühe. Mein Code ist genau an diesem Beispiel angelehnt. Um aber nicht doch irgend etwas vermurkst zu haben, habe ich diesen noch mal verwendet und habe dabei alles was mit dem Empfang zu tun hat, raus geschmissen.
Sieht dann so aus:
Code:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "SSID";
const char* password = "password";
WiFiUDP Udp;
unsigned int localUdpPort = 4210; // local port to listen on
char incomingPacket[255]; // buffer for incoming packets
char replyPacket[] = "Hi there! Got the message :-)"; // a reply string to send back
IPAddress IPudp (255, 255, 255, 255); // <--- wird benötigt, da jetzt kein RemoteIp mehr abgefragt werden kann
unsigned int sendUdpPort = 5005; // <---- wird benötigt, da jetzt kein RemotePort mehr abgefragt werden kann
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected");
Udp.begin(localUdpPort);
Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}
void loop()
{
Udp.beginPacket(IPudp, sendUdpPort);
Udp.write(replyPacket);
Udp.endPacket();
delay(5000);
}
Daher willst Du das Paket mit was Anderem empfangen, als einem nodeMCU z.b. oder?
Richtig, daher sollte das auf meinem Laptop, später auf dem Server, sichtbar sein.
Wenn ich richtig gelesen habe, kommen nicht alle Pakete an? Also kommen welche an. Wenn welche ankommen, funktioniert auch der Versand. Mal anders gefragt, woher weißt Du, dass nicht alle ankommen, vielleicht wurden nicht so viele verschickt, wie Du glaubst?
Richtig, es kommen nicht alle an. Das sehe ich daran, dass der serielle Monitor des Arduino mir brav mitteilt, das ein Paket erfolgreich verschickt wurde (bei meinem Code aus dem ersten Beitrag). Im Netzwerksniffer Wireshark, sowie per Terminalbefehl "netcat -ul 5005" kommen diese Pakete aber nur spradisch an. Laut angehängtem Code sollten das alle 5sek(+Durchlaufzeit) sein. Am NodeMCU sehe ich auch die blaue LED im richtigen Intervall aufleuchten. Das WiFi.disconnect() war eine Idee, dem Accesspoint mitzuteilen, dass die Verbindung beendet wird um nach der Schlafzeit diese wieder korrekt aufzubauen. Auch das yield() ist nur ein Versuch dem Prozessor Zeit zu geben, Hintergrundprozesse wie das Senden, beenden zu können.
Hier sieht man die Zeitabstände von Paket zu Paket.
- - - Aktualisiert - - -
Neue Erkenntnis:
Ich habe soeben mal drei Pakete unmittelbar hintereinander geschickt:
Code:
udp.beginPacket(IPudp,sendUdpPort1);
udp.write(UnitID);
udp.write(" ");
udp.write("10000");
udp.write(" ");
udp.write("44.4");
udp.write(" ");
udp.write(rssi);
sendingStat == udp.endPacket();
udp.beginPacket(IPudp,sendUdpPort2);
udp.write(UnitID);
udp.write(" ");
udp.write("20000");
udp.write(" ");
udp.write("44.4");
udp.write(" ");
udp.write(rssi);
udp.endPacket();
udp.beginPacket(IPudp,sendUdpPort3);
udp.write(UnitID);
udp.write(" ");
udp.write("30000");
udp.write(" ");
udp.write("44.4");
udp.write(" ");
udp.write(rssi);
udp.endPacket();
Demnach ist zu erkennen, dass das erste Paket fast nie ankommt, aber häufig Paket 2+3. Aber auch bei Paket2+3 sind manchmal 2-3 Codeschleifen (ca.9sek/loop) durchlaufen, ohne das diese ankommen.
Hier sieht man anhand des Ports, welche Pakete ankommen:
Lesezeichen