使用OTA控制台升级固件

使用生活物联网平台设备端SDK的内置OTA功能,用户只需要适配所使用的模组和新品,即可使用生活物联网平台的云端OTA服务。本文主要介绍自有品牌项目下使用OTA控制台升级固件的流程。

前提条件

设备已烧录了一个固件版本,且已成功连接到生活物联网平台。

背景信息

总体OTA升级流程如下:

  1. 设备端开发升级所需的固件

    编译设备端新固件,固件中需要内置版本号信息,设备完成固件烧写并重启后,会上报该新版本号到OTA服务端。

  2. 控制台(云端)执行升级过程

    用户在OTA控制台执行操作,包括上传固件、验证固件、批量升级、管理固件等。

  3. 手机App端确认升级和验证升级结果

    如果固件升级开启App确认功能,则需要用户在手机App上确认升级任务后,控制台才会执行固件升级。升级完成后,在手机App上验证升级结果。

一、设备端开发升级所需的固件

设备端(以Wi-Fi设备为例)主要有3个topic来与云端进行交互,流程如下图所示。

设备端与云端交互流程

  1. 设备端通过以下topic向云端上报当前版本号。通常设备上电开机后需要上报一次当前固件版本号。

    当设备完成OTA固件下载并烧录,重启后该topic上报的则为新固件的版本信息。

    数据上行

    /ota/device/inform/${productKey}/${deviceName}

    请求数据格式:

    {
        "id":"123",
        "params":{
            "version":"1.0.1",
            "module":"MCU"
        }
    }

    参数

    类型

    说明

    id

    String

    消息ID号。String类型的数字,取值范围0~4294967295,且每个消息ID在当前设备中具有唯一性。

    version

    String

    OTA模块版本。

    module

    String

    OTA模块名。

    说明

    • 上报默认(default)模块的版本号时,可以不上报module参数。

    • 设备的默认(default)模块的版本号代表整个设备的固件版本号。

  2. 当有新版本固件时,云端通过以下topic向设备端推送新固件的版本信息。

    数据下行

    /ota/device/upgrade/${productKey}/${deviceName}
  3. 设备端通过以下topic向云端上报OTA升级进度。该进度可以在控制台以及手机App中查看。

    数据上行

    /ota/device/progress/${productKey}/${deviceName}
    说明

    建议设置设备端上报进度频率为3秒内最多一次。若设备上报进度频繁,在物联网平台控制台的OTA升级包详情的批次详情中,可能无法查看到上报的全部进度。

    {
        "id": "123",
        "params": {
            "step": "-1",
            "desc": "OTA升级失败,请求不到升级包信息。",
            "module": "MCU"
        }
    }

    参数

    类型

    说明

    id

    String

    消息ID号。String类型的数字,取值范围0~4294967295,且每个消息ID在当前设备中具有唯一性。

    step

    String

    OTA升级进度。

    取值范围:

    • 1~100的整数:升级进度百分比。

    • -1:升级失败。

    • -2:下载失败。

    • -3:校验失败。

    • -4:烧写失败。

    desc

    String

    当前步骤的描述信息,长度不超过128个字符。如果发生异常,此字段可承载错误信息。

    module

    String

    升级包所属的模块名。模块的更多信息,请参见添加升级包

    说明 上报默认(default)模块的OTA升级进度时,可以不上报module参数。

  1. 根据设备端开发文档和设备端与云端交互的流程图,开发待升级的设备固件。详细的OTA开发编程请参见设备OTA编程

  2. 编译生成新的设备固件,并确认设备端新固件的版本号。

    在SDK根目录,执行编译命令。

    aos make clean
    aos make living_platform@<模组名>

    以下为编译过程中的日志片段,其中app_version_new对应的即为新固件的版本号。

    Check if required tools for esp8266 exist
    Making config file for first time
    processing components: living_platform esp8266 
    platform/mcu/esp8266 vcall init auto_component
    server region: MAINLAND
    server env: ONLINE
    APP: living_platform 
    Board: esp8266host 
    user: liuese
    branch: rel_1.1.0
    hash: 0f1596cffffd9a4646a3cce4d3c7ba9b4f14649d
    app_version_new:app-1.0.0-20191107142256  //新固件的版本号
    firmware type: RELEASE
    FEATURE_SUPPORT_ITLS != y, so using normal TLS
    app_version:app-1.0.0-20191107142256
    kernel_version:AOS-R-1.3.4
    server region: MAINLAND
    server env: ONLINE
    APP: living_platform Board: esp8266

二、在控制台执行升级过程

  1. 登录生活物联网平台控制台

  2. 上传固件。

    1. 进入运营中心 > 运营工具 > 固件升级页面。

    2. 固件列表页签中的产品下拉框选择产品名称,并单击添加固件

      固件升级

    3. 输入固件相关参数,并单击确定完成。

      通常使用容易识别的固件名称和版本号来标识固件,建议将固件版本号与设备固件自身版本号保持一致。详细参数解释请参见固件升级

      添加固件

  3. 上传固件后,使用测试设备验证固件。

    固件验证的目的是为了保证固件质量,并且,通常建议选择3~5个测试设备来执行固件验证。

    • 确保新固件版本正确,固件运行正常。

    • 确保OTA升级服务可以正常执行,设备可以正常完成升级任务。

    1. 返回运营中心 > 运营工具 > 固件升级页面。

    2. 单击固件列表中操作列中的验证固件

    3. 配置验证固件的相关参数。

      • 待升级版本号:现有设备版本号,即原版本号。

      • 待验证设备:选择待验证设备,支持单选、多选、全选。

      • APP确认升级:选择是否支持App升级确认功能,如果通过云智能App连接设备,可以使用云智能App确认升级该固件。

      • 设备升级超时时间:选择超时时间,达到超时时间后仍未完成固件验证,则验证固件失败。

      验证固件

    4. 单击确定,开始执行固件验证。

      如果APP确认升级配置为,需登录手机云智能App,进入我的 > 设置 > 固件升级中,单击确认升级后,才开始执行固件验证。

    5. 选择新的测试设备,执行以上步骤。

  4. 批量升级固件。

    固件验证通过后,进入批量升级阶段,可以支持全量、分批向设备推送升级。

    1. 返回运营中心 > 运营工具 > 固件升级页面。

    2. 单击固件列表中操作列中的批量升级

    3. 配置批量升级的相关参数,并单击确定完成。

      根据您自身需要选择合理参数,控制OTA升级节奏,提高升级成功率。批量升级的参数介绍请参见固件升级批量升级

  5. 管理固件升级。

    控制台支持对固件的管理,包括了新增、产品维度固件枚举、查看指定固件详情、删除等操作。在固件详情界面中,可以查看当前固件详细信息,还包括了目标设备总数、升级成功数、失败数等信息,有利于厂商掌握该版本升级的结果信息。下面介绍查看固件升级结果的操作为例,更多操作可参见固件升级

    1. 进入运营中心 > 设备运维 > 固件升级页面。

    2. 单击固件列表中操作列中的查看

    3. 批次管理页签下的设备列表页签中,查看升级状态。

      升级详情

三、多模块升级

  1. 应用场景

    部分飞燕客户需要对WiFi模组和MCU分别进行升级,所以需要设置不同的模块来区分。因为会存在多个模块同时需要升级的情况,所以需要在控制台同时创建升级任务来依次进行升级,但一个设备在一个时间点只能存在一个升级任务,所以可能出现报错,可参考下面步骤实现。

    比如设备当前固件版本:WiFi:1.0.0,MCU:2.0.0

    要升级的目标固件版本:WiFi:1.1.0,MCU:2.2.0

    (模块之间的版本互不影响)

  2. 新增固件

    image.png

    分别给模块创建动态升级任务

    先创建一个WiFi 模块从1.0.0升级到1.1.0的动态升级任务

    再创建一个MCU模块从2.0.0升级到2.2.0的动态升级任务

    image.png

    21934003-086A-4B6B-B7D9-846977C14108.png

    由于一个设备同一时间只能在一个正在进行的升级批次中(设备处于待推送、已推送或升级中状态),所以第二个创建的MCU的批次会直接显示失败,但是没关系。先确认WiFi模块的升级,在WiFi模块升级成功后,设备再次上报MCU:2.0.0版本,MCU批次下的该设备就会变成待推送状态,可以继续升级MCU模块。

四、手机App确认升级和验证升级结果

App端主要有4个topic来与云端进行交互,流程如下图所示。

20240606135006.jpg

  1. 查询待升级固件

    App端通过以下topic向云端查询用户绑定设备的待升级信息,根据返回信息展示待升级设备名称列表。在控制台添加批量升级任务后,云端会将相应待确认升级固件列表信息会返回给用户(App端)。

    /living/ota/firmware/file/get
  2. 确认设备升级

    APP确认升级配置为时,云端需要收到App端通过该topic上报的消息后,才能开始执行升级任务,并将该执行任务推送到设备端。

    /living/ota/confirm
  3. 获取正在升级的设备列表(公版App中目前没有使用该topic)

    App端选择周期性或者下拉刷新等UI交互方式,通过以下topic向云端查询当前正在升级的设备信息。云端返回升级的设备列表信息等。

    /living/ota/devices/list
  4. 获取指定固件的升级信息

    1. 长连接实时监听,实时通知方式,不需要轮询方便使用;

    2. API接口查询

      需要调用接口轮询查询,详情参见:获取用户名下设备的固件升级进度

      /living/ota/progress/list 
  5. 取消固件升级

    取消某一个设备的固件升级流程,详情参见:取消固件升级

    /living/ota/cancel
说明

上报固件升级进度上报固件版本信息 两个API不建议使用,设备端会进行固件进度上报的,不需要APP上报的。

下面以生活物联网平台云智能App为例,介绍App端的操作。

  1. 登录云智能App。

  2. 选择我的 > 设置 > 固件升级

  3. 查看固件升级,展示待升级信息、发起固件升级、展示升级结果等信息。