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.

Auszug der Antwort des Webservers

Auszug der Antwort des Webservers

41 Kommentare

  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

  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?

    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.

  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.

  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ß

    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.

  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?

  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…

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

  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?

    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…

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

  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.

    1. Klaus

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

      1. Andreas

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

    2. Andreas

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

  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.

  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

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

    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?

  12. Erik

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

    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

    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!

      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.

      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.

  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.

    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.

  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?

    1. anonym

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

      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

        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

  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?

    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.

    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.

      1. Jojo

        @MC @Hartmut

        Supergut! Vielen Dank :)

  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.

  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

    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.

      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.

        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

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

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.