From aa0346cdb5a12f8d35468459929c912a734edaff Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 2 Feb 2011 13:41:03 +0100 Subject: [PATCH] added json parsing (fnordlicht output pending...) --- src/fnpom.c | 69 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/src/fnpom.c b/src/fnpom.c index 150d206..83dfa36 100644 --- a/src/fnpom.c +++ b/src/fnpom.c @@ -9,11 +9,11 @@ #include "../lib/libfn.h" -char * http_get_body(char * buffer) { +char * http_get_body(char * response) { char * body; - for (body = buffer; body != '\0'; body++) { - if (body - buffer > 4) { + for (body = response; body != '\0'; body++) { + if (body - response > 4) { if (body[0] == '\r' && body[1] == '\n' && body[2] == '\r' && body[3] == '\n') { return body + 4; } @@ -24,18 +24,10 @@ char * http_get_body(char * buffer) { return NULL; } -int main(int argc, char * argv[]) { +char * http_get(char * response, size_t bytes, char * host, char * port, char * path) { int sd, count; - - char host[] = "volkszaehler.org"; - char port[] = "80"; - char path[] = "/demo/backend.php/data/"; - char uuid[] = "12345678-1234-1234-1234-123456789012"; - char buffer[8192]; - + char request[1024]; struct addrinfo hints, *res; - struct json_tokener *tok; - struct json_object *obj; /* set up connection */ memset(&hints, 0, sizeof hints); @@ -52,26 +44,53 @@ int main(int argc, char * argv[]) { } /* send request */ - sprintf(buffer, "GET %s/%s.json?from=yesterday&tuples=1 HTTP/1.0\r\n\r\n", path, uuid); - send(sd, buffer, strlen(buffer), 0); + sprintf(request, "GET %s HTTP/1.0\r\n\r\n", path); + send(sd, request, strlen(request), 0); /* receive data */ - do { count = recv(sd, buffer, sizeof(buffer), 0); } while (count > 0); + do { count = recv(sd, response, bytes, 0); } while (count > 0); + /* close socket */ + close(sd); + + return response; +} - char * json = http_get_body(buffer); - printf("%s\n", json); +int main(int argc, char * argv[]) { + char host[] = "volkszaehler.org"; + char port[] = "80"; + char path[] = "/demo/backend.php/data/"; + char uuid[] = "12345678-1234-1234-1234-123456789012"; + char response[8192], url[1024], * json; + + struct json_tokener * json_tok; + struct json_object * json_obj; - tok = json_tokener_new(); - obj = json_tokener_parse_ex(tok, json, strlen(json)); + sprintf(url, "%s/%s.txt?from=yesterday&tuples=1", path, uuid); /* store request uri in buffer */ + http_get(response, sizeof(response), host, port, url); /* fetch json data to buffer */ + json = http_get_body(response); /* get pointer to http body */ - if (tok->err != json_tokener_success) - obj = error_ptr(-tok->err); + json_tok = json_tokener_new(); + json_obj = json_tokener_parse_ex(json_tok, json, strlen(json)); + + if (json_tok->err != json_tokener_success) { + json_obj = error_ptr(-json_tok->err); + exit(-1); + } - printf("\n%s\n", json_object_to_json_string(obj)); + /* printf("%s\n", json_object_to_json_string(json_obj)); */ + + json_obj = json_object_object_get(json_obj, "data"); + json_obj = json_object_object_get(json_obj, "last"); + + if (json_object_get_type(json_obj) != json_type_double) { + fprintf(stderr, "invalid json!\n"); + exit(-1); + } + + printf("Last value: %.2f\n", json_object_get_double(json_obj)); /* housekeeping */ - json_tokener_free(tok); - close(sd); + json_tokener_free(json_tok); return 0; }