本文介绍设备OTA升级开发的基本流程及接入的方法。
OTA升级基本流程
设备上报版本号。
设备订阅OTA升级相关Topic。
在物联网平台控制台的OTA升级页面配置OTA升级任务,可以按多维度指定要升级的设备。
成功订阅OTA升级相关Topic的设备在当前配置的OTA升级任务中,设备会收到一个推送信息,其中包括:
可升级的版本号。
OTA升级包地址、大小、MD5。
设备下载OTA升级包,开始升级,并上报升级进度。
设备升级完成后,自动上报新的版本号。
使用限制
OTA升级过程中仅支持使用HTTPS协议下载升级包。
当您在物联网平台控制台验证升级包和发起升级批次任务时,升级包下载协议必须选择
HTTPS
。更多信息,请参见验证升级包和发起升级批次任务。当您调用云端接口验证升级包(CreateOTAVerifyJob)和发起升级批次任务(CreateOTAStaticUpgradeJob和CreateOTADynamicUpgradeJob)时,请求参数DownloadProtocol必须传入
HTTPS
。
SDK接入方法
具体代码实现请参见Demo中的ota_demo.py
。
注册OTA回调,在物联网平台控制台配置OTA升级任务。
当有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)
下载OTA升级包完成后,设备厂商通过自己的OTA方式升级设备。完成后,通过
ota_report_version
接口上报版本号,物联网平台收到后与目标版本号进行比较,若一致则判断当前升级成功。
主动下载OTA升级包
SDK默认是被动接收服务端的升级消息,SDK也支持设备主动向云端查询OTA升级消息。
def query_ota_firmware(self, module=None)
其中module
默认为None
,表示默认模块。如果用户需要升级特定的模块,可以通过module
字段指定模块名。