日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

設備OTA開發

阿里云物聯網平臺為設備提供OTA升級與管理服務。本文介紹設備如何通過物聯網平臺完成遠程升級功能。

前提條件

使用流程

如下功能時序圖,以設備的應用程序./demos/ota_basic_demo.c為例,介紹設備升級過程。

image

步驟1: 設備初始化

  1. 創建設備句柄,完成設備建連。

    static void* demo_device_init(char *product_key, char *device_name, char *device_secret, char *host, uint16_t port)
    {
        int32_t res = STATE_SUCCESS;
        /* 創建設備 */
        void *device = aiot_device_create(product_key, device_name);
        if (device == NULL) {
            printf("device create failed\n");
            return NULL;
        }
        /* 設置設備密鑰 */
        aiot_device_set_device_secret(device, device_secret);
    
        /* 連接配置參數初始化 */
        aiot_linkconfig_t* config = aiot_linkconfig_init(protocol);
        /* 設置服務器的host、port */
        aiot_linkconfig_host(config, host, port);
    
        /* 設置設備連接參數 */
        aiot_device_set_linkconfig(device, config);
        
        /* 設備建連 */
        res = aiot_device_connect(device);
        if (res < STATE_SUCCESS) {
            /* 嘗試建立連接失敗, 銷毀MQTT實例, 回收資源 */
            aiot_linkconfig_deinit(&config);
            aiot_device_delete(&device);
            printf("aiot_device_connect failed: -0x%04X\n\r\n", -res);
            return NULL;
        }
    
        /* 建連成功返回設備對象 */
        aiot_linkconfig_deinit(&config);
        return device;
    }
  2. 設置OTA消息回調。

    memset(&ota_task, 0, sizeof(ota_task));
        ota_task.device = device;
        ota_task.ota_process_flag = 0;
        ota_task.filename = "fireware.bin";
        /* 設置OTA回調函數 */
        aiot_device_ota_set_callback(device, demo_ota_msg_callback, &ota_task);

步驟2: 上報設備版本號

物聯網平臺可根據上報的設備版本號決定是否推送升級。

  /* 上報設備版本號 */
    aiot_device_ota_report_version(device, NULL, "4.0.0");

步驟3: 請求固件信息

物聯網平臺部署升級固件后,會推送升級消息。當有升級任務時,設備可以主動請求升級信息。

  /* 設備主動請求升級包,如果有升級任務,會下發 */
    aiot_device_ota_request_firmware(device, NULL);

步驟4: 處理固件信息

步驟1中已設置OTA消息回調,在接收到消息后,會執行該回調函數。回調函數不能長時間阻塞,新建線程用于處理固件下載及升級動作。

static void demo_ota_msg_callback(void *device, const aiot_ota_msg_t *ota_msg, void *userdata)
{
    int32_t res = STATE_SUCCESS;
    pthread_t ota_process_thread;
    demo_ota_task_t *task = (demo_ota_task_t *)userdata;
    if(ota_msg != NULL && ota_msg->http_url != NULL) {
        /* 判斷設備是否已經在執行升級,避免重復升級 */
        if(task->ota_process_flag != 0) {
            return;
        }

        /* 回調中不能長時間阻塞,拷貝消息用于異步處理, 拷貝的對象需要刪除 */
        task->ota_msg = aiot_ota_msg_clone(ota_msg);
        res = pthread_create(&ota_process_thread, NULL, demo_ota_process_thread, task);
        if (res < 0) {
            aiot_ota_msg_free(task->ota_msg);
            task->ota_msg = NULL;
            printf("pthread_create demo_ota_process_thread failed: %d\n", res);
            return;
        } else {
            /* 設置線程為detach狀態,用于自動資源回收 */
            pthread_detach(ota_process_thread);
        }
    } else {
        printf("ota invalid message \r\n");
    }
}

步驟5: 下載固件

下載固件會在下載完成時退出,也可設置接收固件的超時時間,超時也可退出。

    /* 下載文件 */
    res = core_http_download_request(task->ota_msg->http_url, params, task->filename, save_file, NULL);

步驟6: 固件校驗

固件校驗是為了確保固件是否完整,示例中采用的是MD5校驗,如果校驗出錯,不再執行升級動作,上報校驗失敗的狀態并退出升級。

 res = file_md5_check(task->filename, task->ota_msg->expect_digest);
    if(STATE_SUCCESS != res ) {
        /* 校驗固件失敗,上報狀態 */
        aiot_device_ota_report_state(task->device, NULL, -3);
    }

步驟7: 上報升級狀態

上報升級狀態可在升級過程表示升級的進度,如下示例在固件下載完成后上報進度100%,用戶可自行定義升級進度。

/* 寫文件系統或者flash成功,上報升級進度 */
    aiot_device_ota_report_state(task->device, NULL, 100);

步驟8: 上報新的版本號

只有上報的版本號與新固件的版本號相同,物聯網平臺才會認為升級完成,建議設備重啟后再上報。

 /* 更新新版本號表示升級完成,建議是重啟后再上報 */
    /*
    aiot_device_ota_report_version(task->device, NULL, ota_msg->version);
    */

步驟9:設備反初始化

  /* 斷開設備連接,并回收設備資源 */
    demo_device_deinit(device_client);