Forum: Mikrocontroller und Digitale Elektronik HTTP Rensponse Header vom AVR


von Martin M. (martin69)


Lesenswert?

Hallo

ich möchte eine HTML-Seite im AVR erzeugen und über Ethernet am Browser 
anzeigen.

Rufe ich eine entsprechende Seite auf, dann gibt der Browser folgende 
Infos über den XPort über die RS232-Schnittstelle an den AVR:


GET /test.htm HTTP/1.1
Host: xxx.com
Connection: close
Accept-Encoding: gzip
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7
Cache-Control: no
Accept-Language: de,en;q=0.7,en-us;q=0.3
Referer: http://web-sniffer.net/


Ich möchte folgende HTML-Datei ausgeben:

<HTML>
<BODY>
Hello World!
</BODY>
</HTML>


Wie muß der HTTP Rensponse Header vom AVR aussehen? Ich würde den 
erstmal mit dem PC über die Schnittstelle simulieren. Das heißt, ich 
würde den Header in die Test-HTML-Datei mit rein packen und die Datei 
mit dem Hyperterminal über die RS232 zum XPort senden.

von Dieter (Gast)


Lesenswert?

im einfachsten Falle sieht der so aus:


HTTP/1.0 200 Document follows\r\n
Content-Type: text/html\r\n\r\n
<html>...

von Minetti (Gast)


Lesenswert?

Wenn du eine Anfrage in HTTP/1.1 bekommst und entsprechend antworten 
willst, ist hier die richtige Lektüre:
http://www.ietf.org/rfc/rfc2616.txt

Wenn du sauber arbeiten willst, musst du vor allem mal nach dem 
Schlüsselwort MUST suchen. Gibt einige Funktionen, die man nach HTTP/1.1 
unterstützen muss, um das Protokoll zu erfüllen. Auch wenn man sich was 
zurechtmurksen kann und die meisten Clients auch sehr gutmütig 
reagieren.

Als Response Header könntest du sowas schreiben:
HTTP/1.1 200 OK <muss sein>
Date: Mon, 02 Jul 2007 08:38:11 GMT <sollte man bei 1.1 angeben>
Server: AVR <kannste sonstwas schreiben oder weglassen>
Content-Length: 52959 <kann man weglassen>
Connection: close <darf dann aber diesen hier nicht vergessen>
Content-Type: text/html <sollte auch sein>
<Leerzeile>
<Inhalt>

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

Den Link zur "richtigen Lektüre" habe ich bereits zuvor gefunden. Aber 
das ist mir doch etwas zu komplex...

Hab nun mit dem Browser die Seite test2.htm aufgerufen. Auf der RS232 
kam folgendes an:


GET /test2.htm HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
application/x-shock
wave-flash, application/msword, application/vnd.ms-excel, 
application/x-icq, */*

Accept-Language: de
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET 
CLR 1.1
.4322; .NET CLR 2.0.50727)
Host: 192.168.178.21
Connection: Keep-Alive


Hab dann die Datei mit folgendem Inhalt gesendet (siehe Anhang):



HTTP/1.1 200 OK
Date: Mon, 02 Jul 2007 08:38:11 GMT
Server: AVR
Connection: close
Content-Type: text/html

<HTML>
<BODY>
Hello World!
</BODY>
</HTML>


Aber am Browser tut sich nichts. Zeigt unten immer noch "Seite 
http://192.168.178.21/test2.htm wird geöffnet" an. Da muß doch in den 
Header sicherlich noch ein Einrag rein, daß der Browser weiß, daß die 
Info für ihn ist...

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Du musst die Verbindung beenden, sonst weiß der Browser nicht wo Schluss 
ist. Und ich würde nicht "HTTP/1.1" senden wenn dein Server nur HTTP/1.0 
unterstützt.

von Volker (Gast)


Lesenswert?

Hast du mal gecheckt ob der AVR die Seite tatsächlich über das Netzwerk 
schaufelt? - Netzwerksniffer böte sich da an (z.B. Wireshark)

von Martin M. (martin69)


Lesenswert?

@Volker:
die LED am XPort blinkt beim Senden. Momentan hab ich ja noch den PC an 
der RS232 und noch nicht den AVR.

Wie geht denn das mit dem Wireshark? Benötigt man da eine zusätzliche 
Hardware?

von Martin M. (martin69)


Lesenswert?

@ Andreas Schwarz:

Wie beende ich die Verbindung? Ich kann mit dem Hyperterminal nur die 
RS232 zum XPort trennen.

Wird das Trennen nicht durch den Eintrag "
Connection: close" automatisch gemacht?

Hab gerade auf "HTTP/1.0 200 OK" geändert. Ein mal ginges nun. Kann es 
leider nicht reproduzieren.

von Volker (Gast)


Lesenswert?

Du installierst den Wireshark auf dem Rechner wo auch dein Browser 
läuft. So kannst du dann alle Ethernetpakete die an diesen Rechner 
geschickt werden loggen.

von Simon H. (sijohula)


Lesenswert?

Hallo,

Wireshark ist ein Programm, dass den Netzwerkverkehr auf einem Interface 
mitschneiden und anzeigen kann...

Hier mal der Link: http://www.wireshark.org/download.html

einfach runterladen und installieren, man braucht keinerlei zusätzliche 
Hardware...

von Minetti (Gast)


Lesenswert?

Das Datum hätteste netterweise anpassen können ;-)

Andreas hat recht. Dein Browser wartet durch die Anweisung Connection: 
close darauf, dass der Server die Verbindung trennt. Er wird die Daten 
schon empfangen haben, aber fängt noch nicht mit dem Rendering an. Wenn 
du die Verbindung nicht schliessen kannst, kannst du die Content-Size 
angeben, dann weiss der Browser auch, wann Schluss ist.

Der Browser weiss, dass die Daten für ihn sind, denn er hat vorher eine 
1:1 Verbindung mittels TCP aufgebaut.

Wireshark braucht n Treiber (der ist dabei) und ist ansonsten recht 
einfach zu bedienen, wenn man nicht filtern muss.

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

Hab nun "Content-Length: 48" ergänzt. Nun zeigt der Browser den Text an, 
aber schließt nicht die Verbindung. Wenn ich den Text 2 Mal sende, dann 
wird die Verbindung geschlossen und

"Hello World! HTTP/1.0 200 OK Date:"

angezeigt.

Wie wird die Länge berechnet? Ich habe im Explorer geschaut, wie groß 
die HTML-Datei von "Hallo World" ist (48 Byte).
Ohne ne Längenangabe wäre es natürlich einfacher. Aber wenns ohne nicht 
geht???


Den Wireshark hab ich nun installiert. Welches Interfae muß ich da 
auswählen (siehe Anhang)? Hab da mal die FritzBox ausgewählt und "Start" 
gedrückt, denn da hängt ja der XPort dran. Die Verbindung zwischen 
Fritzbox und PC erfolgt über WLAN. Aber es wird nichts aufgezeichnet. 
Muß man da noch was einstellen

von Volker (Gast)


Lesenswert?

Das Senden scheint ja zu funktionieren...
Wie Andreas schon meinte weiß der Browser nicht wo deine HTML-Seite 
aufhört.
Sende doch mal nach deinem HTML-Dokument noch 2 CR+LF (ASCII 13 und 10)

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

Content-Length: 48 hab ich nun entfernt und hinten 2 CR+LF angehängt 
(mit HEX-Editer. Geht aber nicht. Hab ich das mit den 2 CR+LF falsch 
verstanden? Hab die Datei angehängt.

von 3359 (Gast)


Lesenswert?

Martin Mueller:

>Den Link zur "richtigen Lektüre" habe ich bereits zuvor gefunden. Aber
das ist mir doch etwas zu komplex...

Tja, von nichts kommt nichts. Da musste durch.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Du musst die TCP-Verbindung beenden. Wie das mit dem Xport geht weiß ich 
nicht, vielleicht eine bestimmte Steuersequenz über RS-232?

von Martin M. (martin69)


Lesenswert?

@3359 : bin ja eher der Hardwaremann, deshalb fällt mir das etwas 
schwer.

von Martin M. (martin69)


Lesenswert?

@Andreas Schwarz: ich werde mal beim Hersteller des XPort nachfragen.

von Volker (Gast)


Lesenswert?

Versuch mal Connection: keep-alive

von Martin M. (martin69)


Lesenswert?

Connection: keep-alive .... geht leider auch nicht.

von Minetti (Gast)


Lesenswert?

Bei Connection: keep-alive brauchst du auf jeden Fall die 
Content-Length. Die ist in bytes angegeben für die Länge des Dokumentes 
inklusive einer Leerzeile am Ende, sprich
<html>
<body>
quatsch mit sosse
</body>
</html> <-- hier ein \r\n (nicht nur \n, es muss die volle Sequenz sein)
 <-- hier noch ein \r\n.

Die Content-Length wäre jetzt 55.

In Wireshark wählst du das Interface aus, an dem dein AVR/XPort 
angeschlossen ist. Die IP Adresse des Interfaces sollte der des XPort 
ähnlich sein.

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

im XPort kann man folgende Einstellungen machen (siehe Bild). Ich denke 
eine davon kann man verwenden, um die Verbindung zu trennen.
Ich denke das mit EOT könnte gehen. Ich werde es mal ausprobieren und 
ein entsprechendes ASCII-Zeichen hinten an die gesendete Datei ran 
hängen.

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

hab nun das mit dem Timeout im XPort gemacht. Geht zwar nun, ist aber 
nicht gerade schön.

Das mit dem \r\n will irgendwie nicht klappen. Kann mal jemand bitte die 
Datei so machen, daß sie gehen müßte. Hab den aktuellen Stand nochmal 
angehängt.

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

nochmal ein Versuch...
Diesmal als ZIP, denn die TXT-Datei konnte man nur als HTML speichern.

von Martin M. (martin69)


Lesenswert?

Winshark geht nun auch. Da mußte man "promiscuous mode" ausschalten.

von Volker (Gast)


Lesenswert?

Bist du sicher daß 2x CR+LF gesendet wird? Oder könnte es vielleicht 
sein, daß der Xport diese Steuersequenz irgendwie verändert?

Dies könntest du jetzt mit dem Wireshark überprüfen.

von Simon K. (simon) Benutzerseite


Lesenswert?

2xCRLF am Ende des HTTP Dokuments beendet nicht die Verbindung, sondern 
fügt einfach nur zwei Leerzeilen ein. Das ist also Quatsch.

Wie schon gesagt musst du die Verbindung beenden wenn keine weiteren 
Datenbytes mehr gesendet werden können/müssen. Bei allen gängigen 
Software-TCP/IP Stacks geht das auch ohne Probleme. (Ich benutze ja 
selbst den uip Stack auf meinem ENC28J60 MikroWebServer).

von Volker (Gast)


Lesenswert?

@Simon

Schon klar, daß dies nicht die Verbindung trennt, sollte aber eigentlich 
dem Browser sagen daß das Dokument hier zu Ende ist.

von Simon K. (simon) Benutzerseite


Lesenswert?

Volker wrote:
> @Simon
>
> Schon klar, daß dies nicht die Verbindung trennt, sollte aber eigentlich
> dem Browser sagen daß das Dokument hier zu Ende ist.

Nein tut es nicht, da innerhalb eines HTTP Dokuments durchaus auch zwei 
Leerzeilen auftreten dürfen.

http://wayne.klinkerstein.m-faq.de/2CRLF.html

von Volker (Gast)


Lesenswert?

@Simon

Zwischen <html> und </html> okay, aber ausserhalb des HTML-Dokuments?

von Martin M. (martin69)


Lesenswert?

Ich hab enun die Option "On Mdm_Ctrl_In Drop" bei Disconnect Mode 
ausgewählt. Dann muß ich halt vom Controller ein Hardwaresignal 
ausgeben, wenn die Daten gesendet wurden. Damit kann ich leben.

Aber wenn doch jemand ne Idee hat, wie es ohne dieses gehen würde, wäre 
ich dankbar.

von Simon K. (simon) Benutzerseite


Lesenswert?

Volker wrote:
> @Simon
>
> Zwischen <html> und </html> okay, aber ausserhalb des HTML-Dokuments?

http://wayne.klinkerstein.m-faq.de/2CRLF.html

von Volker (Gast)


Lesenswert?

@Simon

Hmm- ich wüßte jetzt ehrlich nicht was das beweisen/widerlegen sollte...
Wenn die Verbindung beendet wird, stellt der Browser die Daten natürlich 
dar - auch ohne 2 CRLF am Ende.

Außerdem sind in deinen Beispielen keine CRLF sondern nur LF.

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.