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
<!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><p>HelloWorld</p></head><body><p>thisisESP8266talking</p><hr><p>time:14.01.201519:15:53</p></body></html>
24
SENDOK
25
Unlink
aber anstatt der Webbrowser den HTML Code interpretiert, wird mein
gesendeter Text in Klarform dargestellt, sprich im Browser erscheint nun
1
<!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><p>HelloWorld</p></head><body><p>thisisESP8266talking</p><hr><p>time:14.01.201518: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
Danke für die Hinweise, das macht absolut Sinn :-)
Trotzdem kommt nur folgender Text im Browser an
1
HTTP/1.1200OK
2
Content-Type:text/html
3
<!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><p>HelloWorld</p></head><body><p>thisisESP8266talking</p><hr><p>time:14.01.201521: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
voidHTML_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...?
@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
>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
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!?
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.
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.
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.
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.
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 -
:)
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
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).
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
?
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/
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.
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?
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!
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.