ESP8266 - Eigentliche Daten aus HTTP Request extrahieren

OP #4800422
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?
Gast #4800498
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...
OP #4801608
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).
#4801745
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), ...).
Gast #4802251
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren