ESP8266 Problem beim Senden mehrer Daten

Gast #4075837
Lesenswert?

Hallo zusammen,

ich bearbeite zur Zeit ein Projekt, bei dem alle 10 Minuten die 
Temperatur an eine Datenbank gesendet wird. Das ganze findet über ein µC 
in Verbindung mit dem ESP8266 statt. Das  funktioniert auch wunderbar 
mit einem HTTP Get-Request im Stil:
"GET URL?temperatur=XXX HTTP/1.1\r\nHost: HOST\r\n\r\n";

Nun werden die Temperaturen gespeichert, wenn keine WLAN-Verbindung 
besteht und sollen auf einmal rausgesendet werden wenn wieder eine 
Verbindung besteht. Dies habe ich mit einer for-Schleife gelöst, die die 
Get-Request durchführt. Nach 11 Request gibt der Server allerdings ein 
"403 Forbidden" zurück. Weiß jemand wieso das so ist?

Gibt es eine elegantere Lösung als dieser Get-Request, bei dem man 
direkt das ganze Array übergeben kann? Das übergeben des Arrays mit:
"GET 
URL?temperatur[]=XXX&temperatur[]=XXX&temperatur[]=XXX&...temperatur[]=X 
XX  HTTP/1.1\r\nHost: HOST\r\n\r\n";
führt zu zu langen Befehlen die vom ESP8266 nicht mehr verarbeitet 
werden können.

Viele Grüße
Andy
Gast #4075874
Lesenswert?

> Grundsätzlich nimmt man POST wenn GET zu wenig Platz hat.

Allerdings habe ich dich (Andy) so verstanden, dass sein Mikrocontroller 
zu wenig Speicher hat, um den Request zu erzeugen. Da wird ihm ein POST 
auch nicht helfen.

Bei dem ESP-01 Modul darf ein Datenpaket maximal 1024 Bytes groß sein. 
Wenn du mehr Daten senden willst, musst du es in mehrere AT Befehle 
aufsplitten.

Du kannst beim HTTP Protokoll (sowohl bei GET als auch POST) jeden 
Parameter mehrfach senden, also so:

URL?name=wert&name=wert&name=wert

Alle mir bekannten Webserver Libraries kommen damit klar. Aber das würde 
ich nicht so machen, weil die Wiederholung der Parameter-Namen unnötig 
Platz vergeudet. Du kannst Werte ja auch einfach aneinander Reihen:

URL?temperaturen=20.1,20.2,20.3,20.4,20.4,20.3,20.1

Weiterhin leuchtet mir nicht ein, warum der Speicher deines dich daran 
hindert, viele Daten auszugeben. Du brauchst doch einfach nur in einer 
Schleife Zahl für Zahl ausgeben. Etwa so:
1
printf("AT+CIPSEND=%i\r\n",43+anzahl*3);
2
puts("GET URL?temperaturen=");
3
for (int i=0; i<anzahl; i++) {
4
    printf("%f2.1",temperatur[i]);
5
}
6
puts("HTTP/1.1\r\nHost: HOST\r\n\r\n");

Wobei das ganze noch erheblich sparsamer wird, wenn man auf 
Fließkommazahlen verzichtet. Statt 20.1°C könntest du auch 201 
übertragen.

Aber denke an das 1KB Limit. Ab einer gewissen Anzahl von Werten musst 
du es in mehrere AT Befehle splitten.
Gast #4075893
Lesenswert?

Danke schon mal für eure Antworten.

Nicht der Speicher des uC hindert mich daran, sondern wie du Stefan 
schon gemeint hast die 1024 Byte für den AT-Befehl.
Hab ich es richtig verstanden, dass ich nicht alles in einen Befehl 
packen muss, sondern auch einen Request auf 3 Befehle aufteilen kann? 
Das wäre natürlich die Lösung :)
Gast #4076360
Lesenswert?

Stefan Us schrieb:
> Aber denke an das 1KB Limit. Ab einer gewissen Anzahl von Werten musst
> du es in mehrere AT Befehle splitten.

Viele Dank, klappt jetzt genau so wie ich will. Da sah ich wohl den Wald 
vor lauter Bäumen kaum.

Da der Server die Request-Länge akzeptiert hab ich es weiterhin mit 
einem GET-Request gelöst.
Gast #4076847
Lesenswert?

> Hab ich es richtig verstanden, dass ich nicht alles in einen Befehl
> packen muss, sondern auch einen Request auf 3 Befehle aufteilen kann?

Ja, das HTTP Protokoll interessiert sich nicht dafür, in wie viele 
Pakete der Request aufgeteilt ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren