[vz-users] JSON parsen auf ESP8266 mit Arduino IDE
Frank Richter
frank.richter83 at gmail.com
Fri Jul 21 11:51:08 CEST 2017
Hallo Christian,
ich hab das auch noch nie gemacht, aber du solltest deinen Code schon
irgendwie an die gelieferte JSON-Struktur anpassen. "name" und "company"
wirst du hier wohl kaum finden...
Grüße
Frank
Am 21.07.2017 11:22 schrieb "Christian Wulff" <christianwulff at gmx.de>:
> Moin,
>
>
>
> Ich möchte auf einem kleinen Display mit WLAN Verbindung ein super einfach
> zu nutzendes Frontend bauen, das man überall platzieren kann und nur
> einschalten muss.
>
> Das Display kriege ich angesteuert und Datum und Zeit werden bereits per
> ntp eingelesen und auf dem Display angezeigt.
>
> Nun fehlen noch die Temperaturen auf dem Display.
>
> Die Daten sollen über WLAN per http Request und JSON eingelesen und
> ausgewertet werden.
>
> HTTP Request und JSON funktioniert, habe ich im Browser getestet und mir
> die Daten angesehen.
>
> Dann habe ich mir die Bibliothek ArduinoJson installiert und mir das
> Beispiel JsonHttpClient angesehen. Dies habe ich von Ethernet bereits auf
> WLAN umgestrickt.
>
>
>
> Ich glaube der HTTP Request funktioniert bereits, allerdings gibt es
> irgendein Problem beim parsen. Da komme ich auch nach einiger Recherche
> leider nicht weiter.
>
>
>
> Vielleicht kann hier jemand helfen?
>
>
>
> (Der Code ist noch nicht aufgeräumt, da sind noch Reste vom Beispiel drin,
> ich glaube aber nicht dass die das Problem verursachen)
>
>
>
> ************************************************************
> ************************************************************
> **************************************************************
>
> #include <ArduinoJson.h>
>
> #include <ESP8266WiFi.h>
>
> #include <WiFiClient.h>
>
> #include <WiFiUdp.h>
>
> WiFiClient client;
>
> const char WiFiSSID[] = "Chriss 123456"; //### your Router SSID
>
> const char WiFiPSK[] = "1234567890132654"; //### your Router Password
>
> const char* server = "192.168.178.43"; // server's address
>
> const char* resource = "/middleware.php/channel/003321-9654-146-acf4-754654654.json";
> // http resource Kanalinfo Temperatur AUSSEN
>
> const unsigned long BAUD_RATE = 9600; // serial connection
> speed
>
> const unsigned long HTTP_TIMEOUT = 10000; // max respone time from server
>
> const size_t MAX_CONTENT_SIZE = 512; // max size of the HTTP response
>
> bool isConnected(long timeOutSec) {
>
> timeOutSec = timeOutSec * 1000; int z = 0;
>
> while (WiFi.status() != WL_CONNECTED) {
>
> delay(200);
>
> Serial.print(".");
>
> if (z == timeOutSec / 200) { return false; }
>
> z++; } return true;}
>
>
>
> // The type of data that we want to extract from the page
>
> struct UserData {
>
> char name[32];
>
> char company[32];
>
> char type[32];
>
> char color[32];
>
> char title[32];
>
> };
>
>
>
> // ARDUINO entry point #1: runs once when you press reset or power the
> board
>
> void setup() {
>
> initSerial();
>
> WiFi.mode(WIFI_STA);
>
> WiFi.begin(WiFiSSID, WiFiPSK);
>
> if (isConnected(30)) {
>
> Serial.println(F("WLAN läuft")); }}
>
>
>
> // ARDUINO entry point #2: runs over and over again forever
>
> void loop() {
>
> if (connect(server)) {
>
> if (sendRequest(server, resource) && skipResponseHeaders()) {
>
> UserData userData;
>
> if (readReponseContent(&userData)) {
>
> printUserData(&userData);
>
> }
>
> }
>
> }
>
> disconnect();
>
> wait();
>
> }
>
>
>
> // Initialize Serial port
>
> void initSerial() {
>
> Serial.begin(BAUD_RATE);
>
> while (!Serial) {
>
> ; // wait for serial port to initialize
>
> }
>
> Serial.println("Serial ready");
>
> }
>
>
>
> // Open connection to the HTTP server
>
> bool connect(const char* hostName) {
>
> Serial.print("Connect to ");
>
> Serial.println(hostName);
>
> bool ok = client.connect(hostName, 80);
>
> Serial.println(ok ? "Connected" : "Connection Failed!");
>
> return ok;
>
> }
>
>
>
> // Send the HTTP GET request to the server
>
> bool sendRequest(const char* host, const char* resource) {
>
> Serial.print("GET ");
>
> Serial.println(resource);
>
> client.print("GET ");
>
> client.print(resource);
>
> client.println(" HTTP/1.0");
>
> client.print("Host: ");
>
> client.println(host);
>
> client.println("Connection: close");
>
> client.println();
>
> return true;
>
> }
>
>
>
> // 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;
>
> }
>
>
>
> // Parse the JSON from the input string and extract the interesting values
>
> // Here is the JSON we need to parse
>
> // {
>
> // "id": 1,
>
> // "name": "Leanne Graham",
>
> // "username": "Bret",
>
> // "email": "Sincere at april.biz",
>
> // "address": {
>
> // "street": "Kulas Light",
>
> // "suite": "Apt. 556",
>
> // "city": "Gwenborough",
>
> // "zipcode": "92998-3874",
>
> // "geo": {
>
> // "lat": "-37.3159",
>
> // "lng": "81.1496"
>
> // }
>
> // },
>
> // "phone": "1-770-736-8031 x56442",
>
> // "website": "hildegard.org",
>
> // "company": {
>
> // "name": "Romaguera-Crona",
>
> // "catchPhrase": "Multi-layered client-server neural-net",
>
> // "bs": "harness real-time e-markets"
>
> // }
>
> // }
>
>
>
> // {
>
> // "version": "0.3",
>
> // "entity": {
>
> // "uuid": "003321-9654-146-acf4-754654654",
>
> // "type": "temperature",
>
> // "active": false,
>
> // "color": "#009933",
>
> // "fillstyle": 0,
>
> // "public": true,
>
> // "style": "lines",
>
> // "title": "T01 Aussen",
>
> // "yaxis": "auto"
>
> // }
>
> // }
>
>
>
>
>
> bool readReponseContent(struct UserData* userData) {
>
> // Compute optimal size of the JSON buffer according to what we need to
> parse.
>
> // See https://bblanchon.github.io/ArduinoJson/assistant/
>
> const size_t BUFFER_SIZE =
>
> JSON_OBJECT_SIZE(2) // the root object has 2 elements
>
> + JSON_OBJECT_SIZE(9) // the "entity" object has 5 elements
>
> + MAX_CONTENT_SIZE; // additional space for strings
>
>
>
> // Allocate a temporary memory pool
>
> DynamicJsonBuffer jsonBuffer(BUFFER_SIZE);
>
> JsonObject& root = jsonBuffer.parseObject(client);
>
> if (!root.success()) {
>
> Serial.println("JSON parsing failed!");
>
> return false;
>
> }
>
>
>
> // Here were copy the strings we're interested in
>
> strcpy(userData->name, root["name"]);
>
> strcpy(userData->company, root["company"]["name"]);
>
> // It's not mandatory to make a copy, you could just use the pointers
>
> // Since, they are pointing inside the "content" buffer, so you need to
> make
>
> // sure it's still in memory when you read the string
>
> return true;
>
> }
>
>
>
> // Print the data extracted from the JSON
>
> void printUserData(const struct UserData* userData) {
>
> Serial.print("Name = ");
>
> Serial.println(userData->name);
>
> Serial.print("Company = ");
>
> Serial.println(userData->company);
>
> }
>
>
>
> // Close the connection with the HTTP server
>
> void disconnect() {
>
> Serial.println("Disconnect");
>
> client.stop();
>
> }
>
>
>
> // Pause for a 1 minute
>
> void wait() {
>
> Serial.println("Wait 60 seconds");
>
> delay(60000);
>
> }
>
> ************************************************************
> ************************************************************
> **************************************************************
>
>
>
>
>
>
>
> Als Fehler kommt da folgendes bei raus:
>
>
>
>
>
>
>
>
>
> ************************************************************
> ************************************************************
> **************************************************************
>
> Serial ready
>
> ...................................WLAN läuft
>
> Connect to 192.168.178.43
>
> Connected
>
> GET /middleware.php/channel/003321-9654-146-acf4-754654654.json
>
>
>
> Exception (28):
>
> epc1=0x4000bf0e epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000
> depc=0x00000000
>
>
>
> ctx: cont
>
> sp: 3ffef9e0 end: 3ffefca0 offset: 01a0
>
>
>
> >>>stack>>>
>
> 3ffefb80: 3ffe8550 00000000 3fff05a8 402024d5
>
> 3ffefb90: 3ffefba4 3ffeeb28 3ffe0000 3ffefba4
>
> 3ffefba0: 3fffda0a 3ffe8550 3ffeeb28 3fff059c
>
> 3ffefbb0: 00000580 3ffe84d0 3ffeeb28 40201e03
>
> 3ffefbc0: 0a0d0a0d 00000000 3ffeec44 3ffeec70
>
> 3ffefbd0: 3fffdad0 00000000 3ffe836c 40202605
>
> 3ffefbe0: ffffff00 43ffffff 73697268 39333720
>
> 3ffefbf0: 00000030 00000000 3ffeec44 401004d8
>
> 3ffefc00: feefeffe 33000001 39303632 33353237
>
> 3ffefc10: 39383534 00000001 3ffe8715 4020391c
>
> 3ffefc20: 401051fc 002266eb 3ffeeb88 3ffeec70
>
> 3ffefc30: 3fffdad0 0000000b 3ffeec44 402032e1
>
> 3ffefc40: 3ffe8714 3ffeec70 40203638 3ffeec80
>
> 3ffefc50: 3ffefddc 0000000a 3ffeec44 4020330c
>
> 3ffefc60: 3fffdad0 00000000 3ffeec44 40203330
>
> 3ffefc70: 3fffdad0 00000000 3ffeeb50 40201d44
>
> 3ffefc80: feefeffe feefeffe 3ffeec68 40203684
>
> 3ffefc90: feefeffe feefeffe 3ffeec80 40100718
>
> <<<stack<<<
>
> ************************************************************
> ************************************************************
> **************************************************************
>
>
>
> Kann hier vielleicht jemand weiterhelfen?
>
>
>
> Lieben Gruß und lieben Dank,
>
> Chris
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20170721/f77b0690/attachment-0001.html>
More information about the volkszaehler-users
mailing list