- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 48

Thema: NodeMCU UDP Paket senden + deepsleep

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19

    Frage NodeMCU UDP Paket senden + deepsleep

    Anzeige

    E-Bike
    Hallo zusammen,

    ich Suche schon lange Zeit den Fehler in meinem Programm und habe mich jetzt entschlossen nach Hilfe zu fragen. Vorab, ich bin Programmierlaie! Verbesserungen sind dringend erwünscht.

    Ziel des Programms:
    Temperatur und Luftfeuchte aus einem DHT22 auslesen und diese Daten mit einer festen ID per UDP an Broadcast senden. Ein Pythonscript soll später die Daten aufnehmen und weiter verarbeiten.

    Problem:
    Auch ohne deepsleep funktioniert das Senden nur unregelmäßig. Laut serieller Konsole wird das Paket jedes mal erfolgreich gesendet (Rückgabewert endPacket() ). Im Wireshark ist davon allerdings nur manchmal ein Paket zu sehen. Auch an eine direkte IP statt dem Broadcast treten diese Probleme auf.

    Vielleicht kann hier mal jemand drüber sehen und sieht einen Fehler:
    Code:
    #include <ESP8266WiFi.h>          //ESP8266 Core WiFi Library (you most likely already have this in your sketch)
    #include <WiFiUdp.h>
    #include <DHT.h>
    
    #define DHTPIN 0             
    #define DHTTYPE DHT22 
    
    //Init DHT-Sensor
    DHT dht(DHTPIN, DHTTYPE);
    //set IPs
    IPAddress IPudp (255, 255, 255, 255);
    IPAddress IPlocal (192, 168, 10, 201);
    IPAddress IPdns (192, 168, 10, 1);
    IPAddress IPgateway (192, 168, 10, 1);
    IPAddress IPsubnetmask (255, 255, 255, 0);
    
    //*******DeviceID-config************************
    char UnitID[] = "id_1";
    //******************************************
    unsigned int receiveUdpPort = 5006;
    unsigned int sendUdpPort = 5005;
    
    char ssid[] = ("Hier steht die SSID");
    char passphrase[] = ("hier ist das Passwort");
    char charTemp[10];
    char charHum[10];
    int sendingStat;
    
    
    WiFiUDP udp;
    
    
    void setup() { 
      Serial.begin(115200);
      delay(1000);
      Serial.println("\n\nSerial connection started");
      
    
      WiFi.mode (WIFI_STA);
      WiFi.config (IPlocal, IPdns, IPgateway, IPsubnetmask);
      WiFi.begin(ssid, passphrase);
      while (WiFi.status() != WL_CONNECTED) 
      {
        delay(500);
        Serial.print(".");
        Serial.print(WiFi.status());
      }
      WiFi.printDiag(Serial);
      Serial.print(WiFi.status());
    
      pinMode(12, OUTPUT);
    }
    
    
    void loop() {
    
      Serial.printf("Now listening at IP %s, UDP port %d\n\n", WiFi.localIP().toString().c_str(), receiveUdpPort);
    
      digitalWrite(12, HIGH);
      delay(3500);
      float hum = dht.readHumidity();
      float temp = dht.readTemperature();
      digitalWrite(12, LOW);
      dtostrf(temp,5,2,charTemp); 
      dtostrf(hum,5,2,charHum);
      if (isnan(hum) || isnan(temp)) {
        Serial.println("Sensorfehler!");
        udp.beginPacket(IPudp,sendUdpPort);
        udp.write(UnitID);
        udp.write(" Sensorfehler\n");
        udp.endPacket();
      } 
      else {
      long rssi = WiFi.RSSI(); 
      Serial.println("Sending Sensordata");
      if (!udp.begin(receiveUdpPort)) {
       Serial.println("UDP Socketerror");
      }
      Serial.printf("Now sending UDP on port %d \n", sendUdpPort);
     
      udp.beginPacket(IPudp,sendUdpPort);
      udp.write(UnitID);
      udp.write(" ");
      udp.write(charTemp);
      udp.write(" ");
      udp.write(charHum);
      udp.write(" ");
      udp.write(rssi);
      sendingStat == udp.endPacket();
    
      yield();
      if(sendingStat = 1) {
        Serial.println("UDP Packet successful send");
      }
      else {
        Serial.println("UDP Packet not send");
      }
      Serial.println("Wait..");
      delay(500);
      Serial.print("   UDP Destination IP: :");
      Serial.println(IPudp);
      Serial.print("   UDP Port: ");
      Serial.println(sendUdpPort);
      Serial.print("   Device ID: ");
      Serial.println(UnitID);
      Serial.print("   Temperatur: ");
      Serial.println(charTemp);
      Serial.print("   Relative Luftfeuchte: ");
      Serial.println(charHum);
      Serial.print("   Daempfung: ");
      Serial.println(rssi);
      WiFi.disconnect();
      delay(500);
      Serial.println("ESP goes to deepsleep");
      ESP.deepSleep(15e6);
      }
    }
    Vielen Dank & Gruß

  2. #2
    HaWe
    Gast
    edit:
    hier ist was zu UDP samt fertigem Sketch:
    https://arduino-esp8266.readthedocs....-examples.html
    Geändert von HaWe (14.11.2018 um 09:44 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    UDP-Pakete senden geht eigentlich sehr einfach, aber das Empfangen nicht so sehr. Da muss man auch auf die Paketreihenfolge achten, das Paket, welches zuerst ankommt muss nicht das sein, was zuerst verschickt wurde. Wenn die Verbindung einwandfrei ist, müssten aber wenigstens alle Pakete ankommen. Habe selber mal einen UDP-Server in Java geschrieben und das dann so gehandhabt, dass ich wenigstens eine eigene Paketnummer (fortlaufend) in den Daten mitgeschickt habe, weil manchmal kommt es eben doch auf die Reihenfolge an.

    MfG

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    Vielen Dank für eure Antworten.
    Zum Beitrag von HaWe:
    Leider basiert dieses Beispiel auf die (ich glaube es nannte sich) POST GET Methode und ich möchte auf jeden Fall ein UDP-Paket senden.
    Zum Beitrag von Moppi:
    Die Nachteile zum TCP sind mir bekannt. Eine Reihenfolge ist bei nur einem Paket nicht so dramatisch
    Da ich die Pakete an Broadcast, also an alle sende, müsste ich diese ja immer mit Wireshark sehen. Ich sehe aber nur hin und wieder eines und die meisten Pakete sind entweder nie gesendet oder ich sehe diese einfach nur nicht. Ich bin leider kein Netzwerkprofi....

    Edit: Oh ich sehe gerade HaWe hat seine Antwort bearbeitet
    Anhand dieser Beispiele ist mein Quellcode bereits aufgebaut. Leider bringt mich das auch nicht weiter.
    Trotzdem vielen Dank

    Ich habe inzwischen einen weiteren NodeMCU probiert, dort zeigt sich gleiches Verhalten.
    Geändert von d2x (14.11.2018 um 15:01 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    @d2x
    Ja ich habe mir das gedacht, weiß aber nicht, wie man Dir anders helfen soll. War eine Motivation, dran zu glauben dass UDP eigentlich sehr gut funktioniert und einfach zu handhaben ist. Auf Tools die irgendwas sniffen sollen, würde ich mich nicht verlassen. Das ist aber meine persönliche Meinung. Ich würde eine Netzwerkverbindung bauen, die nachweislich funktioniert. Das betrifft auch die Nähe zum Router bei WLAN. Wenn ich dann das Versenden hinbekommen habe, würde ich eine Empfangsroutine bauen und schauen, dass ich das empfange, was versendet wurde. Wenn Du per Broadcast sendest können es eh alle empfangen. Daher würde ich als nächstes Wert auf den Empfänger legen und mich darum kümmern, dass das dort gelesen werden kann, denn dass es nicht ankommt, ist eher unwahrscheinlich; es sei denn, Deine Netzwerkadressen stimmen irgendwo nicht.

    Zur Vorsicht würde ich auch erst einmal nichts mit Deep Sleep machen, solang meine Netzwerkkommunikation nicht funktioniert. Immer eins nach dem andern.

    Der Link von HaWe sieht doch schon gut aus. POST und GET von HTML her hat nichts mit UDP-Paketen zu tun. Das Beispiel behandelt UDP-Pakete.

    Also: Warum bringt Dich das nicht weiter?
    dort zeigt sich gleiches Verhalten
    ... liegt wohl am Code

    MfG
    Geändert von Moppi (14.11.2018 um 15:48 Uhr)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    ... liegt wohl am Code
    Würde ich ja auch behaupten... Und da ich nicht genau verstehe wo das Problem ist, habe ich ihn oben gepostet
    Als Empfänger habe ich bereits meinen Laptop eingesetzt und habe dazu netcat (Linux) benutzt: "netcat -ul 5005". Die Pakete werden identisch mit Wireshark angezeigt. D.h. es werden viele Pakete nicht angezeigt.
    Die Distanz zum WLAN AP beträgt im übrigen 2m. Auch einen halben Meter daneben ändert sich nichts.
    Deepsleep und DHT22 habe ich bereits komplett aus dem Code eliminiert -> keine Änderung.
    Wenn mir jemand sagen könnte ob der Code Fehler beinhaltet, wäre ich dankbar.


    Danke und Gruß

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    HaWe hatte doch den Link - ich denke der Code von der Seite wird funktionieren (sollte also fehlerfrei sein). Damit würde ich es versuchen, wenn meins nicht funktioniert. Dort ist ja auch der UDP-Empfang drin. Und zum Probieren meine ich, kann man UDP-Pakete auch an sich selber schicken (mit Fragezeichen, das würde ich auch versuchen). Du sagst auch: Pythonscript soll das weiter verarbeiten. Daher willst Du das Paket mit was Anderem empfangen, als einem nodeMCU z.b. oder?

    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?
    Jedesmal machst Du anscheinend ein: WiFi.disconnect(); Ist das richtig? Was passiert, wenn Du mehrere Pakete verschickst, ohne WiFi.disconnect() zwischendurch?

    MfG
    Geändert von Moppi (15.11.2018 um 10:55 Uhr)

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    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.

    Klicke auf die Grafik für eine größere Ansicht

Name:	udp.png
Hits:	3
Größe:	105,9 KB
ID:	33789

    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:
    Klicke auf die Grafik für eine größere Ansicht

Name:	udp.png
Hits:	3
Größe:	144,2 KB
ID:	33791
    Geändert von d2x (15.11.2018 um 14:46 Uhr)

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Das ist in der Tat merkwürdig. Aber aus Erfahrung weiß ich: Du bist einen Schritt weiter.
    Ich bin nahe dran, den Code selber auf ein nodeMCU zu packen und es auszuprobieren. Es wäre möglich, das WiFiUdp.h Schuld daran ist, dass manche Pakete nicht ankommen. Aber nun gilt es, den Haken zu suchen, wo es hängt. Ist immer dasselbe Spiel: Fehler einkreisen, auch wenn es manchmal sehr mühevoll ist.
    Der Code, den Du oben hier reingestellt hast, ist der vollständig, dass man den einfach ausprobieren kann?
    Trotzdem würde ich ein zweites nodeMCU nutzen, um das auszuprobieren, ob dort auch nur die Pakete ankommen, die Du in den Tools bei Dir auch sehen kannst. Das müsste ja dann identisch sein.

    MfG

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    Trotzdem würde ich ein zweites nodeMCU nutzen, um das auszuprobieren, ob dort auch nur die Pakete ankommen, die Du in den Tools bei Dir auch sehen kannst. Das müsste ja dann identisch sein.
    Vollkommen identisch. Dieser NodeMCU ist sogar aus einer anderen Lieferung. Den Tipp mit der WiFiUdp.h finde ich gut! Ich werde mal sehen ob eine neue Version zu finden ist und werde berichten

Seite 1 von 5 123 ... LetzteLetzte

Ähnliche Themen

  1. Welches Paket für "Atom" installieren?
    Von RoboTrader im Forum Arduino -Plattform
    Antworten: 9
    Letzter Beitrag: 18.11.2017, 14:30
  2. nodeMCU zu nodeMCU: keine Kommunikations-Verbindung mehr nach wenigen Minuten
    Von HaWe im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 0
    Letzter Beitrag: 02.10.2017, 15:01
  3. Deepsleep oder Sleep
    Von hubert_K im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 02.09.2010, 13:32
  4. 1 Befehl für ein Paket von Befehlen?
    Von stani im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 10.10.2009, 12:42
  5. Keine RP6-CD im paket
    Von WarChild im Forum Robby RP6
    Antworten: 10
    Letzter Beitrag: 17.04.2009, 19:48

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress