add functions for handling json data 18/145318/2
authorJeonghoon Park <jh1979.park@samsung.com>
Tue, 22 Aug 2017 05:27:06 +0000 (14:27 +0900)
committerJeonghoon Park <jh1979.park@samsung.com>
Tue, 22 Aug 2017 05:30:24 +0000 (14:30 +0900)
Change-Id: Id3c4ed038b97c1ab1fbce6901b1c14b6f90fbbf8

CMakeLists.txt [changed mode: 0644->0755]
inc/webutil.h
packaging/org.tizen.position-finder-client.spec
src/controller.c [changed mode: 0644->0755]
src/webutil.c

old mode 100644 (file)
new mode 100755 (executable)
index 71679ac..45fe33d
@@ -17,6 +17,8 @@ SET(CHECK_MODULES
        eina
        ecore
        libcurl
+       glib-2.0
+       json-glib-1.0
 )
 
 INCLUDE(FindPkgConfig)
@@ -24,6 +26,7 @@ pkg_check_modules(APP_PKGS REQUIRED ${CHECK_MODULES})
 
 ADD_DEFINITIONS(-DCBOR_FILE_IN_RES="${INSTALL_RESDIR}/${CBOR_FILE}")
 ADD_DEFINITIONS(-DCBOR_FILE_IN_DATA="${INSTALL_OWNER_DATADIR}/${CBOR_FILE}")
+ADD_DEFINITIONS(-DWEB_API_URI_DEV=\"http://10.113.63.43:3000/api/sensor/data\")
 
 FOREACH (flag ${APP_PKGS_CFLAGS})
     SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
index aac2164..ed184c8 100755 (executable)
 #ifndef __POSITION_FINDER_WEBUTIL_H__
 #define __POSITION_FINDER_WEBUTIL_H__
 
+typedef enum {
+       WEB_UTIL_SENSOR_NONE = 0,
+       WEB_UTIL_SENSOR_MOTION = (1 << 0), /* IR motion sensor */
+       WEB_UTIL_SENSOR_FLAME = (1 << 1), /* flame sensor */
+       WEB_UTIL_SENSOR_HUMIDITY = (1 << 2), /* humidity sensor */
+       WEB_UTIL_SENSOR_TEMPERATURE = (1 << 3), /* temperature sensor */
+       WEB_UTIL_SENSOR_VIB = (1 << 4), /* vibration sensor */
+       WEB_UTIL_SENSOR_CO2 = (1 << 5), /* CO2 sensor */
+       WEB_UTIL_SENSOR_SOUND = (1 << 6), /* noise sensor */
+} web_util_sensor_type_e;
+
+typedef struct _web_util_sensor_data_s web_util_sensor_data_s;
+struct _web_util_sensor_data_s {
+       bool pir;
+       bool flame;
+       double humidity;
+       double temperature;
+       bool virbration;
+       double co2;
+       int soundlevel;
+       web_util_sensor_type_e enabled_sensor;
+       char *hash;
+};
+
 int web_util_noti_init(void);
 void web_util_noti_fini(void);
 int web_util_noti_post(const char *resource, const char *json_data);
 
+int web_util_json_init(void);
+int web_util_json_fini(void);
+int web_util_json_data_array_begin(void);
+int web_util_json_data_array_end(void);
+int web_util_json_add_sensor_data(const char* sensorpi_id, web_util_sensor_data_s sensor_data);
+char *web_util_get_json_string(void);
+
 #endif /* __POSITION_FINDER_WEBUTIL_H__ */
\ No newline at end of file
index ea1005d..7abcb8e 100644 (file)
@@ -23,6 +23,8 @@ BuildRequires:  pkgconfig(iotcon)
 BuildRequires:  pkgconfig(eina)
 BuildRequires:  pkgconfig(ecore)
 BuildRequires:  pkgconfig(libcurl)
+BuildRequires:  pkgconfig(glib-2.0)
+BuildRequires:  pkgconfig(json-glib-1.0)
 
 %description
 Client for Position Finder
old mode 100644 (file)
new mode 100755 (executable)
index f765296..0cf76d4
 #include "log.h"
 #include "controller.h"
 #include "connectivity.h"
+#include "webutil.h"
 
 #define MAX_QUEUE_ELEMENTS 30
 #define DOOR_RESOURCE_TYPE "org.tizen.door"
 #define FINDING_SERVER_INTERVAL 5.0f
 #define POPPING_VALUE_INTERVAL 10.0f
 
+#ifdef WEB_API_URI_PUBLIC
+#define WEB_API_URI WEB_API_URI_PUBLIC
+#else
+#define WEB_API_URI WEB_API_URI_DEV
+#endif
+
 void _observe_resource_cb(connectivity_resource_s *resource_info, void *resource_data, void *user_data)
 {
        int detected = (int) resource_data;
@@ -78,21 +85,43 @@ static void _foreach_resource_list(connectivity_resource_s *resource_info, const
 {
        int ret = -1;
        int value = 0;
+       web_util_sensor_data_s sensor_data;
 
        ret = connectivity_resource_pop_int(resource_info, NULL, &value);
        if (ret < 0)
                _E("cannot pop a value");
 
        _I("Uri path : [%s], Value [%d]", uri_path, value);
+
+       /* TODO */
+       sensor_data.hash = NULL;
+
+       sensor_data.enabled_sensor |= WEB_UTIL_SENSOR_MOTION;
+       sensor_data.pir = value;
+       web_util_json_add_sensor_data(uri_path, sensor_data);
+
+       return;
 }
 
 static Eina_Bool _popping_timer_cb(void *data)
 {
        int ret = -1;
+       char *json_data = NULL;
+
+       web_util_json_init();
+       web_util_json_data_array_begin();
 
        ret = connectivity_resource_list_foreach(_foreach_resource_list, NULL);
        retv_if(ret == -1, ECORE_CALLBACK_RENEW);
 
+       web_util_json_data_array_end();
+       json_data = web_util_get_json_string();
+
+       web_util_json_fini();
+
+       web_util_noti_post(WEB_API_URI, json_data);
+       free(json_data);
+
        return ECORE_CALLBACK_RENEW;
 }
 
index f49efd9..6f37744 100755 (executable)
 
 #include <stdbool.h>
 #include <curl/curl.h>
+#include <glib-object.h>
+#include <json-glib/json-glib.h>
 #include "log.h"
+#include "webutil.h"
+
+typedef struct _wu_json_handle {
+       JsonBuilder *builder;
+       bool is_begin;
+       bool is_end;
+} wu_json_handle;
+
+static wu_json_handle Json_h = {NULL, false, false};
 
 static size_t _response_write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
 {
-
        size_t res_size = 0;
 
        res_size = size*nmemb;
@@ -42,12 +52,12 @@ int web_util_noti_init(void)
 {
        int ret = 0;
        CURLcode result;
-    result = curl_global_init(CURL_GLOBAL_DEFAULT);
-    if(result != CURLE_OK) {
+       result = curl_global_init(CURL_GLOBAL_DEFAULT);
+       if(result != CURLE_OK) {
                _E("curl_global_init() failed: %s",
                        curl_easy_strerror(result));
                ret = -1;
-    }
+       }
        return ret;
 }
 
@@ -64,6 +74,12 @@ int web_util_noti_post(const char *resource, const char *json_data)
        CURLcode response = CURLE_OK;
        struct curl_slist *headers = NULL;
 
+       retv_if(resource == NULL,-1);
+       retv_if(json_data == NULL,-1);
+
+       _I("server : %s", resource);
+       _I("json_data : %s", json_data);
+
        curl = curl_easy_init();
 
        if(!curl) {
@@ -72,7 +88,7 @@ int web_util_noti_post(const char *resource, const char *json_data)
        }
 
        headers = curl_slist_append(headers, "Accept: application/json");
-    headers = curl_slist_append(headers, "Content-Type: application/json");
+       headers = curl_slist_append(headers, "Content-Type: application/json");
 
        curl_easy_setopt(curl, CURLOPT_URL, resource);
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
@@ -80,9 +96,9 @@ int web_util_noti_post(const char *resource, const char *json_data)
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _response_write_callback);
 
-    response = curl_easy_perform(curl);
+       response = curl_easy_perform(curl);
 
-    if(response != CURLE_OK) {
+       if(response != CURLE_OK) {
                _E("curl_easy_perform() failed: %s",
                        curl_easy_strerror(response));
                /* What should we do here, if response is kind of errors? */
@@ -92,7 +108,211 @@ int web_util_noti_post(const char *resource, const char *json_data)
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
 
-
        return ret;
 }
 
+
+int web_util_json_init(void)
+{
+       if(Json_h.builder) {
+               g_object_unref(Json_h.builder);
+       }
+
+       Json_h.is_begin = false;
+       Json_h.is_end = false;
+       Json_h.builder = json_builder_new();
+       retv_if(Json_h.builder == NULL, -1);
+
+       return 0;
+}
+
+int web_util_json_fini(void)
+{
+
+       if(Json_h.builder) {
+               g_object_unref(Json_h.builder);
+               Json_h.builder = NULL;
+       }
+
+       Json_h.is_begin = false;
+       Json_h.is_end = false;
+
+       return 0;
+}
+
+int web_util_json_data_array_begin(void)
+{
+       retv_if(Json_h.builder == NULL, -1);
+       retv_if(Json_h.is_begin == true, -1);
+       retv_if(Json_h.is_end == true, -1);
+
+       Json_h.is_begin = true;
+
+       /*
+       {
+               SensorsDataList : [ SensorData ]
+       }
+       */
+
+       json_builder_begin_object(Json_h.builder);
+       json_builder_set_member_name(Json_h.builder,"SensorDataList");
+       json_builder_begin_array(Json_h.builder);
+
+       return 0;
+}
+
+int web_util_json_data_array_end(void)
+{
+       retv_if(Json_h.builder == NULL, -1);
+       retv_if(Json_h.is_begin == false, -1);
+       retv_if(Json_h.is_end == true, -1);
+
+       json_builder_end_array(Json_h.builder);
+       json_builder_end_object(Json_h.builder);
+       Json_h.is_end = true;
+
+       return 0;
+}
+
+int web_util_json_add_sensor_data(const char* sensorpi_id, web_util_sensor_data_s sensor_data)
+{
+       const char n_id[] = "SensorPiID";
+       const char n_motion[] = "Motion";
+       const char n_flame[] = "Flame";
+       const char n_hum[] = "Humidity";
+       const char n_temp[] = "Temperature";
+       const char n_vib[] = "Vibration";
+       const char n_co2[] = "CO2";
+       const char n_sound[] = "SoundLevel";
+       const char n_e_sensor[] = "SensorEnabled";
+       const char n_hash[] = "Hash";
+
+       retv_if(Json_h.builder == NULL, -1);
+       retv_if(Json_h.is_begin == false, -1);
+       retv_if(Json_h.is_end == true, -1);
+       retv_if(sensorpi_id == NULL, -1);
+
+       /* JSON structure :
+       {
+               SensorPiID: string,
+               Motion: boolean,
+               Flame: boolean,
+               Humidity: double,
+               Temperature: double,
+               Vibration: boolean,
+               CO2: double,
+               SoundLevel: int,
+               SensorEnabled: [PIR, ],
+               Hash: string,
+       }
+       */
+
+       _I("id : %s, value : %d", sensorpi_id, sensor_data.pir);
+
+       json_builder_begin_object(Json_h.builder);
+
+       json_builder_set_member_name(Json_h.builder, n_id);
+       json_builder_add_string_value(Json_h.builder, sensorpi_id);
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_MOTION) {
+               json_builder_set_member_name(Json_h.builder, n_motion);
+               json_builder_add_int_value(Json_h.builder, sensor_data.pir);
+       }
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_FLAME) {
+               json_builder_set_member_name(Json_h.builder, n_flame);
+               json_builder_add_int_value(Json_h.builder, sensor_data.flame);
+       }
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_HUMIDITY) {
+               json_builder_set_member_name(Json_h.builder, n_hum);
+               json_builder_add_double_value(Json_h.builder, sensor_data.humidity);
+       }
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_TEMPERATURE) {
+               json_builder_set_member_name(Json_h.builder, n_temp);
+               json_builder_add_double_value(Json_h.builder, sensor_data.temperature);
+       }
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_VIB) {
+               json_builder_set_member_name(Json_h.builder, n_vib);
+               json_builder_add_int_value(Json_h.builder, sensor_data.virbration);
+       }
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_CO2) {
+               json_builder_set_member_name(Json_h.builder, n_co2);
+               json_builder_add_double_value(Json_h.builder, sensor_data.co2);
+       }
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_SOUND) {
+               json_builder_set_member_name(Json_h.builder, n_sound);
+               json_builder_add_int_value(Json_h.builder, sensor_data.soundlevel);
+       }
+
+       json_builder_set_member_name(Json_h.builder, n_e_sensor);
+       json_builder_begin_array(Json_h.builder);
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_MOTION)
+               json_builder_add_string_value(Json_h.builder, n_motion);
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_FLAME)
+               json_builder_add_string_value(Json_h.builder, n_flame);
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_HUMIDITY)
+               json_builder_add_string_value(Json_h.builder, n_hum);
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_TEMPERATURE)
+               json_builder_add_string_value(Json_h.builder, n_temp);
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_VIB)
+               json_builder_add_string_value(Json_h.builder, n_vib);
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_CO2)
+               json_builder_add_string_value(Json_h.builder, n_co2);
+
+       if(sensor_data.enabled_sensor & WEB_UTIL_SENSOR_SOUND)
+               json_builder_add_string_value(Json_h.builder, n_sound);
+
+       json_builder_end_array(Json_h.builder);
+
+       if(sensor_data.hash) {
+               json_builder_set_member_name(Json_h.builder, n_hash);
+               json_builder_add_string_value(Json_h.builder, sensor_data.hash);
+       }
+
+       json_builder_end_object(Json_h.builder);
+
+       return 0;
+}
+
+char *web_util_get_json_string(void)
+{
+       JsonGenerator *gen = NULL;
+       JsonNode *root = NULL;
+       char *str = NULL;
+
+       retv_if(Json_h.builder == NULL, NULL);
+       retv_if(Json_h.is_begin == false, NULL);
+       retv_if(Json_h.is_end == false, NULL);
+
+       root = json_builder_get_root(Json_h.builder);
+       retv_if(root == NULL, NULL);
+
+       gen = json_generator_new();
+       goto_if(gen == NULL, error_release_all);
+       json_generator_set_root(gen, root);
+
+       str = json_generator_to_data(gen, NULL);
+
+       return str;
+
+error_release_all:
+       if(root)
+               json_node_free(root);
+
+       if(gen)
+               g_object_unref(gen);
+
+       return NULL;
+}
+