-
Notifications
You must be signed in to change notification settings - Fork 1.1k
OTA Tutorial.zh
中文 | EN
(1)使用对象: 使用AliOS的开发者或用户
(2)开发板: 庆科3060
(3)编译环境: 安装有ubuntu linux的PC或虚拟机
(4)代码路径:https://github.com/alibaba/AliOS-Things.git 分支:rel_2.0.0
(5)云平台: 阿里云物联网开发平台
(6)参考文档:
AliOS Things OTA移植指南文档 阿里云物联网平台固件升级文档 阿里云智能生活开放平台固件升级文档
针对智能开放平台目前只推出了基础的整包升级服务,针对物联网平台推出了整包升级(提供基础整包固件升级),差分升级 (提供差分增量包固件升级),安全升级(提供安全数字签名验证升级)服务。默认选择的是整包升级,开发者或用户可以根据应用场景选择使用差分升级和安全升级。
使用过程如遇到问题注意先参考第4章和第5章的问题排查步骤及常见问题示例自查。
① 下载代码并选择OTA demo程序和开发板
② 登录云端账号获取四元组并开通固件升级服务
③ 根据需要是否开启安全升级功能,如开启获取云端公钥
④ 编译生成不同版本固件,一个低版本,一个高版本
⑤ 将低版本的固件烧录到对应的目标板子,运行demo程序OTA_APP pk dn ds ps
⑥ 待设备上线后将高版本的固件上传到云端
⑦ 云端推送固件,设备端接收固件,并做完整性校验
⑧ 设备端完成固件校验,进入系统升级
⑨ 系统重启后,上报新版本信息到云端
从github上下载AliOS Things代码并选择OTA Demo程序如“aos/app/example/otaapp”,otaapp专门用来测试OTA的功能,选定后接下来需要根据使用的开发板类型编译出对应的固件;
用户设备连云,需要登录云端获取四元组pk,dn,ds,ps,以阿里云物联网平台为例,登录https://iot.console.aliyun.com,进入物联网平台,如没有创建产品,需要创建产品如下图所示,如果未开通固件升级,选择扩展服务,单击固件升级下的使用服务。
创建产品完成后,点击设备管理--->添加设备,在已经创建的产品下添加一个设备,如下图所示:
完成设备添加后,平台会弹出一个设备证书,里面就有三元组了,如下图所示:
这里可以获取pk,dn,ds三元组,ps可以到产品管理----->产品列表------>产品名称------->查看------>产品信息----->ProductSecret点击显示获取,如下图:
如果用户的设备需要支持OTA的安全验签功能,需开启安全升级并获取公钥;否则可以忽略此步骤。登录IOT云端------>扩展服务----->固件升级开通----->固件升级------>使用服务------->安全升级------>产品名称------>安全升级,点击按钮选择开,然后点击复制,如下图:
用户将获取到的公钥覆盖到aos/middleware/uagent/uota/src/verify/ota_public_key_config.h文件中,如下图:
我们的开发板为mk3060(board/mk3060),在终端输入aos make otaapp@mk3060等待编译完成,分别得到两个不同版本的固件,版本号可以通过编译时终端打印输出的开始部分的信息得到如对应红色字体为此固件版本:app_version:app-1.0.0-xxxxxx,注意请记住版本号。 如需手动更改版本号,可以通过修改文件aos/middleware/common/common.mk下app-1.0.0-$(CURRENT_TIME),如改成app-2.0.0-$(CURRENT_TME)
以mk3060的板子为例,所以接下来主要介绍mk3060的下载过程,其他的开发板烧写工具稍有差异但下载操作流程类似。完成步骤4之后,到aos/out/otaapp@mk3060/binary/可找到对应固件如下图所示:
将mk3060通过串口连接电脑,打开串口调试工具,波特率为921600,操作mk3060进入下载模式:mk3060有4个按钮,假定靠近usb口的按钮为1号按钮,需要同时按下1号+3号按钮,然后先放开1号,接着放开3号按键,此时mk3060将进入烧写模式,然后在命令行中输入write 0x13200,再选择发送Ymodem,将编译出来的低版本app-1.0.0-xxxxxx固件otaapp@mk3060.bin文件烧录到目标板中,重启板子,输入命令:netmgr connect ssid passwd, 命令中的ssid和passwd 对应mk3060需要连接的路由器的SSID和密码;网络连接成功后将会看到IP地址等信息,如下图所示:
完成配网功能后,输入命令:OTA_APP pk dn ds ps运行demo程序后若能在云端看到设备在线说明设备端云端连接已经建立,方可进入下一个步骤。
从log信息中可以看到设备的devicename等信息,如果设置错误,设备会连接不成功,从log信息可以验证,设备的PK,DN,DS等信息是否正确。
修改aos/middleware/common/common.mk将版本号app-1.0.0-$(CURRENT_TIME)改成app-2.0.0-$(CURRENT_TME),然后重复步骤4,生成高版本固件版本的固件app-2.0.0-xxxxxx,如下图:
编译完成后,将otaapp@mk3060.ota.md5.bin上传到云端,注意固件版本要填写正确,云端对文件有规则检查如后缀,字符等;IOT云平台登录---->物联网平台------->我的服务-------->固件升级------->新增固件;此时会弹出如下图框,根据图框中带星号的标题填写内容及上传固件,需要注意的是,固件上传之前需要将固件名称中的“@”和“.”转换成“_”只留最后一个“.”;所以otaapp@mk3060.ota.md5.bin需要改成otaapp_mk3060_ota_md5.bin才能上传成功;下图中的签名算法用于保证固件的完整性,以及安全功能,目前支持两种md5和sha256,我们推荐使用sha256.
上传固件完成后,点击验证固件,会弹出如下图框提示选择整包和差分升级;整包代表云端把完整的固件推送到设备端,差分代表云端会对新固件与设备端有相同版本的老固件生成差分增量包后推送到设备端(目前只有板子mk3060和esp8266支持差分升级);当选择整包推送,如下图,按照框图的内容标题对应填入产品的名称,这时候如果设备在线,点击固件版本号下面的框会弹出当前在线设备的版本号,选择即可,设备名称同样如此;然后点击确定,这是云端就会推送固件到设备端;
当选择差分升级时,如下图:
同样填写设备所属的产品,待升级版本号和差分固件名称是设备上已经运行的固件版本号,以及云端与之相对应的固件名称;切片大小需要注意,不同的模组平台切片大小不同,mk3060的平台选择64k,esp8266的平台选择16k,此处需要严格遵守;最后选择要升级的设备,点击确认即可推送。
固件下载完成后,设备端对固件做完整性校验,如果用户选择了安全升级还会有数字验签,保证设备端接收到的固件安全可靠。具体可参见如下log图:
从上图中可以看到sha256校验,固件本身的MD5等鉴别等信息,如果有任何一项校验失败,系统都将升级失败,保持原样固件运行。
当下载的固件校验成功后,系统保存升级状态,自动重启,进入bootloader完成差分还原或者是分区跳转,完成固件升级。
设备完成升级后,首先会上报当前的版本号,云端判断上报的版本号是否与推送的版本号相同,相同的话就升级成功,否则失败;升级成功后云端显示如下图:
4.1. 云端问题排查:产品四元组信息,固件版本,升级方式等确保正确; 4.2. 连接通道问题排查:检查是否上线,排除连接通道问题; 4.3. 下载通道问题排查:可以在linux host上运行otaapp demo看是否能正常从云端下载文件; 4.4. 设备端固件校验及写入问题排查:通过分析出差log定位,如需帮助提供设备端完整log;
答:云端上传的固件版本和端侧的固件的版本格式要相同,并且云端版本要大于端侧版本。如设备端的版本:APP-1.0.0-xxxxxx,云端的版本:APP-2.0.0-xxxxxx. 手动更改版本地方:middleware\common\common.mk。
答:用于云端升级的OTA bin文件与端侧离线烧录的固件可能不一样,如mk3080是out/xxxx@mk3080/binary/ota_all.bin;mk3060是out/xxx@mk3060/binary/xxxx@mk3060.ota.md5.bin
答:原因是OTA升级过程中将网络连接信息的保存区域擦除了,解决办法:检查board.c的分区表,确保每个分区没有重叠。
答:此为已知问题,3080芯片原厂提供的生成OTA bin文件的工具windows下工作正常,linux下工具脚步无法生成正常的OTA bin文件格式。 __ __
| Home | Tutorial | Hardware | Porting Guide | Utilities | API Reference | Technical Docs | Certification |
Crafted with ❤️ by AliOS Things Team.