Forum: Mikrocontroller und Digitale Elektronik ESP8266 - Eigentliche Daten aus HTTP Request extrahieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Max M. (maxmicr)


Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

ich versuche gerade einen einfache Http Request mit dem esp8266 
durchzuführen. Im "tcp_recv" callback erhalte ich folgende Daten:
1
HTTP/1.1 200 OK
2
Date: Sun, 20 Nov 2016 21:34:01 GMT
3
Server: Apache/2.2.16 (Unix) mod_ssl/2.2.16 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4 mod_auth_passthrough/2.1 mod_wsgi/3.3 Python/2.7.1
4
X-Powered-By: PHP/5.3.8
5
Connection: close
6
Content-Type: application/json
7
8
"5"

Das was für mich eigentlich interessant ist, ist die "5". Warum genau 
landen die restlichen Sachen auch in der data-Variable? Der Callback 
sieht so aus:
1
LOCAL void ICACHE_FLASH_ATTR tcp_recv_cb(void *arg, char *data, unsigned short len){
2
}

Wie komme ich nun an meine "5" ran?

von yesitsme (Gast)


Bewertung
2 lesenswert
nicht lesenswert
Du scheinst auf TCP-Ebene zu arbeiten. Da ist es völlig normal, das du 
auch den HTTP-header mit einliest.

Der Header wird mit einem doppelten Zeilenumbruch beendet.

Die 1. Zeile mußt du auswerten, ob im rest des Headers wichtige 
Informationen drin sind, hängt von deiner Anfrage ab...

von Max M. (maxmicr)


Bewertung
0 lesenswert
nicht lesenswert
Okay, danke. Ich hab das nun so gelöst, um die 5 zu extrahieren:
1
  char subbuff[2];
2
  os_memcpy(subbuff,&data[len-2],1);
3
  subbuff[1] = '\0';

Gibt es da vllt. einen einfacheren / besseren Weg?

von yesitsme (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit vernünftig den Header parsen und im Anschluß das JSON?

von Christopher J. (christopher_j23)


Bewertung
0 lesenswert
nicht lesenswert
Max M. schrieb:
> Gibt es da vllt. einen einfacheren / besseren Weg?

Die Frage ist, was passiert wenn statt einer 5 eine 15 im Body steht?

Hier hast du eine (sehr schlanke) Referenz:
https://github.com/Caerbannog/esphttpclient

Beispiele findest du in /test.

von Oliver S. (phetty)


Bewertung
0 lesenswert
nicht lesenswert
Den Sender auf MQTT umstellen wäre sinniger.

von Max M. (maxmicr)


Bewertung
0 lesenswert
nicht lesenswert
Christopher J. schrieb:
> Die Frage ist, was passiert wenn statt einer 5 eine 15 im Body steht?

Das ist ausgeschlossen, da ich die Eingabe kontrolliere.

Oliver S. schrieb:
> Den Sender auf MQTT umstellen wäre sinniger.

Ich lese Daten über eine Website ein und würde das ganze gerne auch vom 
Handy aus machen können. Funktioniert MQTT auch auf dem Smartphone und 
auf dem PC bzw. ist es so flexibel, wie es eine Website ist?

yesitsme schrieb:
> Wie wäre es mit vernünftig den Header parsen und im Anschluß das JSON?

Hm, was hab ich davon? Wenn kein HTTP Connect zustande kommt, wird die 
Funktion sowieso nicht aufgerufen (denke ich mal).

von Sheeva P. (sheevaplug)


Bewertung
1 lesenswert
nicht lesenswert
Max M. schrieb:
> yesitsme schrieb:
>> Wie wäre es mit vernünftig den Header parsen und im Anschluß das JSON?
>
> Hm, was hab ich davon? Wenn kein HTTP Connect zustande kommt, wird die
> Funktion sowieso nicht aufgerufen (denke ich mal).

Ja. Aber der Webserver könnte aus verschiedenen Gründen statt eines "200 
Ok" einen anderen Statuscode zurückgeben. Wenn Du Dein Programm robust 
gestalten möchtest, dann solltest Du wenigstens das überprüfen.

Ansonsten funktioniert Deine Methode natürlich nur, wenn Dein Programm 
nur genau eine Ziffer oder genau einen Buchstaben erhält. Es wäre 
zweifellos eleganter, robuster und wiederverwendbarer, wenn Du mit 
strstr(3) nach den Zeichenfolgen "\r\n\r\n" bzw. "\n\n" suchst, die den 
Header vom Body trennen (letzteres ist eigentlich nicht zulässig, kommt 
trotzdem vor), und dann den verbleibenden Body auszuwerten (strtol(3), 
sscanf(3), ...).

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ein anderer einfacher Lösungsansatz wäre, die gewünschten Nutzdaten mit 
einem eindeutigen Prefix zu versehen, die zum Beispiel:
1
HTTP/1.1 200 OK
2
Date: Sun, 20 Nov 2016 21:34:01 GMT
3
Server: Apache/2.2.16 (Unix) mod_ssl/2.2.16 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4 mod_auth_passthrough/2.1 mod_wsgi/3.3 Python/2.7.1
4
X-Powered-By: PHP/5.3.8
5
Connection: close
6
Content-Type: application/json
7
8
MeineDaten=5
Emfängerzeitig liest du dann die HTTP response Zeilenweise aus, bis du 
eine Zeile gefunden hast, die mit "MeineDaten=" beginnt. Dahinter kommt 
dann die Zahl und dahinter vielleicht noch ein zeilenumbruch.

: Bearbeitet durch User
von Empfehlung (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gerade ist ein schönes deutschsprachiges ESP8266-Praxisbuch auf den 
Markt gekommen. Einfach mal googeln :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.