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.

Auszug der Antwort des Webservers

Excerpt from the answer of the web server

41 Comments

  1. Nikopol

    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

    Reply
  2. Sascha

    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?

    Reply
    1. Nikopol

      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.

      Reply
  3. RICI

    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.

    Reply
  4. M. Bichler

    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ß

    Reply
    1. Christoph

      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.

      Reply
  5. hazel_grouse

    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?

    Reply
  6. Jörg

    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…

    Reply
    1. Jörg

      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?).

      Reply
  7. Tanja

    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?

    Reply
    1. Karsten

      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…

      Reply
    2. Andreas

      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…..

      Reply
  8. Andreas

    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.

    Reply
    1. Klaus

      Dann nimm mal http://www.heise.de. Das hört gar nicht mehr auf.

      Reply
      1. Andreas

        Heise liefert flott aus und hat viel weniger Leerzeilen, sieht cool aus. Bei der Telekom da ruckelt es schon mal.

        Reply
    2. Andreas

      ok, rechte Maustaste auf die Webseite und "Seitenquelltext anzeigen" geht schneller, ist aber langweilig.

      Reply
  9. Andreas

    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.

    Reply
  10. Markus

    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

    Reply
  11. Markus

    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???

    Reply
    1. Klaus

      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?

      Reply
  12. Erik

    Das gleiche Problem habe ich auch wenn ich http://www.google.de verwende

    Reply
    1. Raabinator

      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

      Reply
    2. Raabinator

      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!

      Reply
      1. Klaus

        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.

        Reply
      2. Klaus

        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.

        Reply
  13. Erik

    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.

    Reply
    1. MC

      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.

      Reply
  14. Michael

    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?

    Reply
    1. anonym

      Du musst wenn du copy paste machst, musst die Anführungszeichen neu eingeben.

      Reply
      1. Andreas

        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

        Reply
        1. Andreas

          Der geht auch:

          AT+CIPSTART="TCP","193.99.144.80″,80

          (eventuell wieder Anführungszeichen tauschen), ist der ct-Server http://www.ct.de

          Reply
  15. Jojo

    Kurze Frage nebenbei: Wenn ich den NanoESP autark über Batterie betreiben möchte – was nehm ich dann am besten? Reicht in 9V Block?

    Reply
    1. MC

      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.

      Reply
    2. Hartmut

      Schau mal in die Anleitung. An Tag 12 wird die 9V Batterie angeschlossen.

      Möglich ist aber auch irgendeine Powerbank über USB anzuschliessen.

      Reply
      1. Jojo

        @MC @Hartmut

        Supergut! Vielen Dank :)

        Reply
  16. Roland G. Hülsmann

    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.

    Reply
  17. Roland G. Hülsmann

    HGm, ich habe es jetzt mehrmals versucht, aber nach "GET / HTTP/1.1" kommt immer ein "CLOSED" und das war es dann.

    Gruß
    Roland

    Reply
    1. MartinS

      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.

      Reply
      1. MartinS

        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.

        Reply
        1. JustinG

          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

          Reply
    2. Santiago

      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 ;)

      Reply

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.