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


von Max M. (maxmicr)


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)


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)


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)


Lesenswert?

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

von Christopher J. (christopher_j23)


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)


Lesenswert?

Den Sender auf MQTT umstellen wäre sinniger.

von Max M. (maxmicr)


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)


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. (Gast)


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.

von Empfehlung (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.