2016-06-06 42 views
1

Ich programm esp8266 mit der Arduino IDE. Ich schließe mich dem lokalen Netzwerk via WIFI an. Letztendlich möchte ich JSON-Inhalte herunterladen, die auf dem lokalen Server generiert wurden. Ich bin mit dem Code:Arduino IDE ESP8266 JSON Dekodieren von URL

#include <ESP8266WiFi.h> 
    #include <ArduinoJson.h> 

    const char* ssid  = "NeoRaf"; 
    const char* password = "password"; 
    const char* host = "192.168.1.8"; 

    void setup() { 
     Serial.begin(115200); 
     delay(100); 

     // We start by connecting to a WiFi network 

     Serial.println(); 
     Serial.println(); 
     Serial.print("Connecting to "); 
     Serial.println(ssid); 

     WiFi.begin(ssid, password); 

     while (WiFi.status() != WL_CONNECTED) { 
     delay(500); 
     Serial.print("."); 
     } 

     Serial.println(""); 
     Serial.println("WiFi connected"); 
     Serial.println("IP address: "); 
     Serial.println(WiFi.localIP()); 

     //----------------------- 
     delay(5000); 

     Serial.print("connecting to "); 
     Serial.println(host); 

     // Use WiFiClient class to create TCP connections 
     WiFiClient client; 
     const int httpPort = 8095; 
     if (!client.connect(host, httpPort)) { 
     Serial.println("connection failed"); 
     return; 
     } 

     // We now create a URI for the request 
     String url = "/api"; 
     Serial.print("Requesting URL: "); 
     Serial.println(url); 

     // This will send the request to the server 
     client.print("GET " + url + " HTTP/1.1\r\n" + 
        "Host: " + host + "\r\n" + 
        "ApiCode: 8273\r\n" + 
        "Content-Type: application/json\r\n" + 
        "Connection: close\r\n\r\n"); 
     delay(500); 
     char c[1024]; 
     // Read all the lines of the reply from server and print them to Serial 
     while(client.available()){ 
      c[0] = client.read(); 

     //Serial.print(c); 

    Serial.print(c); 
    } 
     StaticJsonBuffer<200> jsonBuffer; 
     JsonObject& root = jsonBuffer.parseObject(c); 
     int data = root["lowVersion"]; 
     Serial.println(); 
     Serial.print(data); 

     Serial.println(); 
     Serial.println("closing connection"); 
    } 

    void loop() 
    {} 

Das Ergebnis ist dieses:

Connecting to NeoRaf 
    ...... 
    WiFi connected 
    IP address: 
    192.168.1.21 
    connecting to 192.168.1.8 
    Requesting URL: /api 
    HTTP/1.1 200 OK 
    Content-Length: 32 
    Content-Type: application/json 
    Server: Microsoft-HTTPAPI/2.0 
    Access-Control-Allow-Origin: * 
    Date: Mon, 06 Jun 2016 16:50:48 GMT 
    Connection: close 

{"lowVersion":1,"highVersion":3} 
0 
closing connection 

Diese Linie ist JSON:

{"lowVersion":1,"highVersion":3} 

So sollte es angezeigt 1 und zeigt 0 ich nicht wissen, wie man die Überschrift loswird:

HTTP/1.1 200 OK 
Content-Length: 32 
Content-Type: application/json 
Server: Microsoft-HTTPAPI/2.0 
Access-Control-Allow-Origin: * 
Date: Mon, 06 Jun 2016 16:50:48 GMT 

und wie liest man den Inhalt von JSON (lowVersion oder highVersion)?

Antwort

1

Sie müssen erkennen, wann die Payload in der HTTP-Antwort startet. Wenn Sie also Daten vom Client lesen, können Sie alle HTTP-Headerzeilen überspringen. Übrigens bedeutet in einer JSON-Antwort der erste { normalerweise den Start des JSON-Dokuments.

httpbin Beispiel

anfordern http://httpbin.org/get Erträge

{ 
    "args": {}, 
    "headers": { 
    ... 
    }, 
    "origin": "XXXXXXX", 
    "url": "http://httpbin.org/get" 
} 

Sie können wie so das "url" Feld drucken:

String json = ""; 
boolean httpBody = false; 
while (client.available()) { 
    String line = client.readStringUntil('\r'); 
    if (!httpBody && line.charAt(1) == '{') { 
    httpBody = true; 
    } 
    if (httpBody) { 
    json += line; 
    } 
} 
StaticJsonBuffer<400> jsonBuffer; 
Serial.println("Got data:"); 
Serial.println(json); 
JsonObject& root = jsonBuffer.parseObject(json); 
String data = root["url"]; 
+0

Problem .... – Rafik73

0

Zu allererst für HTTP-Anforderungen der Handhabung, können Sie eine RestClient-Bibliothek, anstatt alle Anfragen auf niedriger Ebene zu schreiben. Es spart viel Zeit und ist weniger fehleranfällig.

Zum Beispiel für eine GET-Anfrage, alles, was Sie tun müssen, ist:

String response = ""; 
int statusCode = client.get("/", &response); 

One good such library mit SSL-Unterstützung wird geschrieben von Github Benutzer DaKaz.

Sie können es für Ihre GET-Anfrage verwenden. Die zurückgegebene Antwort wird ohne den HTTP-Header sein. Die Funktion gibt die Antwort vom Server ohne die Header zurück.

Jetzt können Sie die ArduinoJson-Bibliothek von bblanchin für die Decodierung des JSON-Objekts verwenden.

Einzelheiten here. gesehen

werden kann, oder Sie können einfacher String manipuation tun, um die Werte zu erhalten, obwohl es keine empfohlene Route zu nehmen und ist fehleranfällig.

1

HTTP-Header enden immer mit einer leeren Zeile, Sie müssen also nur lesen, bis Sie zwei aufeinanderfolgende Zeilenumbrüche finden.

Werfen Sie einen Blick auf ArduinoJson ‚s Beispiel JsonHttpClient.ino, verwendet es Stream::find():

// Skip HTTP headers so that we are at the beginning of the response's body 
bool skipResponseHeaders() { 
    // HTTP headers end with an empty line 
    char endOfHeaders[] = "\r\n\r\n"; 

    client.setTimeout(HTTP_TIMEOUT); 
    bool ok = client.find(endOfHeaders); 

    if (!ok) { 
    Serial.println("No response or invalid response!"); 
    } 

    return ok; 
} 
Verwandte Themen