1
0

http_client.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include "freertos/FreeRTOS.h"
  4. #include "freertos/task.h"
  5. #include "esp_log.h"
  6. #include "esp_system.h"
  7. #include "esp_event.h"
  8. #include "wifi.h"
  9. #include "config.h"
  10. #include "mqtt.h"
  11. static const char *TAG = "HTTP_CLIENT";
  12. #ifdef HTTP_ENABLED
  13. #include "nvs_flash.h"
  14. #include "esp_netif.h"
  15. #include "esp_tls.h"
  16. #include "esp_http_client.h"
  17. #define MAX_HTTP_RECV_BUFFER 512
  18. esp_err_t _http_event_handler(esp_http_client_event_t *evt)
  19. {
  20. static char *output_buffer; // Buffer to store response of http request from event handler
  21. static int output_len; // Stores number of bytes read
  22. switch(evt->event_id) {
  23. case HTTP_EVENT_ERROR:
  24. ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
  25. break;
  26. case HTTP_EVENT_ON_CONNECTED:
  27. ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED");
  28. break;
  29. case HTTP_EVENT_HEADER_SENT:
  30. ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT");
  31. break;
  32. case HTTP_EVENT_ON_HEADER:
  33. ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value);
  34. break;
  35. case HTTP_EVENT_ON_DATA:
  36. ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
  37. /*
  38. * Check for chunked encoding is added as the URL for chunked encoding used in this example returns binary data.
  39. * However, event handler can also be used in case chunked encoding is used.
  40. */
  41. if (!esp_http_client_is_chunked_response(evt->client)) {
  42. // If user_data buffer is configured, copy the response into the buffer
  43. if (evt->user_data) {
  44. memcpy(evt->user_data + output_len, evt->data, evt->data_len);
  45. } else {
  46. if (output_buffer == NULL) {
  47. output_buffer = (char *) malloc(esp_http_client_get_content_length(evt->client));
  48. output_len = 0;
  49. if (output_buffer == NULL) {
  50. ESP_LOGE(TAG, "Failed to allocate memory for output buffer");
  51. return ESP_FAIL;
  52. }
  53. }
  54. memcpy(output_buffer + output_len, evt->data, evt->data_len);
  55. }
  56. output_len += evt->data_len;
  57. }
  58. break;
  59. case HTTP_EVENT_ON_FINISH:
  60. ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH");
  61. if (output_buffer != NULL) {
  62. // Response is accumulated in output_buffer. Uncomment the below line to print the accumulated response
  63. //ESP_LOG_BUFFER_HEX(TAG, output_buffer, output_len);
  64. free(output_buffer);
  65. output_buffer = NULL;
  66. }
  67. output_len = 0;
  68. break;
  69. case HTTP_EVENT_DISCONNECTED:
  70. ESP_LOGD(TAG, "HTTP_EVENT_DISCONNECTED");
  71. int mbedtls_err = 0;
  72. esp_err_t err = esp_tls_get_and_clear_last_error(evt->data, &mbedtls_err, NULL);
  73. if (err != 0) {
  74. ESP_LOGI(TAG, "Last esp error code: 0x%x", err);
  75. ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err);
  76. }
  77. if (output_buffer != NULL) {
  78. free(output_buffer);
  79. output_buffer = NULL;
  80. }
  81. output_len = 0;
  82. break;
  83. }
  84. return ESP_OK;
  85. }
  86. void http_rest_with_url()
  87. {
  88. char local_response_buffer[MAX_HTTP_RECV_BUFFER] = {0};
  89. // The default state of VVB is always ON (kontaktor is normally closed, so control value is inverted)
  90. uint32_t kontaktor = 0; // Kontaktor 0 = VVB ON
  91. esp_http_client_config_t config = {
  92. .url = "http://192.168.1.110/electrical/system/isBoilerOn.php",
  93. .event_handler = _http_event_handler,
  94. .user_data = local_response_buffer, // Pass address of local buffer to get response
  95. };
  96. esp_http_client_handle_t client = esp_http_client_init(&config);
  97. esp_http_client_set_method(client, HTTP_METHOD_GET);
  98. esp_err_t err = esp_http_client_perform(client);
  99. if (err == ESP_OK) {
  100. const int status = esp_http_client_get_status_code(client);
  101. const int dLen = esp_http_client_get_content_length(client);
  102. ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %d",status,dLen );
  103. //ESP_LOG_BUFFER_HEX(TAG,local_response_buffer,dLen);
  104. if( status == 200 && dLen >= 6 ) {
  105. local_response_buffer[6] = '\0';
  106. if( strstr(local_response_buffer,"Ok") != NULL ) {
  107. ESP_LOGI(TAG, "HTTP Received: Ok" );
  108. if( strstr(local_response_buffer,"OFF") != NULL ) {
  109. ESP_LOGI(TAG, "HTTP Received: OFF" );
  110. kontaktor = 1;
  111. }
  112. else if( strstr(local_response_buffer,"ON") != NULL ) {
  113. ESP_LOGI(TAG, "HTTP Received: ON" );
  114. }
  115. }
  116. }
  117. } else {
  118. ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));
  119. }
  120. esp_http_client_cleanup(client);
  121. ESP_LOGI(TAG, "Set kontaktor state: %u",kontaktor);
  122. gpio_set_level(VVB_RELAY_OUTPUT_IO, kontaktor);
  123. char txt[10];
  124. sprintf(txt,"%u",kontaktor);
  125. sendMQTTMessage("basement/boiler/contactor", txt);
  126. }
  127. #else
  128. void http_rest_with_url()
  129. {
  130. ESP_LOGI(TAG, "Set kontaktor state (FAKE): 0");
  131. }
  132. #endif