#include #include "register.h" #include "gateway_defs.h" #include "esp_log.h" #include "../system/miscellaneous_interface.h" #include "../system/net_http.h" #include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "login.h" static const char *TAG = "REGISTER"; #define RETRY_TIMES 15 // 注册重试次数 esp_err_t call_result; void http_register_callback(char *response, void *user_data) { call_result = ESP_FAIL; if (response != NULL) { // parse response /** * {"code":0,"message":"","data":{"device_id":1033,"device_secret":"Ppmr7KXyotOZCdI6oRIN9n8uxacNXUnv","device_key":"69617ac8eb0024e8d1062400f0c8e2d34bc5700ba626b96a2107f18d55951f7d9a4c8cd2259f7df389075c74067ffd70","device_identifier":"08D1F9E77840"}} */ cJSON *root = cJSON_Parse(response); cJSON *code = cJSON_GetObjectItemCaseSensitive(root, "code"); if (code != NULL) { // if code is 0, main register success if (cJSON_IsNumber(code) && code->valueint == 0) { // parse register data cJSON *data = cJSON_GetObjectItem(root, "data"); cJSON *deviceId = cJSON_GetObjectItemCaseSensitive(data, "device_id"); cJSON *deviceKey = cJSON_GetObjectItemCaseSensitive(data, "device_key"); cJSON *deviceSecret = cJSON_GetObjectItemCaseSensitive(data, "device_secret"); ESP_LOGI(TAG, "device register success: id is %d, key is %s, secret is :%s", deviceId->valueint, deviceKey->valuestring, deviceSecret->valuestring); char device_id[10] = {0}; sprintf(device_id, "%d", deviceId->valueint); yx_data_set(DATANAME_DEVICE_ID, device_id); yx_data_set(DATANAME_DEVICE_KEY, deviceKey->valuestring); yx_data_set(DATANAME_DEVICE_SECRET, deviceSecret->valuestring); ESP_LOGI(TAG, "save device info done..."); call_result = ESP_OK; } } cJSON_Delete(root); } xTaskNotifyGive((TaskHandle_t)user_data); } void device_register_task(void *pv) { uint8_t count = 0; for (;;) { if(count++ > RETRY_TIMES) { ESP_LOGE(TAG, "register failed, retry %d times", count); esp_restart(); } ESP_LOGI(TAG, "start device register..."); if(!net_connect_check()) { break; } // // check is register // char *deviceId = yx_data_get(DATANAME_DEVICE_ID); // if (deviceId != NULL) // { // ESP_LOGI(TAG, "gateway is register, device_id is :%s, now start login", deviceId); // xTaskCreate(&device_login_task, "login task", 1024 * 4, NULL, 1, NULL); // break; // } char str_device_serial[16]; get_device_serial(str_device_serial); cJSON *req = cJSON_CreateObject(); cJSON *productKey = cJSON_CreateString(YXLJ_PRODUCT_KEY); cJSON *deviceCode = cJSON_CreateString(str_device_serial); cJSON *deviceModule = cJSON_CreateString(YXLJ_DEVICE_MODULE); esp_app_desc_t * desc = esp_app_get_description(); cJSON *version = cJSON_CreateString(desc->version); cJSON *deviceType = cJSON_CreateNumber(1); cJSON_AddItemToObject(req, "product_key", productKey); cJSON_AddItemToObject(req, "device_code", deviceCode); cJSON_AddItemToObject(req, "device_module", deviceModule); cJSON_AddItemToObject(req, "device_type", deviceType); cJSON_AddItemToObject(req, "version", version); char url[128] = ""; sprintf(url, "%s/v1/devices/registration", SPARROW_SERVER_URL); net_http_config_t config = { .callback = http_register_callback, .url = url, .user_data = xTaskGetCurrentTaskHandle(), // 传递当前任务 handle,方便在回调中获取 }; net_http_post(cJSON_Print(req), config); cJSON_Delete(req); //free(deviceId); // 等待信号 ulTaskNotifyTake(pdTRUE, portMAX_DELAY); if (call_result == ESP_OK) { ESP_LOGI(TAG, "device register success,now start login..."); BaseType_t result = xTaskCreate(&device_login_task, "login task", 1024 * 4, NULL, 1, NULL); if(result != pdPASS){ ESP_LOGE(TAG, "device register fault...."); esp_restart(); } break; } else { ESP_LOGI(TAG, "device register failed, after 3 sec retry..."); vTaskDelay(3000 / portTICK_PERIOD_MS); } } vTaskDelete(NULL); }