mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik HTTP Rensponse Header vom AVR


Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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>...

Autor: Minetti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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>

Autor: Martin M. (martin69)
Datum:
Angehängte Dateien:
  • xx.txt (159 Bytes, 95 Downloads)

Bewertung
0 lesenswert
nicht 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...

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon Hufnagel (sijohula)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Minetti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin M. (martin69)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Martin M. (martin69)
Datum:
Angehängte Dateien:
  • xx.txt (167 Bytes, 105 Downloads)

Bewertung
0 lesenswert
nicht 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.

Autor: 3359 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Martin M. (martin69)
Datum:

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

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas Schwarz: ich werde mal beim Hersteller des XPort nachfragen.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal Connection: keep-alive

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Connection: keep-alive .... geht leider auch nicht.

Autor: Minetti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin M. (martin69)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin M. (martin69)
Datum:
Angehängte Dateien:
  • yy.txt (163 Bytes, 137 Downloads)

Bewertung
0 lesenswert
nicht 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.

Autor: Martin M. (martin69)
Datum:
Angehängte Dateien:
  • yy.zip (287 Bytes, 9 Downloads)

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

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Winshark geht nun auch. Da mußte man "promiscuous mode" ausschalten.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Simon

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Simon

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

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

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

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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.