From 63469295aca32c7d11e14dbc7d5d2360e07f3e06 Mon Sep 17 00:00:00 2001 From: Jin Yoon Date: Tue, 5 Sep 2017 14:33:06 +0900 Subject: [PATCH] Add the 'webutil' feature into the Server Change-Id: If90721041dbbbefc6125016019b1f8ce1aece9fb --- CMakeLists.txt | 4 + inc/webutil.h | 62 +++++ packaging/org.tizen.position-finder-server.spec | 2 + src/webutil.c | 317 ++++++++++++++++++++++++ 4 files changed, 385 insertions(+) create mode 100644 inc/webutil.h create mode 100644 src/webutil.c diff --git a/CMakeLists.txt b/CMakeLists.txt index a2cfc40..3827647 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,9 @@ pkg_check_modules(APP_PKGS REQUIRED eina iotcon gio-2.0 + libcurl + glib-2.0 + json-glib-1.0 ) ADD_DEFINITIONS(-DCBOR_FILE_IN_RES="${INSTALL_RESDIR}/${CBOR_FILE}") @@ -38,6 +41,7 @@ ADD_EXECUTABLE(${PROJECT_NAME} ${PROJECT_ROOT_DIR}/src/controller.c ${PROJECT_ROOT_DIR}/src/controller_internal.c ${PROJECT_ROOT_DIR}/src/connectivity.c + ${PROJECT_ROOT_DIR}/src/webutil.c ${PROJECT_ROOT_DIR}/src/resource.c ${PROJECT_ROOT_DIR}/src/resource/resource_illuminance_sensor.c ${PROJECT_ROOT_DIR}/src/resource/resource_infrared_motion_sensor.c diff --git a/inc/webutil.h b/inc/webutil.h new file mode 100644 index 0000000..2a40e62 --- /dev/null +++ b/inc/webutil.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Contact: Jin Yoon + * Geunsun Lee + * Eunyoung Lee + * Junkyu Han + * Jeonghoon Park + * + * Licensed under the Flora License, Version 1.1 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#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 { + int motion; + int flame; + double humidity; + double temperature; + int 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 diff --git a/packaging/org.tizen.position-finder-server.spec b/packaging/org.tizen.position-finder-server.spec index 27acd6a..666094b 100644 --- a/packaging/org.tizen.position-finder-server.spec +++ b/packaging/org.tizen.position-finder-server.spec @@ -23,7 +23,9 @@ BuildRequires: pkgconfig(ecore) BuildRequires: pkgconfig(eina) BuildRequires: pkgconfig(iotcon) BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(libcurl) BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(json-glib-1.0) %description Server for Position Finder diff --git a/src/webutil.c b/src/webutil.c new file mode 100644 index 0000000..8b80a63 --- /dev/null +++ b/src/webutil.c @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Contact: Jin Yoon + * Geunsun Lee + * Eunyoung Lee + * Junkyu Han + * Jeonghoon Park + * + * Licensed under the Flora License, Version 1.1 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#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; + + if(res_size > 0) + _I("POST response : %s", ptr); + /* What should we do here, if response body has negative message? */ + + return res_size; +} + +int web_util_noti_init(void) +{ + int ret = 0; + CURLcode result; + 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; +} + +void web_util_noti_fini(void) +{ + curl_global_cleanup(); + return; +} + +int web_util_noti_post(const char *resource, const char *json_data) +{ + int ret = 0; + CURL *curl = NULL; + 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) { + _E("fail to init curl"); + return -1; + } + + headers = curl_slist_append(headers, "Accept: 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); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _response_write_callback); + + response = curl_easy_perform(curl); + + 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? */ + ret = -1; + } + + 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); + retv_if(sensor_data == NULL, -1); + + /* JSON structure : + { + SensorPiID: string, + Motion: boolean, + Flame: boolean, + Humidity: double, + Temperature: double, + Vibration: boolean, + CO2: double, + SoundLevel: int, + SensorEnabled: [Motion, ], + Hash: string, + } + */ + + 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->motion); + } + + 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; +} + -- 2.7.4