post new sensor name if not found
This commit is contained in:
@@ -6,9 +6,11 @@
|
|||||||
#include "ygg_http_req.h"
|
#include "ygg_http_req.h"
|
||||||
|
|
||||||
#define GET_RESP_MAX_SIZE 4096
|
#define GET_RESP_MAX_SIZE 4096
|
||||||
|
#define POST_RESP_MAX_SIZE 4096
|
||||||
|
|
||||||
static const char *TAG = "YGG_HTTP_REQ";
|
static const char *TAG = "YGG_HTTP_REQ";
|
||||||
static char GET_RESP[GET_RESP_MAX_SIZE];
|
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) {
|
esp_err_t _http_event_handler(esp_http_client_event_t *evt) {
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
@@ -54,37 +56,62 @@ char* ygg_send_get(const char *url) {
|
|||||||
return GET_RESP;
|
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 = {
|
esp_http_client_config_t config = {
|
||||||
.url = url,
|
.url = url,
|
||||||
.event_handler = _http_event_handler,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
esp_http_client_handle_t client = esp_http_client_init(&config);
|
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_method(client, HTTP_METHOD_POST);
|
||||||
esp_http_client_set_header(client, "Content-Type", "application/json");
|
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);
|
esp_err_t err = esp_http_client_open(client, post_len);
|
||||||
|
if (err != ESP_OK) {
|
||||||
if (err == ESP_OK) {
|
ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
|
||||||
ESP_LOGI(TAG, "Status HTTP = %d, Content-Length = %"PRId64,
|
esp_http_client_cleanup(client);
|
||||||
esp_http_client_get_status_code(client),
|
return NULL;
|
||||||
esp_http_client_get_content_length(client));
|
|
||||||
} else {
|
|
||||||
ESP_LOGE(TAG, "HTTP connection error: %s", esp_err_to_name(err));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
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,
|
int ygg_get_sensor_id(const char *sensor_name,
|
||||||
const char *url);
|
const char *url);
|
||||||
|
|
||||||
void ygg_send_sensor_redouts(float temp, float press, float hum) {
|
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];
|
char post_data[64];
|
||||||
|
int sensor_id = ygg_get_sensor_id("super_hiper_bmp280", "http://192.168.0.236:5000");
|
||||||
int sensor_id = ygg_get_sensor_id("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),
|
snprintf(post_data, sizeof(post_data),
|
||||||
"{\"type\":\"temperature\", \"value\":%.2f}", temp);
|
"{\"type\":\"temperature\", \"value\":%.2f}", temp);
|
||||||
@@ -107,35 +134,75 @@ char* ygg_get_sensors(const char *base_url) {
|
|||||||
return sensors;
|
return sensors;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ygg_find_sensor(char *sensors, const char *sensor_name) {
|
int ygg_json_find_sensor_id(char *json_sensors, const char *sensor_name) {
|
||||||
cJSON *root = cJSON_Parse(sensors);
|
if (json_sensors == NULL || sensor_name == NULL) {
|
||||||
cJSON *item;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
cJSON_ArrayForEach(item, root) {
|
cJSON *root = cJSON_Parse(json_sensors);
|
||||||
cJSON *id = cJSON_GetObjectItem(item, "id");
|
if (root == NULL) {
|
||||||
cJSON *item_name = cJSON_GetObjectItem(item, "name");
|
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) &&
|
if (cJSON_IsNumber(id) &&
|
||||||
cJSON_IsString(item_name) &&
|
cJSON_IsString(item_name) &&
|
||||||
strcmp(item_name->valuestring, sensor_name) == 0) {
|
strcmp(item_name->valuestring, sensor_name) == 0) {
|
||||||
|
|
||||||
int result = id->valueint;
|
result_id = id->valueint;
|
||||||
cJSON_Delete(root);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 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);
|
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,
|
int ygg_get_sensor_id(const char *sensor_name,
|
||||||
const char *url) {
|
const char *base_url) {
|
||||||
char *sensors = ygg_get_sensors(url);
|
char *sensors = ygg_get_sensors(base_url);
|
||||||
int id = ygg_find_sensor(sensors, sensor_name);
|
int id = ygg_json_find_sensor_id(sensors, sensor_name);
|
||||||
ESP_LOGI(TAG, "Sensor ID: %d", id);
|
if (id == -1) {
|
||||||
return 0;
|
id = ygg_add_sensor(base_url, sensor_name);
|
||||||
//if (id == -1) {
|
ESP_LOGI(TAG, "Added sensor ID to DB: %d", id);
|
||||||
// id = ygg_add_sensor(url, sensor_name);
|
}
|
||||||
//}
|
else
|
||||||
//return id;
|
ESP_LOGI(TAG, "Found sensor ID in DB: %d", id);
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user