Guten Tag,
ich brauche mal wieder Hilfe.
Arduino Mega bastelt einen GET-String zusammen, nach folgenden Schema.
if (client.connect(server_wolke, 80)) { // TRUE => connection
client.print("GET /");
client.print(strphpDatei); // php-Datei
client.print("?");
...
...
for (k = 0; k < AnzahlSensoren; k++) { // Schleife über Sensor-Array
sNr = ++sNr;
client.print(F("&B")); // Kennung für Bezeichnung -> Feldname
client.print(sNr); // lfd Nr
client.print(F("="));
client.print(sensorList[k].bez);
client.print(F("T")); // Kennung für Wert -> Temperatur
client.print(F("&W")); // Kennung für Wert
client.print(sNr); // lfd Nr
client.print(F("="));
client.print(sensorList[k].isttemp);
...
...
} // Ende for AnzahlSensoren
client.println( " HTTP/1.1");
client.println( "Host: 192.168.0.23" );
client.print(" Host: ");
client.println(server_wolke);
client.println( "Connection: close" );
client.println();
client.println();
client.stop();
} // Ende if client.connect
Folgende php-Datei nimmt die Daten in Empfang und leitet sie an meine mySQL-Datenbank weiter:
<?php
include("dbconnect.php");
$tabelle = "hzg.temp";
$counter=1;
$max = 67;
$spalten = $_GET["B0"];
$werte = $_GET["W0"];
while ( isset( $_GET["B".$counter] ) AND $counter <= $max )
{
$spalten = $spalten.", ".$_GET["B".$counter];
$werte = $werte."', '".$_GET["W".$counter];
$counter++;
}
$SQLstring = "INSERT INTO hzg.temp ( ".$spalten." ) VALUES ( '".$werte."' )";
mysql_query($SQLstring);
?>
Alles funktioniert sehr gut.
ABER: Es sollen mehr Datenpaare übertragen werden als mit obiger Prozedur möglich ist.
Nun lese ich überall, dass dann GET ungeeignet ist und man POST nehmen soll. Ich finde aber leider kein Beispiel und keinen Hinweis wie ich das umsetzen könnte. Bin sehr hilflos.
Ich hoffe auf Hilfe. Danke schon mal.
Gruß Gerd
Du musst min. 2 zusätzliche Header senden:
- Content-Type: application/x-www-form-urlencoded
- Content-Length: xxxxxxx
Und im Request Body dann deine Parameterliste.
Genauso zusammengestellt, wie die Get Parameterliste.
Oh je. Ich verstehe nur Bahnhof.
Ich fange am Ende an.
Genauso zusammengestellt, wie die Get Parameterliste.
Bei GET wurden die Wertepaare mit "&" verknüpft. Geschieht das bei POST auch so?
Und im Request Body dann deine Parameterliste.
Was ist der Request Body? Wodurch ist er gekennzeichnet?
2.Content-Length: xxxxxxx
Muss ich die Länge zählen? Die Länge der Wertepaare oder ALLER zu sendenden Zeichen?
1.Content-Type: application/x-www-form-urlencoded
Ist das so anzugeben? Oder was ist durch was zu ersetzen.
Sorry, das ich so unwissend bin.
Gruß Gerd
Ja.
Der Header wird vom Body durch 2 Zeilenenden getrennt.
Ja. Die Bodylänge.
Ja. Es gibt aber auch noch Alternativen.
Das Problem der Unwissenheit lässt sich beheben...
Mein Google-Suche-und-Lese-Tipp: "HTTP RFC 2616"
hi,
beispiel, wie ein post gemacht wird:
http://forum.arduino.cc/index.php?topic=156252.msg1170775#msg1170775
die länge mußt Du angeben, aber es wird nicht mit & zusammengebaut, sondern Du arbeitest wie mit variablen..
gruß stefan
Eisebaer:
hi,
beispiel, wie ein post gemacht wird:
Arduino als Haussteuerung Wifi und 230V Schaltung - #2 by Eisebaer - Deutsch - Arduino Forum
die länge mußt Du angeben, aber es wird nicht mit & zusammengebaut, sondern Du arbeitest wie mit variablen..
gruß stefan
Wenn ich da ganz lange suche und klicke finde ich bestenfalls einen webduino Server.
Aber gerd-wolfgang möchte einen Client implementieren.
Also POST Daten senden, nicht empfangen.
Oder habe ich da doch was übersehen?
hi,
nein, combie, hast Du nichts übersehen. ich hab' nicht aufmerksam genug gelesen und angenommen, daß es so ist wie meistens.
gruß stefan
andererseits...
ist im sketch ja auch der html- und js-quelltext für den client enthalten und wie man einen POST zusammenbaut...
Benutze die F()-Makro bei print Funktionen von Text. Das spart RAM.
client.print(F("GET /"));
Grüße Uwe
gelöscht. bin einem Irrtum aufgesessen
Hallo,
Danke für die viele Mühe.
Das fehlende print(F("")) ist "nur" eine Nachlässigkeit.
Ich habe mal versucht, die zu übertragenden Strings zu extrahieren.
bisher mit GET:
GET /strphpDatei.php?B0=Zeit&W0=1432220182&B1=OLT&W1=22.56&B2=OLS&W2=23.00&B3=OLD&W3=1&B4=OMT&W4=22.50&B5=OMS&W5=22.00&B6=OMD&W6=0&B7=ORT&W7=22.37&B8=ORS&W8=21.00&B9=ORD&W9=0 HTTP/1.1
Host: 192.168.0.23
Host: server_wolke // im Klartext: 192.168.0.23 -> warum 2x ? warum ein Leerzeichen zu Beginn?
Connection: close
-leerzeile-
-leerzeile-
-client.stop-
Die erste Zeile geht von GET bis /1.1
Von mir jetzt das obige umgesetzt auf POST:
POST /strphpDatei.php HTTP/1.1
Host: 192.168.0.23
User-Agent: Arduino/1.0 // habe ich abgeschrieben
Connection: close // habe ich abgeschrieben, warum wird hier schon geschlossen
Content-Type: application/x-www-form-urlencoded
Content-Length: -PostData.length-
-leerzeile-
-leerzeile-
B0=Zeit&W0=1432220182&B1=OLT&W1=22.56&B2=OLS&W2=23.00&B3=OLD&W3=1&B4=OMT&W4=22.50&B5=OMS&W5=22.00&B6=OMD&W6=0&B7=ORT&W7=22.37&B8=ORS&W8=21.00&B9=ORD&W9=0
-leerzeile-
-leerzeile-
-client.stop-
Zwischen den 2x-leerzeile- ist alles eine Zeile.
Habe ich das richtig verstanden und umgesetzt? Kann ich das so verwenden?
Gruß Gerd
Brich dir keinen ab wegen dem Content-Length, das Feld ist optional und nur wichtig wenn die gleiche Verbindung für weitere Übertragungen weiterverwendet werden soll.
Das beruhigt mich. Ich hätte sonst ein Problem.
Ist denn sonst mein Entwurf funktionsfähig?
Ich versuch's mal nochmal.
Leider habe ich im Internet nach intensiver Suche keine für mich verständliche Beschreibung von POST gefunden, mi Eigenschaften und Optionen, ähnlich den Arduino-Referenzen.
Meine obige erste Umsetzung von GET auf POST habe ich nach meinem aktuellen Wissen geändert.
POST /strphpDatei.php HTTP/1.1
Host: 192.168.0.23 // hier befindet sich der Server
User-Agent: Arduino/1.0 // habe ich abgeschrieben, muss wohl nicht sein
Connection: close // habe ich abgeschrieben, warum wird hier schon geschlossen
Content-Type: application/x-www-form-urlencoded
Content-Length: // muss das sein? darf der Wert auch viel größer sein
B0=Zeit&W0=1432220182 ... Datenpaare ... &B9=ORD&W9=0
-client.stop-
Dass diese Zeilen mit client.print() einzeln gesendet werdenmüssen ist klar.Ist dies lauffähig?
Gruß Gerd