Decke:
Ist es überhaupt möglich mit der Standard AVR String-Bibliothek die gleiche Funktion zu erreichen? Nämlich die Webwerte zu empfangen und in Variablen zu speichern?
Ja, natürlich.
Mit weniger Code, schnellerer Verarbeitung, ohne Drittanbieter-Libraries und ohne String-Objekte.
Im Endeffekt brauchst Du ja nur die "GET" Zeile aus dem HTTP-Request als (nullterminierten) String.
Und den String kannst Du dann auf Variablennamen und Werte parsen.
Decke:
Wenn ja hätte einer vielleicht ein kleines Beispiel für mich?
Für Deinen Anwendungsfall mit Ein-/Aus-/Blinkschaltungen habe ich jetzt nichts direkt da, aber nur um mal ein wenig strukturierte Programmierung zu zeigen habe ich hier mal was aus meiner Festplatte rausgezogen (hoffe, der Schnipsel funktioniert):
#include <SPI.h>
#include <Ethernet.h>
char linebuf[81]; // buffer for line length 80 and terminating '\0' character
// the next two lines must contain unique MAC and IP address in your LAN network
byte mac[] = { 0x00, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 250 };
EthernetServer server(80);
char* readGetRequest(EthernetClient &client)
{
int charcount=0;
memset(linebuf,0,sizeof(linebuf));
// http GET request is first line of request and
// ends with a '\n' newline character
while (client.connected())
{
if (client.available())
{
char c = client.read();
if (charcount<sizeof(linebuf)-1)
{
linebuf[charcount]=c;
charcount++;
}
if (c == '\n') break; // end of header found, break while-loop
}
}
return linebuf;
} // void readClientRequest(EthernetClient &client)
void sendEchoResponse(EthernetClient &client, char* text)
{
client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/plain"));
client.println();
client.println(text);
}
void setup(){
Serial.begin(115200);
Ethernet.begin(mac, ip);
Serial.print("Server is at: ");Serial.println(Ethernet.localIP());
}
void loop()
{
EthernetClient client = server.available();
if (client)
{
char* request=readGetRequest(client);
Serial.print("Got HTTP Request: ");
Serial.println(request);
sendEchoResponse(client, request);
client.flush();
client.stop();
}
}
Dieser Code macht jetzt nur folgendes:
Der GET-Request wird in einen allgemeinen Zeilenpuffer "linebuf" eingelesen, und danach als Echo-Antwort in einer einzeiligen Textdatei an den Browser zurück gesendet.
Natürlich könnte man diese Zeile jetzt parsen (typische Standardfunktion dafür wäre "strtok()" und keinesfalls "finder.find()"), Werte auslesen und ggf. in numerische Variablen umwandeln, und dann weiter verarbeiten.
Das ist jetzt natürlich nur mal ein ganz kleines Beispiel (ohne Parsen von Variablen), aber ein "String" Objekt kommt darin schon mal nicht vor, sondern die GET-Anfrage landet in einem nullterminierten String (char Array) und könnte mit strtok() nun weiter zerlegt und dann verarbeitet werden.
Edit/Nachtrag:
Deine Webseite scheint auch überhaupt nicht interaktiv zu sein und ein Feedback zu senden, was aktuell gerade geschaltet ist, sondern es wird eine immer gleichbleibende statische HTML-Seite gesendet, auf der man nur sehen kann, was man schalten kann:
webFile = SD.open("index.htm"); // Website laden
if (webFile)
{
while (webFile.available())
{
client.write(webFile.read()); // Website an Client schicken
}
webFile.close();
Poste doch mal den Inhalt der "index.htm" Datei, dann kann ich ggf. mal schauen, ob ich Dir dafür einen einfachen Parser schreiben kann, der Dir gepostete Variablen verändert, so dass Du anhand der Variablen dann Deine Lichter steuern kannst.
Übrigens habe ich gesehen, dass da teilweise "blinken" gesteuert werden soll. In dem Fall will ich doch wohl hoffen, dass Du da SSR Halbleiterrelais zum Schalten verwendest und keine mechanischen Relais? Ansonsten schau mal in das Relais-Datenblatt! Viele einfache mechanische Relais sind gerade mal auf 100000 Schaltvorgänge unter Nennlast ausgelegt, und wenn Du ein mechanisches Relais beispielsweise ein dutzendmal pro Minute mit Nennlast schaltest, dann kannst Du Dir mal ausrechnen, nach wie vielen Minuten Betriebsdauer Du das nominelle Lebensende des mechanischen Relais erreicht haben wirst!