ich habe einen kleinen Webserver zum schalten diverser Dinge aufgebaut.
Nun möchte ich aber die Webseite anstatt von der SD-Karte direkt von meinem Server laden und senden lassen,
qusai anstatt SD.read dann 192.168.2.223
Das Thema hatten wir doch schon in einem anderen, alten Thread. Was soll denn nochmal genau der Vorteil sein, wenn die Webseite statt von der SD-Karte von einem Server geladen werden soll?
Schneller wird es vermutlich kaum werden und mehr Speicher verbraucht das Ganze ggf. auch noch.
Wenn Du einen Arduino Uno oder ähnliches, also ATMega328 mit 2kB SRAM hast, dann wird es mit Speicher schon knapp.
So wie Du das beschreibst, baut ein Browser eine Verbindung zum Arduino auf und fordert die Seite an. Der Arduino baut dann von sich aus eine Netzwerkverbindung zu Deinem Webserver auf und lädt dort die Seite runter, die alleine schon fast 8kB groß ist, also nicht komplett in den Speicher Deines Arduino passt. Du musst also die Daten gleichzeitg von Deinem Server laden und sofort an den Browser weitersenden.
Die Seite generiert schon Ajax Requests, womit nach dem initialen Laden zumindest nicht immer wieder die ganze Seite übertragen werden muss, sondern nur die Status-Updates.
Das Thema hatten wir doch schon in einem anderen, alten Thread. Was soll denn nochmal genau der Vorteil sein, wenn die Webseite statt von der SD-Karte von einem Server geladen werden soll?
Schneller wird es vermutlich kaum werden und mehr Speicher verbraucht das Ganze ggf. auch noch.
Ich war davon ausgegangen, daß ohne die SD-LIB erstmal sowieso mehr Speicher da ist und
da die Ethernet ja schon da ist.....
Man muss ja nicht die ganze Seite erst laden und dann senden, ein Byte lesen und senden, dann das nächste.
Sicher, daß das mehr als die SD-LIB verbraucht?
Ich würde daß gerne mal probieren, kannst Du mir verraten, wie man die Verbindung zum Server dann aufbauen müsste?
Besser wäre es, die Seite von Deinem Webserver an den Browser auszuliefern und nur die AJAX-Zugriffe auf den Arduino zu lenken.
Du musst dazu aber die "same-origin policy" umgehen.
DAS wäre natürlich ideal, aber völlig Neuland für mich
mega-hz:
Ich war davon ausgegangen, daß ohne die SD-LIB erstmal sowieso mehr Speicher da ist und
da die Ethernet ja schon da ist.....
Man muss ja nicht die ganze Seite erst laden und dann senden, ein Byte lesen und senden, dann das nächste.
Sicher, daß das mehr als die SD-LIB verbraucht?
Ich würde daß gerne mal probieren, kannst Du mir verraten, wie man die Verbindung zum Server dann aufbauen müsste?
Naja, nicht nur die Ethernet-Lib verbraucht Speicher, sondern auch die Datenstrukturen für jede Verbindung.
Und davon hast Du dann zwei parallel.
Was für einen Arduino verwendest Du denn? Einen Uno, Nano etc, oder einen Mega?
Wenn Du immer ein Byte liest und dann weiterschickst, dann werden im ungünstigsten Fall fast 2x8000 TCP Pakete für die Webseite verschickt. Das kann nicht wirklich schnell sein.
Wenn Du das Testen willst, dann schau Dir mal das WebClient Beispiel aus der IDE an (findet sich unter den Ethernet Beispielen). Dort wird die Google Seite aufgerufen und die Suche nach "arduino" auf dem seriellen Monitor ausgegeben. Statt das auszugeben musst Du das halt nur in die Verbindung schreiben welche die Seite vom Arduino abrufen will.
ich habe einen kleinen Webserver zum schalten diverser Dinge aufgebaut.
Nun möchte ich aber die Webseite anstatt von der SD-Karte direkt von meinem Server laden und senden lassen,
qusai anstatt SD.read dann 192.168.2.223
weiss jemand wie man das machen könnte?
Wenn eine Webseite von einem Server angefordert, aber von einem anderen Webserver ausgeliefert werden soll oder die URL-Adresse während des Seitenabrufs auf demselben Server die URL-Adresse Verzeichnis/Datei/Parameter) ändern soll, dann gibt es dafür seit 40 Jahren den Mechanismus der HTTP-Umleitung (Redirection).
Das funktioniert über die HTTP Statuscodes 301 und 302.
Wenn ein Webserver eine bei ihm angeforderte Webseite nicht selbst auf direkte Art ausliefern möchte wie sie angefordert wurde, dann sendet als Antwort er NICHT Statuscode 200 OK, sondern er sendet Statuscode 301 oder 302 mit einer neuen Adresse als Antwort, nämlich der Umleitungsadresse, wo der Webclient sich die Seite tatsächlich abholen soll.
Alle HTTP-konformen Webclients (alle Webbrowser) verfahren wie folgt:
Wenn sie eine Seite anfordern und als Antwort nicht Statuscode 200 OK, sondern Statuscode 301 oder 302 und eine neue Adresse bekommen, machen das:
die aktuelle HTTP-Seitenanforderung abbrechen.
-und sofort eine Seite bei der genannte Umleitungsadresse anfordern
Siehe beispielsweise HTTP 302 - Wikipedia
Und siehe natürlich die einschlägigen Richtlinien (RFCs, die sich quasi 40 Jahre lang nicht geändert haben und trotzdem kann bis heute noch jeder Webbrowser auf HTTP-Statuscode 302 richtig reagieren und die Seite statt an einer ursprünglichen Adresse an der URL-Umleitungsadresse abfordern.
Diesen Umleitungs-Mechanismus auf eine andere Seite kannst Du sehr einfach auch mit einem Arduino-Webserver realisieren.
void loop()
{
canbus();
EthernetClient client = server.available(); // try to get client
if (client)
{ // got client?
boolean currentLineIsBlank = true;
while (client.connected())
{
digitalWriteFast(A0, HIGH);
if (client.available())
{ // client data available to read
char c = client.read(); // read 1 byte (character) from client
// limit the size of the stored received HTTP request
// buffer first part of HTTP request in HTTP_req array (string)
// leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
if (req_index < (REQ_BUF_SZ - 1))
{
HTTP_req[req_index] = c; // save HTTP request character
req_index++;
}
// last line of client request is blank and ends with \n
// respond to client only after last line received
if (c == '\n' && currentLineIsBlank)
{
// send a standard http response header
client.println(F("HTTP/1.1 200 OK")); <<<<<<<<<<<<<<<<<<< 301? und dann?
// remainder of header follows below, depending on if
// web page or XML page is requested
// Ajax request - send XML file
if (StrContains(HTTP_req, "ajax_inputs"))
{
// send rest of HTTP header
client.println(F("Content-Type: text/xml"));
client.println(F("Connection: keep-alive\n"));
SetLEDs();
// send XML file containing input states
XML_response(client);
}
else
{ // web page request
// send rest of HTTP header
client.println(F("Content-Type: text/html"));
client.println(F("Connection: keep-alive\n"));
// send web page
webFile = SD.open("/WEB-IO2.HTM"); // open web page file
if (webFile)
{
while(webFile.available())
{
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
}
// display received HTTP request on serial port
// reset buffer index and all buffer elements to 0
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
}
// every line of text received from the client ends with \r\n
if (c == '\n')
{
// last character on line of received text
// starting new line with next character read
currentLineIsBlank = true;
}
else if (c != '\r')
{
// a text character was received from client
currentLineIsBlank = false;
}
} // end if (client.available())
} // end while (client.connected())
delay(2); // give the web browser time to receive the data
client.stop(); // close the connection
digitalWriteFast(A0, LOW);
} // end if (client)
}
ElEspanol hatte mir mal etwas gebastelt das in die gleiche Richtung geht. Danke nochmal dafür! Hier der Beitrag.
Der statische Teil der Webseite kommt dabei vom lokalen PC,Tablet, ect. oder von einem Server im Netzwerk. Nur die Variablen werden dabei vom Arduino ausgeliefert.
"Sauschnell" und belastet den Arduino kaum. Läuft ohne PHP, AJAX, Webserver, ect. und benötigt nur JavaScript.
Was in der Anleitung aber noch fehlt ist ist die Möglichkeit vom Browser etwas an den Arduino zu schicken.
Für Infos zum HTML ist SelfHTML immer eine gute Anlaufstelle.
Wenn Du in Deinem Router eine Weiterleitung einrichtest und Dir (bei nicht fester IP) einen dynamischen DNS-Eintrag holst, dann geht das auch aus dem Internet. Der Router muß den Dienst unterstützen.
Beachte aber, daß Du damit Deinen Router nach außen öffnest. Da solltest Du genau wissen, was Du tust.
das ist mir schon klar, aber was ich meinte, wenn man vom Internet per dyndns auf den Webserver zugreift und dieser eine weiterleitung im lokalen netz durchführt, würde dann der browser nicht auch versuchen, auf die lokale adresse des arduinos zuzugreifen (was natürlich dann nicht geht) ?
Oder müssten Server UND Arduino beide per dyndns (o.Ä.) im Netz stehen?
ich habe beim Server auch das Script mit eingebaut (einfach erstmal nur so..) und man kann sehen,
daß wenn man auf dem server zugreift, er auch eine Verbindung zum Arduino herstellt.
Das script aber an meine Webseite direkt anzupassen, krieg ich alleine nicht hin.
Vielleicht kann mir da jemand helfen, der sich damit besser auskennt?