Webseite anstatt von SD von einer IP laden?

Hallo,

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?

genauso.

client programmieren, der die Webseite vom Server holt, parst und der Serverteil des Sketches gibt sie aus.

Wenn dein Sketch schön modular aufgebaut ist, sollten die Änderungen nicht sehr kompliziert sein.

puhh, ich bin nicht so der softworker, eher hardware, daher ... hast du ein beispiel für mich?

Beispiele gibt es da sehr viele. Du solltest das in einzelne Aufgaben zerpflücken und diese einzeln lösen und danach alles kombinieren.

Poste mal den Sketch, den du hast.

Ist der Server auf der 192.168.2.223 schon eingerichtet?

die webseite liegt auf meinem Server, siehe
mega-hz Arduino IN/OUT WEB-Server ist auf 192.168.2.223 genauso.

anbei der Sketch

_home-sys_arduino-fast.ino.ino (12.5 KB)

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.

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. Wie das geht, steht hier und hier.

Gruß Tommy

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 :(

Die Erläuterungen in den Links sehen ziemlich gut aus.
Header sind auch nur Texte.
Ich habs aber nicht ausprobiert.

Gruß Tommy

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.

ok, werd ich mir anschauen!
Benutze einen Uno.

mega-hz:
Hallo,

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)
}

client.println(F(“HTTP/1.1 301 OK”));
client.println(F(“192.168.2.223”));

So in etwa?

hab das eben eingebaut und es funktioniert! :)

client.println(F("HTTP/1.1 302 Found")); client.println(F("Location: http://192.168.2.222/Arduino/WEB-IO/%23web-io.htm"));

allerdings "redet" die webseite nicht mehr mit dem arduino :(

jetzt müsste auf der webseite wieder eine rückumleitung zum arduino für die Ajax Daten geschehen, oder?

Nö, nicht mit Umleitung.

Du rufst im Browser die Seite auf dem Webserver auf. Diese ruft intern über AJAX den Arduino auf.

In dieses Konstrukt musst Du die Header aus den Origin-Beispielen einbauen. Ich habe es auch noch nicht gemacht, nur davon gelesen.

Gruß Tommy

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.

Hi Peter_de,

DAS ist ja genau das, was ich auch brauche!
Habe aber ebensowenig Ahnung, das in meinen Code einzubauen, aber ich versuche es mal…

beim Arduino dürfte ja eigentlich nur noch das

cl.print(F(“injectHTML(’”));

cl.print(F("’)"));

in die XML Routine eingebaut werden, richtig?
Oder müssern diese Zeilen dann weg:

cl.print(F("<?xml version = \"1.0\" ?>"));
cl.print(F(""));

da fällt mir grade was ein, funktioniert das eigentlich nur im lokalen Netz oder auch vom Internet aus?

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.

Gruß Tommy

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 das mal vorbereitet:

Server 192.168.2.222 mit der Webseite auf http://mega-hz.dnshome.de:84 („vom SERVER“ sichtbar)
Arduino 192.168.2.231( noch )mit Webseite von SD Card auf http://mega-hz.dnshome.de:85

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?