阿里云物聯網平臺為設備提供OTA升級與管理服務。本文介紹設備如何通過物聯網平臺完成遠程升級功能。
前提條件
使用流程
如下功能時序圖,以設備的應用程序./demos/ota_basic_demo.c
為例,介紹設備升級過程。
步驟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; }
設置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);
文檔內容是否對您有幫助?