#include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "esp_system.h" #include "esp_event.h" #include "wifi.h" #include "config.h" #ifdef WIFI_ENABLED #include "nvs_flash.h" #include "esp_netif.h" #include "esp_tls.h" #include "esp_http_client.h" #define MAX_HTTP_RECV_BUFFER 512 static const char *TAG = "HTTP_CLIENT"; typedef struct { double energyData_kWh; uint32_t bigCnt; int32_t cnt; } sensor_data; esp_err_t _http_event_handler(esp_http_client_event_t *evt) { switch(evt->event_id) { case HTTP_EVENT_ERROR: ESP_LOGD(TAG, "HTTP_EVENT_ERROR"); break; case HTTP_EVENT_ON_CONNECTED: ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED"); break; case HTTP_EVENT_HEADER_SENT: ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT"); break; case HTTP_EVENT_ON_HEADER: ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value); break; case HTTP_EVENT_ON_DATA: ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len); if (!esp_http_client_is_chunked_response(evt->client)) { // Write out data // printf("%.*s", evt->data_len, (char*)evt->data); } break; case HTTP_EVENT_ON_FINISH: ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH"); break; case HTTP_EVENT_DISCONNECTED: ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED"); int mbedtls_err = 0; esp_err_t err = esp_tls_get_and_clear_last_error(evt->data, &mbedtls_err, NULL); if (err != 0) { ESP_LOGI(TAG, "Last esp error code: 0x%x", err); ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err); } break; } return ESP_OK; } static void http_rest_with_url(void *pvParameters) { esp_http_client_config_t config = { .url = "http://192.168.1.110/electrical/register_sensor_data.php", .event_handler = _http_event_handler, }; esp_http_client_handle_t client = esp_http_client_init(&config); sensor_data *data = (sensor_data *)pvParameters; char post_data[4096]; sprintf(post_data,"dataStr=%.4f&bigCnt=%u&cnt=%d", data->energyData_kWh, data->bigCnt, data->cnt ); //printf("\n%s\n",post_data); esp_http_client_set_method(client, HTTP_METHOD_POST); 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, "HTTP POST Status = %d, content_length = %d", esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif static void http_send_data_task(void *pvParameters) { #ifdef WIFI_ENABLED http_rest_with_url(pvParameters); #endif vTaskDelete(NULL); } void sendHTTPMessage(const double inData, const uint32_t bigCnt, const int32_t cnt) { static sensor_data data; data.energyData_kWh = inData; data.bigCnt = bigCnt; data.cnt = cnt; void *const ptr = (void *const)&data; if( commIsUpAndRunning == 1 ) xTaskCreate(&http_send_data_task, "send_data_task", 8192, ptr, 5, NULL); }