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
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.
> 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.
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 :)
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.