设备OTA升级

本文介绍设备OTA升级开发的基本流程及接入的方法。

OTA升级基本流程

  1. 设备上报版本号。

  2. 设备订阅OTA升级相关Topic。

  3. 在物联网平台控制台的OTA升级页面配置OTA升级任务,可以按多维度指定要升级的设备。

  4. 成功订阅OTA升级相关Topic的设备在当前配置的OTA升级任务中,设备会收到一个推送信息,其中包括:

    • 可升级的版本号。

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

  5. 设备下载OTA升级包,开始升级,并上报升级进度。

  6. 设备升级完成后,自动上报新的版本号。

使用限制

OTA升级过程中仅支持使用HTTPS协议下载升级包。

SDK接入方法

具体代码实现请参见Demo中的ota_demo.py

  1. 注册OTA回调,在物联网平台控制台配置OTA升级任务。

  2. 当有OTA推送时,会通过on_ota_message_arrived回调透出OTA升级包的URL、 版本号、大小、签名、模块名、签名方法等信息。

    您可根据上述信息,决定是否要升级。如果升级,则通过调用download_ota_firmware进行升级。

    from linkkit import linkkit
    import logging
    import time
    
    
    def on_ota_message_arrived(ota_notice_type, version, size, url, sign_method, sign, module, extra):
        # ota_notice_type 为0,表示没有服务端没有部署ota任务;为1,表示云端下推的ota任务;为2,表示设备端自己主动向服务端查询ota任务
        if ota_notice_type > 0:
            # TODO: 用户判断版本号,决定是否要升级,以及何时升级
    
            # TODO: 如果固件的大下载耗时长,建议用户在这里起一个线程来处理,从而不阻塞整体链路。在这种情况下,如果用户在短时间内多次收到OTA消息
            #  (比如用户短期内多次主动请求OTA固件,或者收到平台主动推送的同时又自己主动请求固件),那么用户需要做好多线程之间的并发处理逻辑,
            #  避免多个线程同时写同一个文件
    
            print("on_ota_message version:" + version + " size:" + str(size) + " url:" + url + " sign_method:" + sign_method)
            print("on_ota_message sign:" + sign + " module:" + module + " extra:" + extra)
            # TODO: 修改firmware_path变量,将固件存储到需要用户自定义的路径
            firmware_path = "demo_ota.py"
            ret = lk.download_ota_firmware(url, firmware_path, sign_method, sign)
    
            if lk.ErrorCode.SUCCESS == ret:
                # TODO: 用户部署新的固件,并上报新固件的版本号,确认升级完成
                print("report version ")
                lk.ota_report_version(module, version)
                pass
            else:
                print("download error code %x" % ret.value)
        else:
            print("no firmware ")
    
    # TODO: 输入设备的证书信息
    lk = linkkit.LinkKit(
        host_name="cn-shanghai",
        product_key="${YourProductKey}",
        device_name="${YourDeviceName}",
        device_secret="${YourDeviceSecret}")
    # TODO: 输入用户的mqtt接入点
    lk.config_mqtt(endpoint="${YourInstanceId}")
    lk.on_ota_message_arrived = on_ota_message_arrived
    __log_format = '%(asctime)s-%(process)d-%(thread)d - %(name)s:%(module)s:%(funcName)s - %(levelname)s - %(message)s'
    logging.basicConfig(format=__log_format)
    lk.enable_logger(logging.DEBUG)
    lk.connect_async()
    
    while True:
        time.sleep(1)
  3. 下载OTA升级包完成后,设备厂商通过自己的OTA方式升级设备。完成后,通过ota_report_version接口上报版本号,物联网平台收到后与目标版本号进行比较,若一致则判断当前升级成功。

主动下载OTA升级包

SDK默认是被动接收服务端的升级消息,SDK也支持设备主动向云端查询OTA升级消息。

def query_ota_firmware(self, module=None)
说明

其中module默认为None,表示默认模块。如果用户需要升级特定的模块,可以通过module字段指定模块名。