/** * @Author: 李建 * @Date: 12/17/2023, 8:54:23 PM * @LastEditors: 李建 * @LastEditTime: 12/17/2023, 8:54:23 PM * Description: 设备登录任务 * Copyright: Copyright (©)}) 2023 永续绿建. All rights reserved. */ #include "login.h" #include "esp_log.h" #include "gateway_defs.h" #include "../system/net_http.h" #include "../system/miscellaneous_interface.h" #include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "access.h" #include "register.h" #define MAX_RETRY_COUNT 5 static const char *TAG = "LOGIN"; extern esp_err_t call_result; extern TaskHandle_t access_task_handle; void login_callback(char *response, void *user_data) { call_result = ESP_FAIL; if (response != NULL) { // {"code":0,"message":"","data":{"access_token":"898cc4fe52f21444","access_addr":"123.232.116.162:18106"}} cJSON *root = cJSON_Parse(response); cJSON *code = cJSON_GetObjectItemCaseSensitive(root, "code"); if (code != NULL) { if (cJSON_IsNumber(code) && code->valueint == 0) { cJSON *data = cJSON_GetObjectItem(root, "data"); cJSON *accessToken = cJSON_GetObjectItemCaseSensitive(data, "access_token"); cJSON *accessAddr = cJSON_GetObjectItemCaseSensitive(data, "access_addr"); yx_data_set(DATANAME_ACCESS_ADDR, accessAddr->valuestring); yx_data_set(DATANAME_ACCESS_TOKEN, accessToken->valuestring); ESP_LOGI(TAG, "device login success, addr:%s, token:%s", accessAddr->valuestring, accessToken->valuestring); call_result = ESP_OK; } } cJSON_Delete(root); } xTaskNotifyGive((TaskHandle_t)user_data); } void device_login_task(void *pv) { uint8_t count = 0; for (;;) { vTaskDelay(1); if(count++ > MAX_RETRY_COUNT) { // 如果登录失败5次则重新进入注册流程 ESP_LOGE(TAG, "login failed 5 times, now start register"); xTaskCreate(&device_register_task, "register_task", 4096, NULL, 5, NULL); vTaskDelay(1000 / portTICK_PERIOD_MS); break; } // if (!net_connect_check()) // { // break; // } char *str_device_id = NULL; char *str_device_secret = NULL; str_device_id = yx_data_get(DATANAME_DEVICE_ID); str_device_secret = yx_data_get(DATANAME_DEVICE_SECRET); if (str_device_id == NULL || str_device_secret == NULL) { ESP_LOGE(TAG, "login failed! device is not register"); return; } int device_id = atol(str_device_id); cJSON *req = cJSON_CreateObject(); cJSON *deviceId = cJSON_CreateNumber(device_id); cJSON *secret = cJSON_CreateString(str_device_secret); cJSON *protocol = cJSON_CreateString("mqttX"); cJSON_AddItemToObject(req, "device_id", deviceId); cJSON_AddItemToObject(req, "device_secret", secret); cJSON_AddItemToObject(req, "protocol", protocol); free(str_device_id); free(str_device_secret); // http request char post_url[128] = ""; sprintf(post_url, "%s/v1/devices/authentication", SPARROW_SERVER_URL); net_http_config_t config = { .url = post_url, .user_data = xTaskGetCurrentTaskHandle(), .callback = login_callback, }; net_http_post(cJSON_Print(req), config); cJSON_Delete(req); ulTaskNotifyTake(pdTRUE, portMAX_DELAY); if (call_result == ESP_OK) { BaseType_t result = xTaskCreate(&device_access_task, "access task", 1024 * 4, NULL, 1, &access_task_handle); if(result != pdPASS) { ESP_LOGE(TAG, "device login fault...."); esp_restart(); } break; } else { ESP_LOGE(TAG, "device login faild, after 3 seconds retry"); vTaskDelay(3000 / portTICK_PERIOD_MS); } } vTaskDelete(NULL); }