NodeMCU extrem langsam im lokalen Netz

Hallo Leute,

ich habe mir interessehalber diesen NodeMCU besorgt

https://www.ebay.de/itm/NodeMCU-V3-2-Arduino-ESP8266-ESP-12-E-Lua-CH340-WiFI-WLan-IoT-Lolin-Mini-Micro/252718027546

und meine Arduino IDE dafür konfiguriert. Hat alles wunderbar funktioniert. Als ersten Sketch habe ich aus den ESP8266 Beispielen UDP ausgewählt und nur meine WLAN-Zugangsdaten konfiguriert

/*
  UDPSendReceive.pde:
  This sketch receives UDP message strings, prints them to the serial port
  and sends an "acknowledge" string back to the sender

  A Processing sketch is included at the end of file that can be used to send
  and received messages for testing with a computer.

  created 21 Aug 2010
  by Michael Margolis

  This code is in the public domain.

  adapted from Ethernet library examples
*/


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

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK  "your-password"
#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[] = "acknowledged\r\n";       // 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);

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }

}

Der NodeMCU verbindet sich sauber mit meiner Fritzbox. Ich kann dann z.B. über das Kommandozeilentool netcat von einem Raspberry Pi 3b UDP Pakete an ihn versenden und bekomme vom Controller ein "acknowledged" zurück.

Leider aber sind die Response-Zeiten jenseits von Gut und Böse und es gehen im Schnitt 25 bis 50% aller Pakete verloren. Wenn ich den Controller anpinge, so liegen die Antwortzeiten im Sekundenbereich mit den genannten 50% packet loss. Die Verbindungssignalstärke liegt bei -47dB, was mehr als ausreichend sein sollte. Andere Hosts im Netz (Linux, Windows & Co, ebenfalls via WLAN angebunden) antworten im einstelligen Milisekundenbereich und verlieren keine Pakete.

Ich schließe daraus, dass der Flaschenhals in der TCP Implementierung des NodeMCU zu suchen ist. Allerdings habe ich da keinerlei Erfahrung. Kennt jemand dieses Problem oder hat eine Idee, wo ich suchen könnte?

Vielen Dank
Bernhard

Das kann mich nicht nachvollziehen. Meine NodeMCU und WEMOS D1 mini antworten ebenfalls im ms-Bereich.

Gruß Tommy

Esp8266 -> Router

Ping wird ausgeführt für 192.168.178.38 mit 32 Bytes Daten:
Antwort von 192.168.178.38: Bytes=32 Zeit=2ms TTL=255
Antwort von 192.168.178.38: Bytes=32 Zeit=3ms TTL=255
Antwort von 192.168.178.38: Bytes=32 Zeit=2ms TTL=255
Antwort von 192.168.178.38: Bytes=32 Zeit=2ms TTL=255

Ping-Statistik für 192.168.178.38:
Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
(0% Verlust),
Ca. Zeitangaben in Millisek.:
Minimum = 2ms, Maximum = 3ms, Mittelwert = 2ms

Esp8266 -> Repeater -> Router

Ping wird ausgeführt für 192.168.178.26 mit 32 Bytes Daten:
Antwort von 192.168.178.26: Bytes=32 Zeit=7ms TTL=255
Antwort von 192.168.178.26: Bytes=32 Zeit=7ms TTL=255
Antwort von 192.168.178.26: Bytes=32 Zeit=9ms TTL=255
Antwort von 192.168.178.26: Bytes=32 Zeit=6ms TTL=255

Ping-Statistik für 192.168.178.26:
Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
(0% Verlust),
Ca. Zeitangaben in Millisek.:
Minimum = 6ms, Maximum = 9ms, Mittelwert = 7ms

Beide Esp laufen als Webserver.

Gruß Fips

Danke für eure Antworten, so siehts bei mir aus:

PING 192.168.1.125 (192.168.1.125) 56(84) bytes of data.
64 bytes from 192.168.1.125: icmp_seq=1 ttl=255 time=1658 ms
64 bytes from 192.168.1.125: icmp_seq=4 ttl=255 time=1074 ms
64 bytes from 192.168.1.125: icmp_seq=5 ttl=255 time=656 ms
64 bytes from 192.168.1.125: icmp_seq=6 ttl=255 time=278 ms
64 bytes from 192.168.1.125: icmp_seq=7 ttl=255 time=520 ms
64 bytes from 192.168.1.125: icmp_seq=9 ttl=255 time=927 ms
64 bytes from 192.168.1.125: icmp_seq=10 ttl=255 time=549 ms
64 bytes from 192.168.1.125: icmp_seq=12 ttl=255 time=994 ms
64 bytes from 192.168.1.125: icmp_seq=13 ttl=255 time=617 ms
64 bytes from 192.168.1.125: icmp_seq=14 ttl=255 time=239 ms
64 bytes from 192.168.1.125: icmp_seq=15 ttl=255 time=481 ms
64 bytes from 192.168.1.125: icmp_seq=17 ttl=255 time=927 ms
64 bytes from 192.168.1.125: icmp_seq=18 ttl=255 time=549 ms
64 bytes from 192.168.1.125: icmp_seq=20 ttl=255 time=995 ms
64 bytes from 192.168.1.125: icmp_seq=21 ttl=255 time=618 ms
^C
--- 192.168.1.125 ping statistics ---
21 packets transmitted, 15 received, 28% packet loss, time 20309ms
rtt min/avg/max/mdev = 239.755/739.327/1658.994/350.740 ms, pipe 2

Gruß,
Bernhard

Welche Versionen von IDE und ESP8266-Core verwendest Du?
Verwenden die anderen Geräte auch das 2,4 GHz Band oder das 5 GHz-Band?

Gruß Tommy

Mit dem UDP Sketch:

Ping wird ausgeführt für 192.168.178.43 mit 32 Bytes Daten:
Antwort von 192.168.178.43: Bytes=32 Zeit=100ms TTL=255
Antwort von 192.168.178.43: Bytes=32 Zeit=6ms TTL=255
Antwort von 192.168.178.43: Bytes=32 Zeit=80ms TTL=255
Antwort von 192.168.178.43: Bytes=32 Zeit=3ms TTL=255

Ping-Statistik für 192.168.178.43:
Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
(0% Verlust),
Ca. Zeitangaben in Millisek.:
Minimum = 3ms, Maximum = 100ms, Mittelwert = 47ms

Ping wird ausgeführt für 192.168.178.43 mit 32 Bytes Daten:
Antwort von 192.168.178.43: Bytes=32 Zeit=71ms TTL=255
Antwort von 192.168.178.43: Bytes=32 Zeit=84ms TTL=255
Antwort von 192.168.178.43: Bytes=32 Zeit=99ms TTL=255
Antwort von 192.168.178.43: Bytes=32 Zeit=3ms TTL=255

Ping-Statistik für 192.168.178.43:
Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
(0% Verlust),
Ca. Zeitangaben in Millisek.:
Minimum = 3ms, Maximum = 99ms, Mittelwert = 64ms

Gruß Fips

Tommy56:
Welche Versionen von IDE und ESP8266-Core verwendest Du?
Verwenden die anderen Geräte auch das 2,4 GHz Band oder das 5 GHz-Band?

Gruß Tommy

Die Arduino IDE ist 1.8.9 und ESP.getFullVersion() gibt folgenden String zurück:

SDK:2.2.2-dev(38a443e)/Core:2.6.3=20603000/lwIP:STABLE-2_1_2_RELEASE/glue:1.2-16-ge23a07e/BearSSL:89454af

Die anderen Geräte verwenden weitgehend das 2.4GHz Band, ja. Möglicherweise liegt es daran... Ich deaktiviere mal alle nacheinander.

Gruß,
Bernhard

Das Entfernen der anderen Netzwerkgeräte ändert nichts am Verhalten des Controllers. Vielleicht eine Hardwaresache? Ich werde mir nochmal einen Controller zum Vergleich bestellen.

Gruß,
Bernhard

Ja, das kann auch sein. Probiere auch mal einen WEMOS/Lolin D1 mini

Gruß Tommy

Du kannst auch noch verschiedene lwIP Varianten probieren.

Einstellen unter Werkzeuge/lwIP Variant:

Ich spiele gerade mal mit IPv6.

SDK:2.2.2-dev(38a443e)/Core:2.6.3=20603000/lwIP:IPv6+STABLE-2_1_2_RELEASE/glue:1.2-16-ge23a07e/BearSSL:89454af

Klappt auch, der Beispielsketch zeigt mir schön die linklocal und die globale IPv6 an.

IF='st' IPv6=1 local=1 hostname='ipv6test' addr= fe80::6201:xxxx:fe29:9898
IF='st' IPv6=1 local=0 hostname='ipv6test' addr= 2003:e8:xxxx:7300:6201:xxxx:fe29:9898

ok, werde ich testen. Vielen Dank euch!

Gruß,
Bernhard