Auf den Arduino lese ich mit der read Methode der Ethernet Lib ein, was der Browser zum Server (Arduino) schickt.
Beim Betätigen der Buttons kommt dies, leider fehlt nach den Post der value Wert.
Warum ??
Dein Browser sagt, dass nach dem Header 13 Bytes Daten kommen.
Also ich glaube dem Browser, dass er diese 13 Bytes tatsächlich sendet.
Das glaube ich auch, nur wie komme ich da dran ?
while (client.connected()) {
if (client.available()) {
char c = client.read();
HTTP_req += c;
...
Ich lese so in den HTTP_req String ein, und bekomme nur den Header (also das was ich gepostet habe).
Es liegt der Verdacht nahe das read() von der Ethernet Lib nur den Header zurückgibt ???
Ich meine auch gelesen zu habe das dies mit der read() Methode nicht funktioniert - stimmt das ?
PS: Ich weiß, hier wird ein String Objekt benutzt. Das ist ein Projekt das ich vor ca. 1 Jahr angefangen habe, und immer weiter wächst.
Inzwischen würde ich auch kein String Objekt mehr nutzen, bzw ich habe vor auf char arrays umzustellen.
Das ist aber hier nicht das Problem.
rudirabbit:
Ich lese so in den HTTP_req String ein, und bekomme nur den Header (also das was ich gepostet habe).
Es liegt der Verdacht nahe das read() von der Ethernet Lib nur den Header zurückgibt ???
client.read() liefert aus einer bestehenden Client-Verbindung alle Zeichen, die der Client sendet, ohne dass zwischendurch ein Timeout auftritt.
Header + Content.
Es steht allerdings zu vermuten, dass Du in Deiner while-Schleife, von der Du nur einen kleinen Ausschnitt zeigst, eine Abbruchbedingung gesetzt hast, mit der die Schleife nach dem Header verlassen und die Client-Verbindung danach geschlossen wird. Dann landet der gesendete Content im Orkus nachdem der Header empfangen wurde.
Ein Programm macht immer das, was Du programmiert hast.
Wenn Du keinen HTTP-Content empfängst, obwohl Du welchen gesendet bekommst, dann liegt das daran, dass Du das so programmiert hast.
client.read() liefert aus einer bestehenden Client-Verbindung alle Zeichen, die der Client sendet, ohne dass zwischendurch ein Timeout auftritt.
Das wollte ich bestätigt haben, danke !
Es handelt sich im Prinzip um den Beispielcode aus der Lib der wohl nur den Header liest und dann die Verbindung schließt.
Ich meinte den Datenaustausch zwischen Server und Browser verstanden zu haben, das ist offensichtlich nicht so.
EthernetClient client = server.available();
if (client) {
authentificated=false;
//Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
HTTP_req += c;
if (c == '\n' && currentLineIsBlank) {
Process_switcher(client);
Site_Swichter(client);
if (authentificated) {
if (page==1) sendhtmheader_css_neu(client);
if (page==2) sendhtlmheader_css_page2(1,client);
if (page==3) sendhtlmheader_css_page2(2,client);
if (page==4) sendhtlmheader_css_page4(client);
}
else
SendAuthentificationpage(client);
break;
}
if (c == '\n') {
// you're starting a new line
if (HTTP_req.indexOf("Authorization: Basic")>0 && HTTP_req.indexOf("xxxxxxxxxxxxxxxx=") >0)
authentificated=true;
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
delay(1);
// close the connection:
client.stop();
//Serial.println("client disonnected");
HTTP_req="";
}
}
Es handelt sich im Prinzip um den Beispielcode aus der Lib der wohl nur den Header liest und dann die Verbindung schließt.
Ja klar, so steht es da:
if (c == '\n' && currentLineIsBlank) {
// mache irgendwas
break; // ==> SCHLEIFE VERLASSEN!
}
...
// close the connection:
client.stop(); ==> VERBINDUNG ABWÜRGEN
Der Header ist zuende, wenn im Header eine Leerzeile vorkommt, also ein Zeilenendezeichen nach einer leeren Zeile folgt. Dann beendest Du Deine Empfangsschleife.
Nach dem Empfang des Headers liest Du kein einziges Byte mehr.
Wenn Du die 13 Bytes empfangen möchtest, die im Header angekündigt sind, mußt Du diese 13 Bytes natürlich empfangen, BEVOR Du mit client.stop() die Verbindung beendest.
Der Header ist zuende, wenn im Header eine Leerzeile vorkommt, also ein Zeilenendezeichen nach einer leeren Zeile folgt. Dann beendest Du Deine Empfangsschleife.
In diesem Kontext verstehe ich dann den Code auch.
Wobei ich das auch vorher, also ohne dieses Wissen wann ein Header zu Ende ist, dies rein aus dem Code entnehmen hätte können. (müssen)
Ich denke nun schon was ich machen muss damit die Schleife x Content-Length Bytes nach Headerende weiterliest.
So, dank des Tips von jurs kann ich nun auch die Content-Length Bytes einlesen.
Der Rest ist dann nur noch parsen und darauf reagieren, hier ein Relais ein oder ausschalten.
Ein Problem habe ich aber noch, das geht wohl in die HTML Richtung.
Wenn ein Botton gedrückt wird, der Browser schickt dann die Post Bytes. Relais zieht an oder schaltet ab, alles wie gewollt.
Wenn ich aber den Browser die Seite neu laden lasse (Refresh Botton des Browsers) , schickt er die Post Bytes nochmal.
Solange sich nur ein Client eingeloggt hat, spielt das keine Rolle.
Wenn aber zwei Clients online sind, gibt es beim Refresh komische Effekte mit den Relais.
Kann man dies ausschalten ? Steckt wohl im Browser Cache drin.