全部產品
Search
文件中心

IoT Platform:裝置OTA升級

更新時間:Jun 30, 2024

本文介紹裝置OTA升級的基本流程,OTA升級功能開發的介面說明及接入方法。

擷取SDK

您可以下載物聯網平台提供的Android Link SDK Demo

重要

下載本Demo預設您同意本軟體許可協議

OTA升級基本流程

  1. 裝置上報版本號碼。

  2. 裝置訂閱OTA升級相關Topic。

  3. 在物聯網平台控制台的OTA升級頁面配置OTA升級任務,可以按多維度指定要升級的裝置。

  4. 成功訂閱OTA升級相關Topic的裝置在當前配置的OTA升級任務中,裝置會收到一個推送資訊,其中包括:

    • 可升級的版本號碼。

    • OTA升級包地址、大小、MD5。

  5. 裝置下載OTA升級包,開始升級,並上報升級進度。

  6. 裝置升級完成後,自動上報新的版本號碼。

OTA升級配置的操作流程,請參見OTA升級概述

使用限制

當前Android Link SDK的OTA升級過程中僅支援使用HTTPS協議下載升級包。

SDK介面說明

SDK中OTA升級相關介面說明,請參見介面IOta

SDK接入方法

具體代碼實現,請參見SDK Demo中的OTAActivity.java

  1. 物聯網平台控制台,配置OTA升級任務,擷取OTA執行個體:

           mOta = LinkKit.getInstance().getOta()              
  2. 準備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;
        }
    });                  
  3. 裝置收到推送的OTA升級包時,返回true,會自動下載OTA升級包,下載進度通過IOta.STEP_DOWNLOAD回調。

    說明
    • 預設模組可以通過reportProgress上報升級進度。

    • 自訂模組可以通過reportModuleProgress上報升級進度。

  4. 裝置下載OTA升級包完成後,裝置廠商通過自己的OTA方式升級裝置即可。

  5. 裝置OTA升級完成後,需要上報最新版本號碼給服務端,服務端判斷該版本號碼是否和預期的升級包版本號碼一致,如果一致則判定OTA升級成功。

    • 裝置可以通過調用reportVersion介面(對於模組的OTA任務需要調用reportModuleVersion介面)實現目前的版本號的上報。

    • 裝置也可以通過調用tryStartOta介面重新註冊OTA升級服務時上報版本號碼。該介面的第一個入參需要指定裝置的當前的版本號碼,因此該介面執行後,SDK將裝置當前的版本號碼上報到服務端。

      說明

      tryStartOta介面不能上報模組的版本號碼。

  6. 當您需要退出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");