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.
im einfachsten Falle sieht der so aus: HTTP/1.0 200 Document follows\r\n Content-Type: text/html\r\n\r\n <html>...
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>
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...
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.
Hast du mal gecheckt ob der AVR die Seite tatsächlich über das Netzwerk schaufelt? - Netzwerksniffer böte sich da an (z.B. Wireshark)
@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?
@ 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.
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.
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...
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.
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
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)
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.
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.
Du musst die TCP-Verbindung beenden. Wie das mit dem Xport geht weiß ich nicht, vielleicht eine bestimmte Steuersequenz über RS-232?
@3359 : bin ja eher der Hardwaremann, deshalb fällt mir das etwas schwer.
@Andreas Schwarz: ich werde mal beim Hersteller des XPort nachfragen.
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.
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.
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.
nochmal ein Versuch... Diesmal als ZIP, denn die TXT-Datei konnte man nur als HTML speichern.
Winshark geht nun auch. Da mußte man "promiscuous mode" ausschalten.
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.
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).
@Simon Schon klar, daß dies nicht die Verbindung trennt, sollte aber eigentlich dem Browser sagen daß das Dokument hier zu Ende ist.
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
@Simon Zwischen <html> und </html> okay, aber ausserhalb des HTML-Dokuments?
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.
Volker wrote: > @Simon > > Zwischen <html> und </html> okay, aber ausserhalb des HTML-Dokuments? http://wayne.klinkerstein.m-faq.de/2CRLF.html
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.