Day 8: A browser
In the last days, we mostly dealt with the UDP protocol with which data can be sent out simply and directly. In the next few days, we will deal with the TCP (Transmission Control Protocol). TCP only permits one connection at a time between precisely two computers. It is mostly used online for browsing on websites.
Behind today’s door, there is another resistor with 1 kΩ (brown, black, red). As with all other parts: keep it safe, even though you are not using this part today yet.
The program: Day8_TCPBrowser
The program’s function is similar to the SoftwareSerial program of the first day, but among others, it connects to the WLAN independently at start-up. This saves you a lot of typing and you can start more quickly. Do not forgot that you need to enter your home network’s data into the program. Then enter the following command line in the serial monitor:
AT+CIPSTART=“TCP“,“www.example.com“,80
This command establishes a TCP connection to the website www.example.com. Port 80 is the standard port for HTTP-queries. After confirmation of the connection with OK, you can enter the next command, which you already know:
AT+CIPSEND=40
You want to send a message through the connection you have just established, after all. When you are asked to enter a text with >, first enter
GET / HTTP/1.1
and then push Enter. Enter does not appear in the Serial Monitor, but the module has received it. Then the message continues with
Host:www.example.com
followed by two times Enter. A long text is returned. The first part is the response of the server, containing some information for the browser. The text after <!document html> is the website that you can also see when you call the page www.example.com directly – but purely textbased. A browser would now interpret this text and present it in a form that we understand.
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 ;)