本文介紹裝置OTA升級的基本流程,OTA升級功能開發的介面說明及接入方法。
擷取SDK
您可以下載物聯網平台提供的Android Link SDK Demo。
下載本Demo預設您同意本軟體許可協議。
OTA升級基本流程
裝置上報版本號碼。
裝置訂閱OTA升級相關Topic。
在物聯網平台控制台的OTA升級頁面配置OTA升級任務,可以按多維度指定要升級的裝置。
成功訂閱OTA升級相關Topic的裝置在當前配置的OTA升級任務中,裝置會收到一個推送資訊,其中包括:
可升級的版本號碼。
OTA升級包地址、大小、MD5。
裝置下載OTA升級包,開始升級,並上報升級進度。
裝置升級完成後,自動上報新的版本號碼。
OTA升級配置的操作流程,請參見OTA升級概述。
使用限制
當前Android Link SDK的OTA升級過程中僅支援使用HTTPS協議下載升級包。
當您在物聯網平台控制台驗證升級包和發起升級批次任務時,升級包下載協議必須選擇
HTTPS。更多資訊,請參見驗證升級包和發起升級批次任務。當您調用雲端介面驗證升級包(CreateOTAVerifyJob)和發起升級批次任務(CreateOTAStaticUpgradeJob和CreateOTADynamicUpgradeJob)時,請求參數DownloadProtocol必須傳入
HTTPS。
SDK介面說明
SDK中OTA升級相關介面說明,請參見介面IOta。
SDK接入方法
具體代碼實現,請參見SDK Demo中的OTAActivity.java。
在物聯網平台控制台,配置OTA升級任務,擷取OTA執行個體:
mOta = LinkKit.getInstance().getOta()準備OTA升級任務,
tryStartOta實現了目前的版本上報,訂閱Topic,當有OTA升級推送時,會通過IOta.STEP_RCVD_OTA回調。說明使用者可以使用OTA對多個模組升級。預設的OTA任務的模組名是default或者為空白。使用者可以自訂不同的模組。
tryStartOta會上報預設模組的版本號碼。如果要在啟動時上報自訂模組的版本號碼,可以對每個模組調用reportModuleVersion進行上報。使用者可以在
IOta.STEP_RCVD_OTA的回調結果中,查看OTA任務的模組名稱和版本號碼。因此,在使用了多個自訂OTA模組的情境,也不需要重複調用tryStartOta。在該回調中,使用者返回
true表示進行OTA升級,返回false表示拒絕此次OTA升級(裝置重新上線或者主動請求OTA任務時,會再次下發該OTA任務)。
mOta.tryStartOta(mConfig, new OtaListener(){ public boolean onOtaProgress(int step, IOta.OtaResult otaResult) { //當前升級過程的狀態值(錯誤碼)。 int code = otaResult.getErrorCode(); if (code != IOta.NO_ERROR) { AppLog.e(TAG, "onOtaProgress error:" + code); // show tip for uses. return false; } Object data = otaResult.getData(); switch (step) { case IOta.STEP_REPORT_VERSION: // 通知使用者已完成向服務端上報裝置版本號碼。 break; case IOta.STEP_SUBSCRIBE: // 通知使用者已完成向服務端訂閱OTA報文。 break; case IOta.STEP_RCVD_OTA: // 通知使用者當前OTA任務的版本號碼、模組資訊、 MD5等資訊。使用者如果需要OTA升級,需要返回true;如果拒絕OTA升級,需要返回false(裝置重新上線或者主動請求OTA任務時會再次下發該OTA任務)。 AppLog.d(TAG, "STEP_RCVD_OTA"); otaInfo = (OtaInfo) otaResult.getData(); AppLog.d(TAG, "STEP_RCVD_OTA,module:"+ otaInfo.module); AppLog.d(TAG, "STEP_RCVD_OTA,ext:"+ otaInfo.extData); break; case IOta.STEP_DOWNLOAD: // 下載OTA升級包中,使用者可從中感知下載OTA升級包的百分比,具體請參見Demo。 break; } return true; } });裝置收到推送的OTA升級包時,返回true,會自動下載OTA升級包,下載進度通過
IOta.STEP_DOWNLOAD回調。說明預設模組可以通過
reportProgress上報升級進度。自訂模組可以通過
reportModuleProgress上報升級進度。
裝置下載OTA升級包完成後,裝置廠商通過自己的OTA方式升級裝置即可。
裝置OTA升級完成後,需要上報最新版本號碼給服務端,服務端判斷該版本號碼是否和預期的升級包版本號碼一致,如果一致則判定OTA升級成功。
裝置可以通過調用
reportVersion介面(對於模組的OTA任務需要調用reportModuleVersion介面)實現目前的版本號的上報。裝置也可以通過調用
tryStartOta介面重新註冊OTA升級服務時上報版本號碼。該介面的第一個入參需要指定裝置的當前的版本號碼,因此該介面執行後,SDK將裝置當前的版本號碼上報到服務端。說明tryStartOta介面不能上報模組的版本號碼。
當您需要退出OTA升級服務(不再監聽OTA升級訊息)時,需要調用
tryStopOta介面。如果之前已經執行過步驟2,當您需要通過
LinkKit.getInstance().deinit()介面退出物聯網服務時,請先調用tryStopOta確保之前的OTA服務已經退出。
本SDK只提供OTA升級包的管理、推送、下載,具體OTA升級進度需要開發人員自己定義,可通過介面reportProgress()完成。SDK同時提供reportVersion()介面,用於上報版本。
斷點續傳
SDK預設不開啟斷點續傳功能,如果您需開啟該功能,請參考以下方式開啟。
對於下載過程中斷電重啟的情境:
不支援斷電續傳。
重啟成功後,在新啟動的OTA升級任務中,將從檔案頭開始下載。
//設定為true,開啟斷點續傳功能,預設為false。
mOta.enableContinuousDownload(true);
//下載異常斷開後,重試24*60次,每次間隔60秒,使用者可以根據自己情況進行調整。
mOta.setRetryParams(24*60, 60);主動下載OTA升級包
SDK預設是被動接收服務端的升級訊息,SDK也支援裝置主動向雲端查詢OTA升級包的升級訊息。
主動下載OTA升級包功能,需裝置的OTA升級開發完成才能使用。裝置OTA開發,請參見上文SDK接入方法。
//裝置主動向雲端查詢OTA升級包的升級訊息,"default"表示查詢的是預設模組,您也可以指定其他模組名。
mOta.tryGetOtaFirmware("default");