ESP8266 - Eigentliche Daten aus HTTP Request extrahieren

OP #4800422
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
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
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).
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.