register.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include <stdio.h>
  2. #include "register.h"
  3. #include "gateway_defs.h"
  4. #include "esp_log.h"
  5. #include "../system/miscellaneous_interface.h"
  6. #include "../system/net_http.h"
  7. #include <cJSON.h>
  8. #include <esp_app_desc.h>
  9. #include "freertos/FreeRTOS.h"
  10. #include "freertos/task.h"
  11. #include "login.h"
  12. static const char *TAG = "REGISTER";
  13. #define RETRY_TIMES 15 // 注册重试次数
  14. esp_err_t call_result;
  15. void http_register_callback(char *response, void *user_data)
  16. {
  17. call_result = ESP_FAIL;
  18. if (response != NULL)
  19. {
  20. // parse response
  21. /**
  22. * {"code":0,"message":"","data":{"device_id":1033,"device_secret":"Ppmr7KXyotOZCdI6oRIN9n8uxacNXUnv","device_key":"69617ac8eb0024e8d1062400f0c8e2d34bc5700ba626b96a2107f18d55951f7d9a4c8cd2259f7df389075c74067ffd70","device_identifier":"08D1F9E77840"}}
  23. */
  24. cJSON *root = cJSON_Parse(response);
  25. cJSON *code = cJSON_GetObjectItemCaseSensitive(root, "code");
  26. if (code != NULL)
  27. {
  28. // if code is 0, main register success
  29. if (cJSON_IsNumber(code) && code->valueint == 0)
  30. {
  31. // parse register data
  32. cJSON *data = cJSON_GetObjectItem(root, "data");
  33. cJSON *deviceId = cJSON_GetObjectItemCaseSensitive(data, "device_id");
  34. cJSON *deviceKey = cJSON_GetObjectItemCaseSensitive(data, "device_key");
  35. cJSON *deviceSecret = cJSON_GetObjectItemCaseSensitive(data, "device_secret");
  36. ESP_LOGI(TAG, "device register success: id is %d, key is %s, secret is :%s", deviceId->valueint, deviceKey->valuestring, deviceSecret->valuestring);
  37. char device_id[10] = {0};
  38. sprintf(device_id, "%d", deviceId->valueint);
  39. yx_data_set(DATANAME_DEVICE_ID, device_id);
  40. yx_data_set(DATANAME_DEVICE_KEY, deviceKey->valuestring);
  41. yx_data_set(DATANAME_DEVICE_SECRET, deviceSecret->valuestring);
  42. ESP_LOGI(TAG, "save device info done...");
  43. call_result = ESP_OK;
  44. }
  45. }
  46. cJSON_Delete(root);
  47. }
  48. xTaskNotifyGive((TaskHandle_t)user_data);
  49. }
  50. void device_register_task(void *pv)
  51. {
  52. uint8_t count = 0;
  53. for (;;)
  54. {
  55. if(count++ > RETRY_TIMES) {
  56. ESP_LOGE(TAG, "register failed, retry %d times", count);
  57. esp_restart();
  58. }
  59. ESP_LOGI(TAG, "start device register...");
  60. if(!net_connect_check()) {
  61. break;
  62. }
  63. // // check is register
  64. // char *deviceId = yx_data_get(DATANAME_DEVICE_ID);
  65. // if (deviceId != NULL)
  66. // {
  67. // ESP_LOGI(TAG, "gateway is register, device_id is :%s, now start login", deviceId);
  68. // xTaskCreate(&device_login_task, "login task", 1024 * 4, NULL, 1, NULL);
  69. // break;
  70. // }
  71. char str_device_serial[16];
  72. get_device_serial(str_device_serial);
  73. cJSON *req = cJSON_CreateObject();
  74. cJSON *productKey = cJSON_CreateString(YXLJ_PRODUCT_KEY);
  75. cJSON *deviceCode = cJSON_CreateString(str_device_serial);
  76. cJSON *deviceModule = cJSON_CreateString(YXLJ_DEVICE_MODULE);
  77. esp_app_desc_t * desc = esp_app_get_description();
  78. cJSON *version = cJSON_CreateString(desc->version);
  79. cJSON *deviceType = cJSON_CreateNumber(1);
  80. cJSON_AddItemToObject(req, "product_key", productKey);
  81. cJSON_AddItemToObject(req, "device_code", deviceCode);
  82. cJSON_AddItemToObject(req, "device_module", deviceModule);
  83. cJSON_AddItemToObject(req, "device_type", deviceType);
  84. cJSON_AddItemToObject(req, "version", version);
  85. char url[128] = "";
  86. sprintf(url, "%s/v1/devices/registration", SPARROW_SERVER_URL);
  87. net_http_config_t config = {
  88. .callback = http_register_callback,
  89. .url = url,
  90. .user_data = xTaskGetCurrentTaskHandle(), // 传递当前任务 handle,方便在回调中获取
  91. };
  92. net_http_post(cJSON_Print(req), config);
  93. cJSON_Delete(req);
  94. //free(deviceId);
  95. // 等待信号
  96. ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
  97. if (call_result == ESP_OK)
  98. {
  99. ESP_LOGI(TAG, "device register success,now start login...");
  100. BaseType_t result = xTaskCreate(&device_login_task, "login task", 1024 * 4, NULL, 1, NULL);
  101. if(result != pdPASS){
  102. ESP_LOGE(TAG, "device register fault....");
  103. esp_restart();
  104. }
  105. break;
  106. }
  107. else
  108. {
  109. ESP_LOGI(TAG, "device register failed, after 3 sec retry...");
  110. vTaskDelay(3000 / portTICK_PERIOD_MS);
  111. }
  112. }
  113. vTaskDelete(NULL);
  114. }