login.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /**
  2. * @Author: 李建
  3. * @Date: 12/17/2023, 8:54:23 PM
  4. * @LastEditors: 李建
  5. * @LastEditTime: 12/17/2023, 8:54:23 PM
  6. * Description: 设备登录任务
  7. * Copyright: Copyright (©)}) 2023 永续绿建. All rights reserved.
  8. */
  9. #include "login.h"
  10. #include "esp_log.h"
  11. #include "gateway_defs.h"
  12. #include "../system/net_http.h"
  13. #include "../system/miscellaneous_interface.h"
  14. #include <stdio.h>
  15. #include <cJSON.h>
  16. #include "freertos/FreeRTOS.h"
  17. #include "freertos/task.h"
  18. #include "access.h"
  19. #include "register.h"
  20. #define MAX_RETRY_COUNT 5
  21. static const char *TAG = "LOGIN";
  22. extern esp_err_t call_result;
  23. extern TaskHandle_t access_task_handle;
  24. void login_callback(char *response, void *user_data)
  25. {
  26. call_result = ESP_FAIL;
  27. if (response != NULL)
  28. {
  29. // {"code":0,"message":"","data":{"access_token":"898cc4fe52f21444","access_addr":"123.232.116.162:18106"}}
  30. cJSON *root = cJSON_Parse(response);
  31. cJSON *code = cJSON_GetObjectItemCaseSensitive(root, "code");
  32. if (code != NULL)
  33. {
  34. if (cJSON_IsNumber(code) && code->valueint == 0)
  35. {
  36. cJSON *data = cJSON_GetObjectItem(root, "data");
  37. cJSON *accessToken = cJSON_GetObjectItemCaseSensitive(data, "access_token");
  38. cJSON *accessAddr = cJSON_GetObjectItemCaseSensitive(data, "access_addr");
  39. yx_data_set(DATANAME_ACCESS_ADDR, accessAddr->valuestring);
  40. yx_data_set(DATANAME_ACCESS_TOKEN, accessToken->valuestring);
  41. ESP_LOGI(TAG, "device login success, addr:%s, token:%s", accessAddr->valuestring, accessToken->valuestring);
  42. call_result = ESP_OK;
  43. }
  44. }
  45. cJSON_Delete(root);
  46. }
  47. xTaskNotifyGive((TaskHandle_t)user_data);
  48. }
  49. void device_login_task(void *pv)
  50. {
  51. uint8_t count = 0;
  52. for (;;)
  53. {
  54. vTaskDelay(1);
  55. if(count++ > MAX_RETRY_COUNT) {
  56. // 如果登录失败5次则重新进入注册流程
  57. ESP_LOGE(TAG, "login failed 5 times, now start register");
  58. xTaskCreate(&device_register_task,
  59. "register_task",
  60. 4096,
  61. NULL,
  62. 5,
  63. NULL);
  64. vTaskDelay(1000 / portTICK_PERIOD_MS);
  65. break;
  66. }
  67. // if (!net_connect_check())
  68. // {
  69. // break;
  70. // }
  71. char *str_device_id = NULL;
  72. char *str_device_secret = NULL;
  73. str_device_id = yx_data_get(DATANAME_DEVICE_ID);
  74. str_device_secret = yx_data_get(DATANAME_DEVICE_SECRET);
  75. if (str_device_id == NULL || str_device_secret == NULL)
  76. {
  77. ESP_LOGE(TAG, "login failed! device is not register");
  78. return;
  79. }
  80. int device_id = atol(str_device_id);
  81. cJSON *req = cJSON_CreateObject();
  82. cJSON *deviceId = cJSON_CreateNumber(device_id);
  83. cJSON *secret = cJSON_CreateString(str_device_secret);
  84. cJSON *protocol = cJSON_CreateString("mqttX");
  85. cJSON_AddItemToObject(req, "device_id", deviceId);
  86. cJSON_AddItemToObject(req, "device_secret", secret);
  87. cJSON_AddItemToObject(req, "protocol", protocol);
  88. free(str_device_id);
  89. free(str_device_secret);
  90. // http request
  91. char post_url[128] = "";
  92. sprintf(post_url, "%s/v1/devices/authentication", SPARROW_SERVER_URL);
  93. net_http_config_t config = {
  94. .url = post_url,
  95. .user_data = xTaskGetCurrentTaskHandle(),
  96. .callback = login_callback,
  97. };
  98. net_http_post(cJSON_Print(req), config);
  99. cJSON_Delete(req);
  100. ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
  101. if (call_result == ESP_OK)
  102. {
  103. BaseType_t result = xTaskCreate(&device_access_task, "access task", 1024 * 4, NULL, 1, &access_task_handle);
  104. if(result != pdPASS) {
  105. ESP_LOGE(TAG, "device login fault....");
  106. esp_restart();
  107. }
  108. break;
  109. }
  110. else
  111. {
  112. ESP_LOGE(TAG, "device login faild, after 3 seconds retry");
  113. vTaskDelay(3000 / portTICK_PERIOD_MS);
  114. }
  115. }
  116. vTaskDelete(NULL);
  117. }