From 38197afd79df5c47dfb451fd426292f27d1ffbeb Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Sun, 18 Aug 2024 20:33:26 +0200 Subject: [PATCH] Decode enrollment status JSON response --- esp32_device/.vscode/settings.json | 3 ++- esp32_device/main/main.c | 2 +- esp32_device/main/secure_api.c | 36 +++++++++++++++++++++++++++--- esp32_device/main/secure_api.h | 8 +++---- 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/esp32_device/.vscode/settings.json b/esp32_device/.vscode/settings.json index 27643ed..2467434 100644 --- a/esp32_device/.vscode/settings.json +++ b/esp32_device/.vscode/settings.json @@ -32,6 +32,7 @@ "unsecure_api.h": "c", "esp_log.h": "c", "http_client.h": "c", - "string.h": "c" + "string.h": "c", + "cjson.h": "c" } } diff --git a/esp32_device/main/main.c b/esp32_device/main/main.c index b835397..77786c3 100755 --- a/esp32_device/main/main.c +++ b/esp32_device/main/main.c @@ -99,7 +99,7 @@ void app_main(void) // Check current device enrollment status ESP_LOGI(TAG, "Check enrollment status"); int status = secure_api_get_device_enrollment_status(); - printf("Current enrollment status: %d\n", status); + ESP_LOGI(TAG, "Current enrollment status: %d\n", status); system_sleep(120); diff --git a/esp32_device/main/secure_api.c b/esp32_device/main/secure_api.c index d4b2b8a..3fb8367 100644 --- a/esp32_device/main/secure_api.c +++ b/esp32_device/main/secure_api.c @@ -6,6 +6,7 @@ #include "storage.h" #include "http_client.h" #include "constants.h" +#include "cJSON.h" #include "esp_log.h" @@ -46,6 +47,7 @@ enum DevEnrollmentStatus secure_api_get_device_enrollment_status() assert(storage_get_dev_name(uri + strlen(uri)) > 0); char *res = process_secure_request(uri); + free(uri); if (res == NULL) @@ -54,9 +56,37 @@ enum DevEnrollmentStatus secure_api_get_device_enrollment_status() return DevEnrollError; } - // TODO : parse reponse - printf("response = %s\n", res); + enum DevEnrollmentStatus s = DevEnrollError; + cJSON *root = cJSON_Parse(res); + if (root == NULL) + { + ESP_LOGE(TAG, "Failed to decode JSON response from server!"); + goto fail; + } + + cJSON *status = cJSON_GetObjectItem(root, "status"); + if (status == NULL) + { + ESP_LOGE(TAG, "Status missing in response from server!"); + goto fail; + } + + if (!strcmp(status->valuestring, "Unknown")) + s = DevEnrollUnknown; + else if (!strcmp(status->valuestring, "Pending")) + s = DevEnrollPending; + else if (!strcmp(status->valuestring, "Validated")) + s = DevEnrollValidated; + else + { + ESP_LOGE(TAG, "Unknown enrollment status: %s", status->valuestring); + goto fail; + } + +fail: + + cJSON_Delete(root); free(res); - return DevEnrollError; + return s; } \ No newline at end of file diff --git a/esp32_device/main/secure_api.h b/esp32_device/main/secure_api.h index 849e9ad..fe8fe45 100644 --- a/esp32_device/main/secure_api.h +++ b/esp32_device/main/secure_api.h @@ -15,13 +15,13 @@ extern "C" enum DevEnrollmentStatus { /** An error occurred while retrieving device status */ - DevEnrollError, + DevEnrollError = 0, /** Device is unknown by the backend */ - DevEnrollUnknown, + DevEnrollUnknown = 1, /** Device hasn't been validated yet */ - DevEnrollPending, + DevEnrollPending = 2, /** Device has been validated by the backend */ - DevEnrollValidated, + DevEnrollValidated = 3, }; /**