123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /**
- * @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 <stdio.h>
- #include <cJSON.h>
- #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);
- }
|