Forum: Mikrocontroller und Digitale Elektronik String an Browser: wie leere Website erzeugen?


von Stephan (Gast)


Lesenswert?

Hallo!

Aufbau:
-Attiny an ESP8266, im WLAN
-Webbrowser auf PC, im WLAN

Plan:
-Webbrowser ruft IP des ESP8266 auf, Attiny sendet html- String über 
ESP8266 an
-Browser und erzeugt eine minimalistische Website

Stand:
-Attiny sendet String wie vorgesehen
-bei Aufruf der IP durch z.B. Hyperterminal wird html-Code korrekt 
angezeigt
-bei Aufruf der IP durch Browser lädt dieser ohne Ende, kein Bildaufbau
-bei wiederholtem Senden des html-Codes wird dieser irgendwann als 
reiner Text angezeigt. Auch Buttons erscheinen. Mehr und mehr, jedoch 
ohne Ende.

Frage:
wie muss ich den String ändern, sodass der Browser das Nachladen 
einstellt und den html-Code entsprechend anzeigt?

String:
"HTTP/1.1 200 OK\r\n<!DOCTYPE HTML>\r\nContent-Type: 
text/html\r\nContent-Length: 198\r\nConnection: 
close\r\n\r\n<html>\r\n\r\n<body>\r\n<p>\r\nHallo\r\n</p>\r\n</body>\r\n 
</html>\r\nClient  disconnected";

von Theor (Gast)


Lesenswert?

Falls es interessiert: "Site" ist ein englisches Wort und bedeutet 
"Ort", "Platz", "Standort" oder "Stätte".

Eine "Website" ist die Summe aller HTML-Seiten, die zu einem 
Web-Auftritt gehören; ein "Ort" oder "Platz" im Internet.

Siehe auch: https://de.wikipedia.org/wiki/Website

Eine "Website" ist hingegen nicht eine einzelne HTML-Datei, eine 
"Seite".

Durch die lautliche Ähnlichkeit, besteht die Möglichkeit sich einen 
"falschen Freund" anzulachen.

von Stephan (Gast)


Lesenswert?

Vielen Dank für die Ausführung.
Da meine angestrebte HTML-Seite die einzige im angestrebten Web-Auftritt 
sein wird, passt der Begriff Website zum Glück ja dennoch.

von Theor (Gast)


Lesenswert?

Stephan schrieb:
> Vielen Dank für die Ausführung.
> Da meine angestrebte HTML-Seite die einzige im angestrebten Web-Auftritt
> sein wird, passt der Begriff Website zum Glück ja dennoch.

Vielen Dank für Dein Interesse:

Der Begriff passt dennoch nicht. Es geht dabei nicht um Einzahl oder 
Mehrzahl von Dateien, sondern um ein organisatorisches, abstraktes 
Gebilde.

Das Wort "Summe" ist leider von mir unglücklich gewählt. Besser wäre das 
"Ganze" oder ähnliches gewesen. In dem Sinne wie man sagt, dass das 
Ganze nicht die Summe seiner Teile ist. Entschuldige bitte meinen 
Fehler. Aber ich hoffe es ist jetzt klar, worum es geht: "Das Ganze" 
kann nicht in einer oder mehreren Dateien repräsentiert werden und also 
auch nicht programmatisch erzeugt werden.

von bastel_ (Gast)


Lesenswert?

Sollte das Doctype nicht vor dem <html> und nicht vor den Headern 
kommen?

von hownottobeseen (ohne Login) (Gast)


Lesenswert?

Hi,

Zumindest der Doctype ist an falscher Stelle, der gehört in den 
HTML-Header und nicht in den HTTP-Header.

Die Content-Length kannst du weglassen, das ist auf dem uC in aller 
Regel angenehmer.
Wird die Tcp-Verbunfung nach der Übermittlung geschlossen?
Lauscher am besten mal mit Wireshark mit, was tatsächlich passiert...

HTH,
Chris

von Stephan (Gast)


Lesenswert?

bastel_ schrieb:
> Sollte das Doctype nicht vor dem <html> und nicht vor den Headern
> kommen?

Kommt es doch!

HTTP/1.1 200 OK
<!DOCTYPE HTML>
Content-Type: text/html
Content-Length: 198
Connection:close

<html>
<body>
<p>
Hallo
</p>
</body>
</html>
Client  disconnected";

von Stephan (Gast)


Lesenswert?

hownottobeseen (ohne Login) schrieb:
> Zumindest der Doctype ist an falscher Stelle, der gehört in den
> HTML-Header und nicht in den HTTP-Header.

oooha

von Stephan (Gast)


Lesenswert?

hownottobeseen (ohne Login) schrieb:
> Die Content-Length kannst du weglassen, das ist auf dem uC in aller
> Regel angenehmer.

Tatsächlich ist es eine einigermaßen umständliche Funktion geworden, die 
Content-Länge vor dem Senden stets neu auszurechnen. Meine Befürchtung 
war, dass die Länge explizit benötigt wird- würde ja Sinn machen, um dem 
Browser mitzuteilen, auf wie viele Zeichen er warten soll. Er wartet 
aber dauerhaft... bzw "überträgt" (wo nix übertragen wird.

Werde es rausnehmen.

von Ralf D. (doeblitz)


Lesenswert?

Stephan schrieb:
[...]
> Frage:
> wie muss ich den String ändern, sodass der Browser das Nachladen
> einstellt und den html-Code entsprechend anzeigt?
>
> String:
> "HTTP/1.1 200 OK\r\n<!DOCTYPE HTML>\r\nContent-Type:
> text/html\r\nContent-Length: 198\r\nConnection:
> close\r\n\r\n<html>\r\n\r\n<body>\r\n<p>\r\nHallo\r\n</p>\r\n</body>\r\n 
</html>\r\nClient
> disconnected";

Deine Content-Length paßt nicht zum übertragenen Content und das "Client 
disconnected" hat da auch nichts verloren. Außerdem mußt du (d.h. 
attiny/esp8266) die Verbindung schließen, wenn du alles übertragen hast.

RFC 7230 wäre ein gutes Dokument zum Einstieg, wenn du das 
durchgearbeitet hast, dann hast du zumindest schon einmal das 
Basis-Framework. Mit RFC 7231 bis 7235 kommt dann der Rest, den man für 
einen konformen Webserver wissen muß.

Ohne dieses Wissen solltest du dich besser an die Verwendung 
existierender Webserver-Software halten, der Kram ist heutzutage nicht 
mehr so simpel wie vor 25 Jahren.

von Stephan (Gast)


Lesenswert?

Ralf D. schrieb:
> Deine Content-Length paßt nicht zum übertragenen Content und das "Client
> disconnected" hat da auch nichts verloren. Außerdem mußt du (d.h.
> attiny/esp8266) die Verbindung schließen, wenn du alles übertragen hast.


Content- Length: WEG
Client disconneted: WEG

Verbindung schließen: wie drücke ich das im String aus?

RFC 7230: danke, ein so umfassende Beschreiung habe ich bisher nicht 
gefunden. Allerdings ist sie für mein Ziel ein wenig oversized. Es geht 
mir nur um die Möglichkeit, flux eine Zahl im Browser anzuzeigen.


Update: es ist erstmals geglückt, dass der Browser mit dem Laden der 
HTML-Datei abgeschlossen hat. Womöglich durch einen Timeout?
Wie lautet der "Befehl", die Verbindung zu schließen?

von Stephan (Gast)


Lesenswert?

Stephan schrieb:
> Wie lautet der "Befehl", die Verbindung zu schließen?

Ah. Hirn geht nicht (Mönchshof sei dank).
Weiß bescheid...

von S. R. (svenska)


Lesenswert?

Stephan schrieb:
> Content- Length: WEG
> Client disconneted: WEG

Vereinfachend kannst du auch HTTP/1.0 implementieren:
- "Content-Length" ist zwar vorgeschrieben, aber nicht zuverlässig;
- "Connection" kann auch weg, weil immer "close".

Also:
1
HTTP/1.0 200 OK
2
Content-Type: text/html
3
4
<!DOCTYPE HTML>
5
<html><body><p>Hallo</p></body></html>

von Stephan (Gast)


Lesenswert?

S. R. schrieb:
> Vereinfachend kannst du auch HTTP/1.0 implementieren:

Saucool, hat geklappt. Danke.

Abschließend schließt der "Server" die Verbindung, der Browser zeigt die 
Seite an. Eigentlich wie gewollt.
Aber:
Wenn ich nun einen submit-button einbaue... der soll nunmal einen Text 
an den Server senden. Die Verbindung ist ja aber bereits geschlossen. 
Ist der Browser in der Lage die Verbindung wieder aufzubauen und den mit 
dem Button verbundenen "Befehl" zu senden?

von Jobst M. (jobstens-de)


Lesenswert?

Stephan schrieb:
> Die Verbindung ist ja aber bereits geschlossen.
> Ist der Browser in der Lage die Verbindung wieder aufzubauen und den mit
> dem Button verbundenen "Befehl" zu senden?

Nein, eine geschlossene Seite kann mit dem selben Browser NIE WIEDER 
geöffnet werden ... **hint*
Und woher weiß der Browser, ob ich auf der Seite noch etwas machen 
möchte?

Mal im Ernst:
Der Browser öffnet meist sogar mehrere Verbindungen zu einer Webseite, 
um auch Bilder etc. parallel zu holen. Und wenn die Seite geladen ist, 
werden die Verbindungen auch wieder getrennt. Sollte das nicht 
passieren, dann schließt der Server die nach einiger Zeit wieder.
Eine neue Anfrage öffnet neue Verbindungen. Alles Andere würde bei 
Servern (und auch Browsern) zu riesigen Listen führen, welche 
Verbindungen noch alle bestehen (und evtl. gar nicht mehr gebraucht 
werden.)

Wenn Du Clients auseinander halten möchtest, dann funktioniert das im 
lokalen Netzwerk noch über die IP-Adresse, sonst über Cookies.


Gruß

Jobst

von S. R. (svenska)


Lesenswert?

Stephan schrieb:
> Wenn ich nun einen submit-button einbaue... der soll nunmal einen Text
> an den Server senden. Die Verbindung ist ja aber bereits geschlossen.

Wenn du eine URL öffnest, dann
- öffnet dein Browser eine Verbindung
- schickt eine "GET"-Anfrage hin
- empfängt Daten bis der Server die Verbindung trennt
- zeigt die Seite (die empfangenen Daten) an.

Wenn du einen Submit-Button anklickst, dann
- öffnet der Browser eine Verbindung
- schickt eine "POST"-Anfrage (mit den Formulardaten) hin
- empfängt Daten bis der Server die Verbindung trennt
- zeigt die Seite (die empfangenen Daten) an.

"Seite laden" und "Button anklicken" haben auf HTTP-Ebene also nichts 
miteinander zu tun. Eine Anfrage ist unabhängig von allen anderen 
Anfragen.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Weiter entfernen wir uns etwas von einer leeren Seite - wird also etwas 
OT

Macht man Das heute nicht mehr? Also ne 'eigene Website' basteln?
Spielereien mit Perl und PHP?
Formulare wurde ja schon genannt und schienen unbekannt :/

MfG

von Jobst M. (jobstens-de)


Lesenswert?

S. R. schrieb:
> Wenn du einen Submit-Button anklickst, dann
> - öffnet der Browser eine Verbindung
> - schickt eine "POST"-Anfrage (mit den Formulardaten) hin

... oder eine "GET"-Anfrage mit angehängten Daten in der URL


Patrick J. schrieb:
> Weiter entfernen wir uns etwas von einer leeren Seite - wird also etwas
> OT

Der Inhalt ist eigentlich bei dem Vorgang egal ...

Patrick J. schrieb:
> Macht man Das heute nicht mehr? Also ne 'eigene Website' basteln?
> Spielereien mit Perl und PHP?
> Formulare wurde ja schon genannt und schienen unbekannt :/

Nein. Es haben ja auch immer weniger Leute eine Webseite. Sogar Firmen! 
Die haben ein Profil bei FB ...


Gruß

Jobst

von Stephan (Gast)


Lesenswert?

Jobst M. schrieb:
> Nein, eine geschlossene Seite kann mit dem selben Browser NIE WIEDER
> geöffnet werden ...

Genau mein Humor.

Nach kurzer Besinnung stellte ich fest, dass man ja natürlich von 
Webseiten aus Verbindungen zum Server aufbaut durch jedwede Eingabe.


Ergebnis:
ich habe nun zuhause etwas, das ich "Webserver" nenne (für 0,34€, mit 
0,0000005GB Speicherplatz für HTML-Seiten), programmiert, auf einem 
Attiny4313, und kann von überall aus gucken, wie warm es auf meinem 
Schreibtisch ist, und per Button auf der Webseite eine LED ein- und 
wieder ausschalten. Ich bin sehr glücklich :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.