Forum: Mikrocontroller und Digitale Elektronik ESP8266 sendet, Browser interpretiert nicht als Website


von Manu (Gast)


Lesenswert?

Hallo zusammen,

ich setzte mich gerade mit dem ESP8266 auseinander.
Für Testzwecke habe ich ein VB-Tool, dass über die serielle 
Schnittstelle mit dem ESP kommuniziert

Jetzt soll ein bisschen Interaktion über einen Mini- Webserver laufen.

1. ich bin soweit, dass ich per Browser eine Seitenanforderung sendet 
"192.168.178.14:8080"
2. am ESP8266 kommt ensprechend dies an
1
+IPD,0,302:GET / HTTP/1.1
2
Host: 192.168.178.14:8080
3
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5
Accept-Language: de,en-US;q=0.7,en;q=0.3
6
Accept-Encoding: gzip, deflate
7
Connection: keep-alive
8
9
10
OK
3. jetzt sende ich ein primitive Website
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2
<html>
3
<head>
4
<p>Hello World</p>
5
</head>
6
<body>
7
<p>this is ESP8266 talking</p>
8
 <hr
9
><p>time: 14.01.2015 18:49:11 </p> 
10
</body>
11
</html>

Die unmittelbare Rückmeldung von ESP8266 (Echo) lautet
1
+IPD,0,302:GET / HTTP/1.1
2
Host: 192.168.178.14:8080
3
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5
Accept-Language: de,en-US;q=0.7,en;q=0.3
6
Accept-Encoding: gzip, deflate
7
Connection: keep-alive
8
9
10
OK
11
AT+CIPSEND=0,208
12
13
> 
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><p>Hello World</p></head><body><p>this is ESP8266 talking</p> <hr><p>time: 14.01.2015 19:15:53 </p> </body></html>
24
SEND OK
25
Unlink

aber anstatt der Webbrowser den HTML Code interpretiert, wird mein 
gesendeter Text in Klarform dargestellt, sprich im Browser erscheint nun
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><p>Hello World</p></head><body><p>this is ESP8266 talking</p> <hr><p>time: 14.01.2015 18:49:11 </p> </body></html>

Der primitive HTML Code ist seitens Syntax korrekt, dass habe ich lokal 
geprüft, indem ich ein HTML File erzeugt, die empfangenen Daten 
reinkopiert und dann im Browser aufgerufen habe.

Ich sehe daher mein Fehler/Problem beim Senden.

Kann mir jemand dazu helfen?

Noch ein paar Info zum Init (alle werden positiv bestätigt)
1
AT+RST
2
AT+CIPMUX=1
3
AT+CIPSERVER=1,8080
4
AT+CIPSTO=0
5
AT+CWJAP="xxx","yyy"

Version ist 9.02
 (AT+GMR) : 0018000902-AI03


Gruß
Manu

von Stefan F. (Gast)


Lesenswert?

Die Antwort besteht nicht nur aus dem Dokument, sondern es gehört auch 
ein Header dazu. Bei Dir fehlt der gesamte Header.

von Max H. (hartl192)


Lesenswert?

Was wenn du das am Anfang anhängst:
1
"HTTP/1.1 200 OK\r\nContent-Type: html\r\n\r\n"

von Ulrich F. (Gast)


Lesenswert?

Dem Borwser solltest du schon mitteilen, dass er HTML bekommt.

Also: Sende einen Content-type Http Header.

von Manu (Gast)


Lesenswert?

Danke für die Hinweise, das macht absolut Sinn :-)

Trotzdem kommt nur folgender Text im Browser an
1
HTTP/1.1 200 OK
2
Content-Type: text/html
3
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><p>Hello World</p></head><body><p>this is ESP8266 talking</p> <hr><p>time: 14.01.2015 21:24:42 </p> </body></html>

(Beim Senden habe ich die \r\n mitgeschickt - wie sensitiv darauf ist 
die Struktur überhaupt?)

Ich habe auch anhand der Routine
1
void HTML_Make_Header()
 unter  http://arduino-hannover.de/2014/12/11/wifi-kochbuch-mit-esp8266/ 
mein Glück versucht, auch hier ohne Erfolg.

Ist hier ein Fehler sichtbar?
KEnnt Ihr eine verständliche Anleitung zwecks Headerstruktur? Ich will 
wirklich nicht zu tief aber tief genug einsteigen und verstehen, was zu 
machen ist. Z.B ist bzw. wann ist ein Content-Length Eintrag nötig...?

von Holger W. (holgerw)


Lesenswert?

Das sollte so ausreichen, die Anzahl der \r\n ist wichtig nach dem OK:
1
...
2
os_sprintf(temp, "HTTP/1.0 200 OK\r\n\r\n");
3
espconn_sent(pLink[linkTemp->linkId].pCon, temp, strlen(temp));
4
        
5
os_sprintf(temp, "<html><body>test</body></html>\r\n");
6
espconn_sent(pLink[linkTemp->linkId].pCon, temp, strlen(temp));
7
...

Holger

von Manu (Gast)


Lesenswert?

@Holger

danke, es sieht aus als ob es das war. Wider Erwartungen habe ich beim 
Zusammensetzen nicht die richtige Anzahl an \r\n drin gehabt.
Wenn ich das richtig verstehen, muß der Header mit \r\n\r\n 
abgeschlossen werden; nicht zwangsläufig nach dem ok, sondern ggf. nach 
den zusätzlichen Headerangaben?!

Wenn noch jetzt jemand eine Link zu einer guten (und einfachen) 
Headerbeschreibung liefern könnte, wäre mein Tag vollends gerettet.

Danke und Gruß
Manu

von Ulrich F. (Gast)


Lesenswert?

>Z.B ist bzw. wann ist ein Content-Length Eintrag nötig...?
Z.B., wenn du möchtest, dass dein Browser HTML auch als HTML akzeptiert, 
dann solltest du ihm das im Header mitteilen.

Lesestoff: http://www.w3.org/Protocols/rfc2616/rfc2616.html

von Manu (Gast)


Lesenswert?

ufff, da hab ich was zu lesen... :-)

ok, danke.

Ohne es jetzt direkt zu verstehen: der Content-length beschreibt 
"sauber" das HTML File, bei einfachen Seiten (wie mein Beispiel) ist das 
nicht zwingend aber besser!?

von Ulrich F. (Gast)


Lesenswert?

Es gibt einige gute Gründe diesen Header zu senden.

Wenn du die Verbindung offen halten willst, solltest du zwingend den 
Content-length Header mit senden. Wichtigster Grund: Woran soll der 
Browser sonst erkennen, dass die Übertragung von Daten (das HTML) zu 
Ende ist?

Auf Grund der begrenzen Ressourcen deines Arduinos kannst/solltest du 
ganz entspannt auf den Content-length Header verzichten. Dann beende 
aber die Verbindung nach jedem Response.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Manu schrieb:
> Wenn ich das richtig verstehen, muß der Header mit \r\n\r\n
> abgeschlossen werden; nicht zwangsläufig nach dem ok, sondern ggf. nach
> den zusätzlichen Headerangaben?!

Genau. Header und Nutzinhalt sind durch eine Leerzeile getrennt.

von Stefan F. (Gast)


Lesenswert?

Schau mal hier rein: 
http://stefanfrings.de/mikrocontroller_buch/Einstieg%20in%20die%20Elektronik%20mit%20Mikrocontrollern%20-%20Band%202.pdf

Da habe ich das HTTP Protokoll auf Mikrocontroller Bedürfnisse reduziert 
beschrieben.

von Rene B. (themason) Benutzerseite


Lesenswert?

Ich hab mal im Zusammenhang mit dem header und Content mal eine Frage :
Wo kann ich rausbekommen wieviele Bytes ich per AT+CIPSEND schicken kann 
? Ich hab mir mal den "Spaß" gegönnt ein bitmap von Ca 5kb zu 
verschicken. Der ESP quittierte mit "too long". Wo kann ich nachschauen 
wieviele Byte in einem "rutsch" verschickt werden ? Und meine zweite 
Frage ist ob ich größere Pakete durch mehrere CIPSENDs verschicken kann 
oder ob mir da eine Begrenzung im TCP/IP Protokoll greift die den ESP 
erst so klein macht (Paketrouting usw) ? Sprich wenn ich z.b. 10 kb 
verschicken möchte das ich 10 mal 1k verschicke und mit dem 
Content-length Feld "alles gesagt " ist und es egal ist wieviele 
einzelübertragungen das nachher sind ? Ich befürchte das genau das nicht 
geht.

von Stefan F. (Gast)


Lesenswert?

Die Grenze wird von der Firmware festgelegt und variiert je nach 
Version. Bei Version 0.91 kannst du maximal 1024 Bytes am Stück senden.

Die meisten Netzwerke erlauben etwa mehr (zum Beispiel 1,4 Kilobytes). 
Ich glaube, es sind maximal 4kB Möglich, wenn alle betroffenen 
Netzwerkkomponenten mitspielen. Aber das ist eher selten.

10kB gehen jedenfalls nicht, egal welche Firmware zu hast.

von R. W. (Gast)


Lesenswert?

Stefan Us schrieb:
> Schau mal hier rein:
>
> Da habe ich das HTTP Protokoll auf Mikrocontroller Bedürfnisse reduziert
> beschrieben.


..Sehr schön , danke! Kam gerade rechtzeitig rein -

:)

von R. W. (Gast)


Lesenswert?

Stefan Us schrieb:
> 10kB gehen jedenfalls nicht, egal welche Firmware zu hast.


Wie sieht eine Aufsplittung aus
html die ein bild von 10kb inhalt verlinkt wären dann zwei requests,
wie folgt der zweite request in 1024 Teilen für das Bild?

<html>
<body>
<img src="ich.jpg">
</body>
</html>

Dein Fachrat ist gefragt:
Beitrag "ESP8266 hängt bei gleichzeitigem senden/empfangen"

und würde Manuel 'alias Fritz Huber', besser eindenken lassen.
Mich würde das auch mal interessieren, denke ich mache da einen 
entscheideneden Denkfehler mit Stream Technik in einem Request, besser 
vieleicht mehrere Request machen, aber wie sollte man als Server dem 
Clienten auffordern, einen weiteren Request für ein weiteres Teilpaket 
anzufordern?

lg

von Pete K. (pete77)


Lesenswert?

Ein IP-Frame ist durch die MTU festgelegt, typisch so etwa 1500 Bytes. 
Es gibt auch Jumbo-Frames mit 10k, aber das ist eher selten über die 
ganze Kette vom Server zum User.

Du bist hier in der Anwendungsschicht, um das Splitten der Frames und 
das Zusammensetzen in der richtigen Reihenfolge kümmern sich die unteren 
Schichten (TCP/IP).

von Rene B. (themason) Benutzerseite


Lesenswert?

Pete ...

Also ist quasi die Länge der HTML Seite die ich anzeigen kann auf einen 
Frame mit Max MTU Bytes (also zw 1400 und 1500 Byte) begrenzt ?
Das ich mehr übertragen kann wenn ich nicht HTML sondern was eigenes 
mache ist klar, aber da kann ich mich dann nicht auf nem Webbrowser 
einkorken.
Also ist eine Website beim esp erstmal auf einen Frame begrenzt, richtig 
?

von Kablejau (Gast)


Lesenswert?

Rene B. schrieb:
> Pete ...
>
> Also ist quasi die Länge der HTML Seite die ich anzeigen kann auf einen
> Frame mit Max MTU Bytes (also zw 1400 und 1500 Byte) begrenzt ?
> Das ich mehr übertragen kann wenn ich nicht HTML sondern was eigenes
> mache ist klar, aber da kann ich mich dann nicht auf nem Webbrowser
> einkorken.
> Also ist eine Website beim esp erstmal auf einen Frame begrenzt, richtig
> ?

Nein.

Mache dich kundig. Das richte Forum dazu lautet: http://www.esp8266.com/

von Max H. (hartl192)


Lesenswert?

Rene B. schrieb:
> Also ist quasi die Länge der HTML Seite die ich anzeigen kann auf einen
> Frame mit Max MTU Bytes (also zw 1400 und 1500 Byte) begrenzt ?
Nein, ich habe auch ein 10KiB HTML File mit dem ESP-12 versandt, man 
muss es nur in kleinere Pakete aufteilen. Man darf die Verbindung aber 
nicht zwischen den Paketen closen.

von Peter II (Gast)


Lesenswert?

Rene B. schrieb:
> Also ist quasi die Länge der HTML Seite die ich anzeigen kann auf einen
> Frame mit Max MTU Bytes (also zw 1400 und 1500 Byte) begrenzt ?

wie kommst du darauf?

was hindert dich daran den AT+CIPSEND mehrfach aufzurufen?
Hast du es mal getestet was dann passiert?

von Plenk (Gast)


Lesenswert?

Man macht kein Leerzeichen vor Satzzeichen um sowas zu verhindern:
> richtig
> ?

von ;) (Gast)


Lesenswert?

Kablejau schrieb:
>> Also ist eine Website beim esp erstmal auf einen Frame begrenzt, richtig
>> ?
>
> Nein.
>
> Mache dich kundig. Das richte Forum dazu lautet: http://www.esp8266.com/

Wäre ja schön wenn wir alle von deinem Kundtun und der Erfahrung darin 
hier in der Frage mehr erfahren würden, wenn du selber keine Worte hast, 
dann wo du dich kundig gemacht hast und vor allem in welchem Thread 
dort.

quacksalber!

von Stefan F. (Gast)


Lesenswert?

Du kannst auf einer TCP Verbindung beliebige viele Pakete hintereinander 
senden. Der empfangene Browser setzte die Pakete wieder zusammen.

Wie groß die Datei insgesamt ist, teilt man dem Browser entweder über 
einen HTTP Header mit (siehe meine Doku) oder der Server schließt die 
Verbindung zum Schluss.

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.