diff --git a/thermo_sensor/main/ygg_http_req.c b/thermo_sensor/main/ygg_http_req.c index 06a2545..ebe1b8a 100644 --- a/thermo_sensor/main/ygg_http_req.c +++ b/thermo_sensor/main/ygg_http_req.c @@ -6,9 +6,11 @@ #include "ygg_http_req.h" #define GET_RESP_MAX_SIZE 4096 +#define POST_RESP_MAX_SIZE 4096 static const char *TAG = "YGG_HTTP_REQ"; static char GET_RESP[GET_RESP_MAX_SIZE]; +static char POST_RESP[POST_RESP_MAX_SIZE]; esp_err_t _http_event_handler(esp_http_client_event_t *evt) { return ESP_OK; @@ -54,37 +56,62 @@ char* ygg_send_get(const char *url) { return GET_RESP; } -void ygg_send_post(const char *url, char *post_data) { +char* ygg_send_post(const char *url, char *post_data) { + memset(POST_RESP, 0, POST_RESP_MAX_SIZE); + esp_http_client_config_t config = { .url = url, - .event_handler = _http_event_handler, }; + esp_http_client_handle_t client = esp_http_client_init(&config); + if (client == NULL) { + ESP_LOGE(TAG, "Failed to initialize HTTP client"); + return NULL; + } + + int post_len = strlen(post_data); esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_header(client, "Content-Type", "application/json"); - esp_http_client_set_post_field(client, post_data, strlen(post_data)); - esp_err_t err = esp_http_client_perform(client); - - if (err == ESP_OK) { - ESP_LOGI(TAG, "Status HTTP = %d, Content-Length = %"PRId64, - esp_http_client_get_status_code(client), - esp_http_client_get_content_length(client)); - } else { - ESP_LOGE(TAG, "HTTP connection error: %s", esp_err_to_name(err)); + esp_err_t err = esp_http_client_open(client, post_len); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); + esp_http_client_cleanup(client); + return NULL; } + + int wlen = esp_http_client_write(client, post_data, post_len); + if (wlen < 0) { + ESP_LOGE(TAG, "Failed to write post data"); + esp_http_client_cleanup(client); + return NULL; + } + + esp_http_client_fetch_headers(client); + + int rlen = esp_http_client_read(client, POST_RESP, POST_RESP_MAX_SIZE - 1); + esp_http_client_cleanup(client); + + if (rlen < 0) { + ESP_LOGE(TAG, "Error reading HTTP response"); + return NULL; + } + + POST_RESP[rlen] = '\0'; + return POST_RESP; } int ygg_get_sensor_id(const char *sensor_name, const char *url); void ygg_send_sensor_redouts(float temp, float press, float hum) { - const char *url = "http://192.168.0.236:5000/api/sensors/1/readouts"; char post_data[64]; - - int sensor_id = ygg_get_sensor_id("bmp280", "http://192.168.0.236:5000"); + int sensor_id = ygg_get_sensor_id("super_hiper_bmp280", "http://192.168.0.236:5000"); + char url[128]; + snprintf(url, sizeof(url), + "http://192.168.0.236:5000/api/sensors/%d/readouts", sensor_id); snprintf(post_data, sizeof(post_data), "{\"type\":\"temperature\", \"value\":%.2f}", temp); @@ -107,35 +134,75 @@ char* ygg_get_sensors(const char *base_url) { return sensors; } -int ygg_find_sensor(char *sensors, const char *sensor_name) { - cJSON *root = cJSON_Parse(sensors); - cJSON *item; +int ygg_json_find_sensor_id(char *json_sensors, const char *sensor_name) { + if (json_sensors == NULL || sensor_name == NULL) { + return -1; + } - cJSON_ArrayForEach(item, root) { - cJSON *id = cJSON_GetObjectItem(item, "id"); - cJSON *item_name = cJSON_GetObjectItem(item, "name"); + cJSON *root = cJSON_Parse(json_sensors); + if (root == NULL) { + return -1; + } + + int result_id = -1; + + // CASE 1: JSON is single object { "id": 3, "name": "..." } + if (cJSON_IsObject(root)) { + cJSON *id = cJSON_GetObjectItem(root, "id"); + cJSON *item_name = cJSON_GetObjectItem(root, "name"); if (cJSON_IsNumber(id) && cJSON_IsString(item_name) && strcmp(item_name->valuestring, sensor_name) == 0) { - int result = id->valueint; - cJSON_Delete(root); - return result; + result_id = id->valueint; } } + // CASE 2: JSON is array [ { "id": 3, "name": "..." }, ... ] + else if (cJSON_IsArray(root)) { + cJSON *item = NULL; + cJSON_ArrayForEach(item, root) { + cJSON *id = cJSON_GetObjectItem(item, "id"); + cJSON *item_name = cJSON_GetObjectItem(item, "name"); + + if (cJSON_IsNumber(id) && + cJSON_IsString(item_name) && + strcmp(item_name->valuestring, sensor_name) == 0) { + + result_id = id->valueint; + break; + } + } + } + cJSON_Delete(root); - return -1; + + return result_id; +} + +int ygg_add_sensor(const char *base_url, const char *sensor_name) { + char url[128]; + char post_data[128]; + snprintf(url, sizeof(url), + "%s/api/sensors", base_url); + snprintf(post_data, sizeof(post_data), + "{\"name\":\"%s\"}", sensor_name); + char *resp = ygg_send_post(url, post_data); + ESP_LOGI(TAG, "POST new sensor, resp: %s", resp); + int id = ygg_json_find_sensor_id(resp, sensor_name); + + return id; } int ygg_get_sensor_id(const char *sensor_name, - const char *url) { - char *sensors = ygg_get_sensors(url); - int id = ygg_find_sensor(sensors, sensor_name); - ESP_LOGI(TAG, "Sensor ID: %d", id); - return 0; - //if (id == -1) { - // id = ygg_add_sensor(url, sensor_name); - //} - //return id; + const char *base_url) { + char *sensors = ygg_get_sensors(base_url); + int id = ygg_json_find_sensor_id(sensors, sensor_name); + if (id == -1) { + id = ygg_add_sensor(base_url, sensor_name); + ESP_LOGI(TAG, "Added sensor ID to DB: %d", id); + } + else + ESP_LOGI(TAG, "Found sensor ID in DB: %d", id); + return id; }