Forum: Mikrocontroller und Digitale Elektronik ESP8266 Problem beim Senden mehrer Daten


von Andy (Gast)


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

von Student (Gast)


Lesenswert?

Mit dem 403 wird wohl keiner erraten können ohne Kenntnis über den 
Server.

Und ich kenne die ESPs nicht, aber grundsätzlich nimmt man POST wenn GET 
zu wenig Platz hat.

von Stefan F. (Gast)


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.

von Andy (Gast)


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 :)

von Andy (Gast)


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.

von Stefan F. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.