Files
tide-display/ePaper-ESP-IDF/components/connectivity/networking.c
Peter Siegmund 7774417a35 latest code
Signed-off-by: Peter Siegmund <peter@rdkr.com>
2024-09-06 16:29:56 +02:00

82 lines
2.4 KiB
C

#include "networking.h"
#include <string.h>
#include "cJSON.h"
#include "esp_err.h"
#include "esp_http_client.h"
#include "esp_log.h"
static const char* TAG = "JSON";
esp_err_t download_and_parse_json(const char* url) {
// 1. Create HTTP Client
esp_http_client_config_t config = {
.url = url,
.event_handler = NULL, // You can add an event handler for more control
};
esp_http_client_handle_t client = esp_http_client_init(&config);
if (client == NULL) {
ESP_LOGE(TAG, "Failed to create HTTP client");
return ESP_FAIL;
}
// 2. Perform GET request
esp_err_t err = esp_http_client_perform(client);
if (err != ESP_OK) {
ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));
esp_http_client_cleanup(client);
return err;
}
// 3. Check response status code
int status_code = esp_http_client_get_status_code(client);
if (status_code != 200) {
ESP_LOGE(TAG, "HTTP GET request failed with status code: %d", status_code);
esp_http_client_cleanup(client);
return ESP_FAIL;
}
// 4. Read response content
int content_length = esp_http_client_get_content_length(client);
char* response_buffer = malloc(content_length + 1);
if (response_buffer == NULL) {
ESP_LOGE(TAG, "Failed to allocate memory for response buffer");
esp_http_client_cleanup(client);
return ESP_FAIL;
}
int data_read = esp_http_client_read_response(client, response_buffer, content_length);
if (data_read != content_length) {
ESP_LOGE(TAG, "Failed to read complete response");
free(response_buffer);
esp_http_client_cleanup(client);
return ESP_FAIL;
}
response_buffer[data_read] = '\0'; // Null-terminate the string
// 5. Parse JSON
cJSON* root = cJSON_Parse(response_buffer);
if (root == NULL) {
const char* error_ptr = cJSON_GetErrorPtr();
if (error_ptr != NULL) {
ESP_LOGE(TAG, "Error before: %s", error_ptr);
}
free(response_buffer);
esp_http_client_cleanup(client);
return ESP_FAIL;
}
// 6. Access JSON data
// Example: Print the value of a key called "message"
cJSON* message_item = cJSON_GetObjectItem(root, "message");
if (cJSON_IsString(message_item) && (message_item->valuestring != NULL)) {
ESP_LOGI(TAG, "Message: %s", message_item->valuestring);
}
// 7. Clean up
cJSON_Delete(root);
free(response_buffer);
esp_http_client_cleanup(client);
return ESP_OK;
}