Tag 8: Ein Browser
In den vorangegangen Tagen haben wir uns vor allem mit dem UDP-Protokoll befasst, mit dem sich einfach und direkt Daten verschicken lassen. Die folgenden Tage werden wir uns mit dem TCP-Protokoll (Transmission Control Protocol) beschäftigen. TCP lässt immer nur eine Verbindung zwischen genau zwei Rechnern zu. Es kommt vor allem im Internet zum Einsatz wenn es ums Browsen auf Webseiten geht.
Hinter dem heutigen Türchen findet sich erneut ein Widerstand 1 kΩ (Braun, Schwarz, Rot). Wie auch bei allen anderen Bauteilen gilt: gut aufbewahren, auch wenn das Bauteil am heutigen Tag noch nicht zum Einsatz kommen wird.
Das Programm: Day8_TCPBrowser
Das Programm ähnelt in der Funktionsweise dem SoftwareSerial Programm vom ersten Tag, stellt allerdings unter anderem die WLAN-Verbindung beim Start selbständig her. So sparen Sie eine Menge Schreibarbeit und können schneller loslegen. Vergessen Sie nicht, die Daten Ihres Heimnetzwerks in das Programm einzutragen. Tippen Sie dann im Seriellen Monitor die folgende Befehlszeile ein:
AT+CIPSTART=“TCP“,“www.example.com“,80
Mit diesem Kommando stellen Sie eine TCP-Verbindung zu der Webseite www.example.com her. Der Port 80 ist der Standardport für HTTP-Anfragen. Nach der Bestätigung der Verbindung mit OK können Sie den nächsten Befehl eintippen, den Sie ja bereits kennen:
AT+CIPSEND=40
Sie wollen nun nämlich eine Nachricht über die eben hergestellte Verbindung schicken. Wenn Sie mit > dazu aufgefordert werden, einen Text einzugeben, tippen Sie zunächst
GET / HTTP/1.1
ein und drücken anschließen Enter. Das Enter erscheint nicht im Serial Monitor, aber das Modul hat es empfangen. Danach geht die Nachricht weiter mit:
Host:www.example.com
gefolgt von zweimal Enter. Zurück kommt ein langer Text. Der erste Teil ist die Antwort des Servers, der ein paar Informationen für den Browser enthält. Der Text nach <!document html> ist die Webseite, die Sie auch sehen, wenn Sie die Seite www.example.com direkt aufrufen, hier allerdings in reiner Textform. Ein Browser würde diesen Text nun interpretieren und in einer uns geläufigen Form darstellen.
Moin,
generell scheint es zu funktionieren. HTTP Antwort kommt, nur ab Accept-Ranges kommt nur noch Datenmüll.
Was stimmt da nicht?
WLAN Connected
My IP is:
AT+CIFSR
+CIFSR:STAIP,“192.168.23.184″
+CIFSR:STAMAC,“18:fe:3
AT+CIPSTART=“TCP“,“www.example.com“,80
CONNECT
OK
AT+CIPSEND=40
OK
> GET / HTTP/1.1
Host:www.example.com
SEND OK
+IPD,1452:HTTP/1.1 200 OK
Accept-Ranges: bytes
C01e, ih/CLOSED
Hallo,
habe zwei Probleme mit dem Programm:
1. Verbindung mit meinem WLan klappt nur durch händisches Eingeben von „AT+CJAB..“ Die verschiedenen Timeouts habe ich bereits hochgesetzt: Zeile34: 5000, Zeile 36:10000, Zeile 81: 10000, Zeile 83: 10000
2. Das Ergebnis einer TCP-Abfrage ist dann aber noch nicht befriedigend:
AT+CIPSTART=“TCP“,“www.example.com“,80
CONNECT
OK
AT+CIPSEND=40
OK
> GET / HTTP/1.1
Host:www.example.com
SEND OK
+IPD,1452:HTTP/1.1 404 Not Found
Pragma: no-cache
Connection:<
::mlec9a
r Su/zdCLOSED
Irgendwelche Tipps?
Moin,
hatte das gleiche (ähnliche) Problem.
Da ich vorher schon was mit Arduino gemacht hatte, hatte ich die vor 2 Jahren bereits die IDE installiert, die mittlerweile bei Versionsnummer 2.1 ist.
Diese scheint veraltet zu sein.
Installiert man jetzt die IDE von der Arduino Seite, erhält man die oben benannte 1.6, die auch eine etwas andere Oberfläche hat. Beim mit dieser Version kompiliertem Code sind die Probleme nicht mehr vorhanden.
Vielleicht ist es ja bei Dir das selbe Problem.
Ok , der 8 Tag war mal was zu Entspannung.
Aber nur, wenn man alle Kommandos per copy past aus einen Text editor eingibt,immer schön 2x enter eingibt und den Timer auf 5000 set.
Danke an die Community für Eure guten Hinweise.
Wer das Problem mit dem Abbruch (CLOSED) nach dem GET Text erhält, sollte im Programm das Timeout in Funktion configStation nach dem CWJAP Befehl von 1000 auf z.B. 5000 setzen.
Danach hat es sofort funktioniert.
Gruß
Prima Tipp!!!!!
Ich habe aber das Timeout sowohl vor als auch nach dem CWJAP Befehl auf 40000 heraufgesetzt.
Nach vier Tagen kein CLOSED mehr.
Juchhu!!!
Jetzt fehlen nur noch Tag 10.
Immer nur blaugrün und ok ohne Temperaturangabe ( nur bei Eingabe New York wird die Led grün Temp: 7 C aber mit Zusatz
ESP SEND ERROR :AT+CIPCLOSE
Und Tag 9
Zählt immer von 00:00:10 beginnend.
Bei Timeouterhöhung auf 60000 dann halt erst ab 00:01:10.
Ich kriege jeweils nur die ersten paar Zeilen sowie eine Fehlermeldung zurück:
*********************************************************
AT+CIPSTART=“TCP“,“www.example.com“,80
CONNECT
OK
AT+CIPSEND=40
OK
> GET / HTTP/1.1
Host:www.example.com
SEND OK
+IPD,1460:HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-ControE>hn: s/
ERROR
ERROR
CLOSED
*****************************
Hatte schon jemand das gleiche Problem?
Hallo zusammen,
hat vielleicht jemand einen Tip: seit zwei Tagen kann ich mich nicht mehr mit AT+CWJAP am WLAN anmelden (Programm von Tag 1), es kommt immer +CWJAP:1 FAIL. Bei verschiedenen WLANs das Gleiche (Heimnetz, mobiler Hotspot mit iPad oder Handy).
Wenn ich aber mit AT+CIPSTA_CUR eine IP festlege, klappt zumindest die Verbindung, das Problem scheint also irgendwie mit den DHCP-Einstellungen zu tun zu haben.
In der Referenz der AT-Kommandos habe ich nichts hifreiches gefunden. Es muss sich wohl um eine persistente Einstellung handeln, denn aucg das Programm von Tag 2, das damals gut funktioniert hat, läuft nun auf den gleichen Fehler. Ein Hardwareproblem ist aber unwahrscheinlich, denn das Tag-6-UDP-Programm funtioniert noch.
Habe jetzt lange alles Mögliche probiert und habe keine Idee mehr…
Hat sich geklärt: es lag an der WLAN-Verschlüsselung, bei mir geht derzeit wohl nur WPA-PSK [TKIP] (mglw. aber auch am WLAN-Standard, denn da TKIP wohl nicht mit 802.11n kompatibel ist, regelt der Router auf einen anderen Standard runter).
Merkwürdig, denn am Anfang hat auch WPA2-PSK [AES] funktioniert (war am Router so eingestellt).
Wäre interessant zu wissen, ob WPA2-PSK [AES] im Prinzip unterstützt wird (nach meiner Recherche eigentlich schon) und warum das bei mir nicht funktioniert (Firmware?, noch ein anderer zu kurzer als der im Sketch gesetzte?).
Funktioniert bei mir wie beschrieben. Der Sinn und Zweck dieser Übung bleibt mir verborgen. Bei Tag 7 hat der NanoESP mir die Stellung des Potis in Zahlenwerten mitgeteilt. Dafür kann ich mir viele Anwendungen vorstellen.
Was macht man mit dem abgerufenen Quelltext einer Webseite?
Stell Dir vor Du hast eine tolle Webseite auf der Du Temperaturen eingeben und verschiedene Buttons drücken kannst. Wenn Dein Arduino dann zyklisch diese Webseite abfragt könntest du von überall in der Welt Deine Heizung steuern oder Rolläden auf und zu machen und ähnliche Sachen…
Psst, nicht weiter sagen, morgen gibt es was mit einer Wetterseite. Könnte ja auch die Seite von einem Stromzähler (Smartmeter) oder die Programmauswahl aus einem Samsungfernseher sein (ok, der ist böse). Oder noch was für Abmahnanwälte: nach Googleanalytics, Datenschutzerklärungen, Impressum oder Kontaktformularen suchen…..
Und damit kommen 5330 Zeilen html zurück:
AT+CIPSTART=“TCP“,“www.telekom.de“,80
AT+CIPSEND=39
GET / HTTP/1.1
Host:www.telekom.de
Respekt.
Dann nimm mal http://www.heise.de. Das hört gar nicht mehr auf.
Heise liefert flott aus und hat viel weniger Leerzeilen, sieht cool aus. Bei der Telekom da ruckelt es schon mal.
ok, rechte Maustaste auf die Webseite und „Seitenquelltext anzeigen“ geht schneller, ist aber langweilig.
Ja wie cool ist das denn:
http://www.example.com 60s
http://www.ct.de 60s
http://www.1und1.de 10s
fritzbox 30s
synology NAS 40s
http://www.telekom.de 300s
http://www.google.de 300s
bis die Verbindung geschlossen wird. Endlich mal ne RFC zum verstehen ;-)
https://tools.ietf.org/html/rfc5482
Und nun ist auch klar, warum manche Seiten schneller sind, da wird dann einfach die Verbindung offen gehalten, wenn man es sich leisten kann.
Error 400 (Bad Request)!!1
*{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:
+IPD,287:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
400. That’s an error.
Your client has issued a malformed or illegal request. That’s all we know.
CLOSED
Error 400 (Bad Request)!!1
*{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:
+IPD,287:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
400. That’s an error.
Your client has issued a malformed or illegal request. That’s all we know.
CLOSED
ist das normal???
Welche Webseite hast Du da probiert aufzurufen? http://www.example.com hat keinen Inhalt von Google. Also entweder Du hast eine Seite von Google aufgerufen und der versteht von Deiner Anfrage irgendwas nicht, oder Du hast irgendwo auf dem Weg ins Internet einen transparenten Proxy. Vielleicht Dein Router?
Das gleiche Problem habe ich auch wenn ich http://www.google.de verwende
http://www.google.de hat 2 Zeichen weniger als http://www.example.com
Hast du auch die Länge in CIPSEND angepasst?
–> AT+CIPSEND=38
Firefox fügt nach „Host:“ noch ein Leerzeichen ein.
Ob das wichtig ist? Vielleicht ist google etwas pingeliger?
Achtung: wird dann wieder um eins länger!
Nein, daran liegt es definitiv nicht.
Ich habe mal eine Version gemacht, wo man die Webseite direkt eintragen kann:
https://my.sofortcloud.com/public.php?service=files&t=284076a0d5aa2336d3783f030fd47851
Einfach WLAN-Daten eintragen und in Zeile 18 die gewünschte Domain eingeben. Unterseiten sind nicht möglich, da der String für den Verbindungsaufbau und den Download verwendet wird.
Dabei kommt mir noch eine Idee, was bei Euch noch sein könnte:
Wenn Ihr auf Google umstellt, müsst Ihr natürlich auch beide Strings ändern, den Connect UND Host. Nicht dass Ihr nur einen geändert habt.
Ich habe mal eine Variante gemacht, wo man die Seite eintippen kann:
https://my.sofortcloud.com/public.php?service=files&t=547e30628ab16f853bdd020ca4431523
Nachdem eine Seite herunter geladen ist, kann die nächste URL eingegeben werden.
Programm läuft, der Request geht zum Server und ich bekomme auch eine Antwort. Jedoch mit der Fehlermeldung „400 bad request“
Ich vermute, dass die Syntax der Anfrage nicht ganz in Ordnung ist.
Ich habe es auch ein paar mal versucht, und es kam, wie bei Dir auch „Connection: close“.
Allerdings kam bei mir die Fehlermeldung 408 und und er hat nach dem zweiten Druck auf „Enter“ immer geschrieben „> GET / HTTP/1.1Host:www.example.combusy s…“
Ich habe dann den PC nochmal neu gestartet, und nach Start des seriellen Monitors nochmal von vorne angefangen. Dann hat es funktioniert.
Bisher hat Alles wunderbar funktioniert aber beim Versuch dieses Programm zu starten geht es schief, obwohl http://www.example.com anzusprechen ist:
ERROR
AT+CIPSTART=“TCP“,“www.example.com“,80
no ip
Hat jemand eine Idee?
Du musst wenn du copy paste machst, musst die Anführungszeichen neu eingeben.
Bei falschen Anführungszeichen wegen c&p kommt aber
Link typ ERROR
no ip deutet doch eher auf fehlende Namensauflösung. Ist im lokalen Netzwerk ein Gerät mit Weboberfläche (Drucker, NAS, Router)? Dann mal mit einer lokale IP probieren:
AT+CIPSTART=“TCP“,“10.11.12.55″,5000
Das ist der Adminport an meinem lokalen NAS DS214 von Synology
Der geht auch:
AT+CIPSTART=“TCP“,“193.99.144.80″,80
(eventuell wieder Anführungszeichen tauschen), ist der ct-Server http://www.ct.de
Kurze Frage nebenbei: Wenn ich den NanoESP autark über Batterie betreiben möchte – was nehm ich dann am besten? Reicht in 9V Block?
Hallo Jojo,
unter „WIFI-BOARD“ -> „TECHNISCHE DATEN“ im Menü oben findest Du folgende Angabe:“Empfohlene Eingangsspannung: 7-12 V“
Insofern gehe ich davon aus, dass ein 9V Block OK ist.
Schau mal in die Anleitung. An Tag 12 wird die 9V Batterie angeschlossen.
Möglich ist aber auch irgendeine Powerbank über USB anzuschliessen.
@MC @Hartmut
Supergut! Vielen Dank :)
Ah, ich befürchte, da hat jemand einen Reaktionstest ins Programm eingebaut ;) : Man muss nach dem „GET / HTTP/1.1“ das „Host:www.example.com“ ganz schnell eingeben. Dann klappt es.
HGm, ich habe es jetzt mehrmals versucht, aber nach „GET / HTTP/1.1“ kommt immer ein „CLOSED“ und das war es dann.
Gruß
Roland
Ich habe mir eine Datei gemacht, aus der ich die Eingaben kopieren kann. Somit geht es schneller und bei mir klappt es wunderbar. Außerdem stimmen dann schon mal die Anführungszeichen.
Das Anhängen einer Textdatei scheint hier wohl nicht zu funktionieren, Schade. So sieht die Textdatei bei mir aus:
AT+CIPSTART=“TCP“,“www.example.com“,80
AT+CIPSEND=40
GET / HTTP/1.1
Host:www.example.com
Wenn ihr den Text in eine Notepad kopiert und die Anführungszeichen ausbessert, dann solltet ihr eine gute Vorlage haben, um Zeile für Zeile in den seriellen Monitor zu kopieren und mit der Eingabetaste abzusenden. Nicht vergessen nach der letzten Zeile zwei mal die Eingabetaste drücken.
I think you’ll need to add a space around the „/“ after „GET“ and before „HTTP“ as shown below:
GET(space)/(space)HTTP/1.1
Stimmt, da muss man ganz schön schnell sein, damit nicht vorher „Closed“ kommt. Ist aber auch logisch, da der Computer die Befehle ja direkt hintereinander verschickt d.h. keine Zeit zum Tippen braucht ;)