POST an Webserver "sicher" abschicken ?

Hallo,

ich schicke dem Service auf meinem Webserver regelmäßig (alle paar Minuten) 6 Messwerte.
Sieht konkret so aus:

 data = "param=Hum_DHT11&user="+ String(ipaddress) +"&value="+String(Humidity_DHT11)+"&p1="+String(deviceID) + "&p2="+WiFi.RSSI()+"&p3="+String(millis()/1000);
    Serial.println("POST1:   "+String(data));
    poster.println("POST /api/values HTTP/1.1");
    poster.println("Host: " + String(host));
    poster.println("Content-Type: application/x-www-form-urlencoded");
    poster.print("Content-Length: ");
    poster.println(data.length());
    poster.println();
    poster.println(data);
    Serial.println();
    delay(500);

Das ist ein Post, darunter folgen noch 5 weitere.
Bei jedem Durchgang schafft das Programm 4-5 Posts, die letzten 1-2 schlagen jedesmal fehl.

Ich bekomme zwar keine Fehlermeldung (weil ich nicht weiß wie ich das abfangen kann), aber die Daten tauchen am Server nicht auf.
Ich hab jetzt schon nach jedem POST 500ms delay eingebaut, das ändert aber genau gar nichts, weder zum besseren noch zum schlechteren.

Die einzige Lösung die mir jetzt noch einfällt ist die, bei jedem loop()-Durchlauf nur einen Wert abzulegen, aber das muss doch auch sauberer gehen, oder ?

lG
Gawan

Ich würde mal sagen das F()-Makro spart RAM.

Dann sage ich: zuwenig Info für mehr Antworten.

Grüße Uwe

Was ist ein F()-Makro ?
Kann das tatsächlich ein RAM-Problem sein ?
Welche Infos fehlen denn ?

Gawan:
Was ist ein F()-Makro ?
Kann das tatsächlich ein RAM-Problem sein ?
Welche Infos fehlen denn ?

Schon mal nach F Makro gegoogelt? Z.B. anstatt
poster.println("POST /api/values HTTP/1.1");
machst du
poster.println(F("POST /api/values HTTP/1.1"));

RAM Problem sehr gut möglich, da du sogar mit Stringobjekten arbeitest.

Fehlende Informationen: Der gesamte Sketch und welches Board du nimmst.

Und du solltest dringend die Antwort vom Server abfragen und ausgeben.

Ich bekomme zwar keine Fehlermeldung (weil ich nicht weiß wie ich das abfangen kann), aber die Daten tauchen am Server nicht auf.

Der Server sendet einen STATUS in seinem Response.
Damit beantwortet er jeden Request.

Geht das mit dem F-Macro eigentlich auch bei "display.print"?

ElEspanol:
Schon mal nach F Makro gegoogelt? Z.B. anstatt
poster.println("POST /api/values HTTP/1.1");
machst du
poster.println(F("POST /api/values HTTP/1.1"));

RAM Problem sehr gut möglich, da du sogar mit Stringobjekten arbeitest.

Fehlende Informationen: Der gesamte Sketch und welches Board du nimmst.

Und du solltest dringend die Antwort vom Server abfragen und ausgeben.

Ich geh mal davon aus. Aber ausprobieren gibt dir die Antwort. Kommt auf deine Lib für das Display an.

Wenn es kompiliert und du weniger RAM Verbrauch hast, funktioniert es.

Nee, schade. Leider geht es nicht.

Hier steht was über RAM Speicher sparen. Geht wohl nur bei serial.println. Bei display.print kommt eine Fehlermeldung.

Das mit dem "fragmentiertem RAM" hab ich nicht verstanden...

http://www.avrfreaks.net/forum/tut-c-gcc-and-progmem-attribute?name=PNphpBB2&file=viewtopic&t=38003 erklärt es doch recht gut

In einen richtigen und vollständigen HTTP-POST gehört die übermittelte Datenlänge (Anzahl Bytes), kann ich in deinem Code nicht finden ...

Ist es nicht das:

poster.println(data.length());

?

Das mit der Datenlänge denkt das poster.println(data.length()); ab

Die Verwendung von poster.println(F(“POST /api/values HTTP/1.1”));
liefert mir einen massiven Fehler, wieder mal was das der NodeMCU nicht kann wahrscheinlich

In file included from C:\Users\Gawan\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0\cores\esp8266/Arduino.h:230:0,
                 from C:\Program Files (x86)\Arduino\libraries\Dht/dht.h:18,
                 from Environmental_Project_2.5.ino:11:
Environmental_Project_2.5.ino: In function 'void loop()':
C:\Users\Gawan\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0\cores\esp8266/pgmspace.h:18:69: error: initializer fails to determine size of '__c'
 #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];}))
                                                                     ^
C:\Users\Gawan\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0\cores\esp8266/WString.h:38:74: note: in expansion of macro 'PSTR'
 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
                                                                          ^
Environmental_Project_2.5.ino:202:20: note: in expansion of macro 'F'
C:\Users\Gawan\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0\cores\esp8266/pgmspace.h:18:69: error: array must be initialized with a brace-enclosed initializer
 #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];}))
                                                                     ^
C:\Users\Gawan\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0\cores\esp8266/WString.h:38:74: note: in expansion of macro 'PSTR'
 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
                                                                          ^
Environmental_Project_2.5.ino:202:20: note: in expansion of macro 'F'
Error compiling.

Landen Strings auf dem ESP8266 überhaupt in RAM? Auf dem Due, bzw. den älteren ARMs braucht man das nämlich nicht. Auf den AVRs ist das nur durch die Harvard-Architektur so.

Leider finde ich auch keine Möglichkeit die Rückgabe sinnvoll zu verwerten:

Returns

byte: returns the number of bytes written, though reading that number is optional

Das hilft mir jetzt nicht sonderlich viel :frowning:

Dann mach doch mal für den Anfang als Fingerübung einige Beispiele mit GET und der Auswertung/Darstellung der Antwort. Idealerweise nichtblockierend, aber trotzdem mit Timeout.

Das kannst du dann auf POST umstricken.

Mein Webservice kann leider nur POST

haja keine frage, wie solls sonst gehen

naja, wenn ElEspanol sagt ich soll mit GET testen ...

GET ist einfacher zu implementieren.

Da kann ich ohne Arduino von einem Browser aus testen, ob die Serverseite funktioniert. Danach mach ich mich an den Arduino und habe somit die Fehlerquelle "Server" schon ausgeschlossen.

Wenn das alles geht, hab ich mehr Erfahrung und mach mich dann ans POST, wenn dies dann überhaupt noch notwendig ist.

Und der erste Schritt, ich lerne, wie ich auf lange (>1ms) delays verzichten kann.

Gawan:
Mein Webservice kann leider nur POST

Was ist das für einer?

Der Webserver funktioniert, 5 von 6 meiner POSTs gehen ja IMMER - und wenn ich alle 6 einzeln absetze klappts auch.

Das Webservice hat mir ein Mitarbeiter programmiert damit ich was zum Spielen hab :slight_smile:
läuft auf IIS

Und 2 andere NodeMCU legen dort produktiv rund um die Uhr Daten im Minutentakt ab - also daran liegts ned

Es spießt sich irgendwo in meinem Sketch der eben 6 Posts hintereinander absetzen will ...