FOTA(Firmware Over-The-Air)是终端设备固件的空中下载升级,指通过云端升级技术,为具有连网功能的设备提供固件升级服务,用户使用网络以按需、易扩展的方式获取智能终端系统升级包,并通过FOTA进行云端升级,完成系统修复和功能优化。
MN316 OpenCPU SDK提供的FOTA方式是以差分包进行升级,需要先通过编译获得升级前后版本固件包,即模组当前版本和目标升级版本,接着使用差分包制作工具,生成差分包,再把差分包放到服务器上,模组下载到本地进行升级。
本文从使用流程、demo代码、OneNET FOTA示例及常见问题四个方面,介绍如何通过OneNET平台进行FOTA升级。
一、OenNET FOTA使用流程解析
图1 OneNET FOTA使用流程
图1介绍了使用OneNET平台对MN316模组进行FOTA升级的常规流程,可结合MN316_OpenCPU(R14)_Standard_X.X.X.XXXXXX_release\examples\onenet\cm_demo_onenet.c中的demo示例程序加深理解。
OneNET FOTA功能包含的函数接口详细定义在include\cmiot\cm_onenet.h和cm_fota.h中查看。
二、OneNET FOTA demo代码解析
SDK中OneNET FOTA常规使用方法,可在cm_demo_onenet.c文件中查看,目前仅支持COAP方式下载升级,下面我们详细看一下。
2.1 设置用户FOTA版本号及获取FOTA版本号的函数
图2 用户版本号设置及获取
用户自定义版本号user_ver[],由用户自行维护迭代,调用接口cm_fota_get_version,该版本号在进行FOTA升级时将交互到OneNET平台上。
2.2 设置OneNET状态事件上报函数
图3 OneNET状态事件上报
图4 OneNET FOTA相关事件上报类型
在OneNET状态事件回调函数cot_event_cb里进行状态打印cm_demo_printf("event:%d\n",event),包括登录状态和FOTA状态,以便用户对FOTA进度进行判断处理。
2.3 设置用户注册OneNET FOTA通知事件函数
图5 用户注册OneNET FOTA通知事件
用户注册OneNET FOTA通知事件,FOTA完成后模组会重启,重启后会将FOTA升级成功或失败的状态通知至应用,此操作在驻网之前即会完成,应用层若需接收相关事件通知,需在此接口中调用cm_onenet_event_register()完成回调函数注册,仅用于未连接平台前。连接平台后,cm_onenet_create()被调用后,该注册的函数被cm_onenet_create()注册的函数替换,demo程序采用的此方式,所以demo程序在重新登录平台后才有升级结果上报打印。
以上,就是OneNET FOTA demo示例程序的解析,涉及FOTA以外的OneNET函数接口可在cm_onenet.h查看。
三、OneNET FOTA测试示例
下面我们用MN316 OpenCPU SDK提供的OneNET FOTA函数接口搭配OneNET平台进行测试,整体程序流程与第二节介绍的代码几乎一致,为避免重复我们只解析与第二节存在差异的部分,测试模组选用MN316-DLVS,以下为完整测试步骤。
3.1 编译初始版本
用VScode打开SDK,在文件cm_demo_onenet.c里找到当前的用户SDK版本号,如下:
图6 自定义版本号
默认是“V1.0.0”,输入./build.bat dlvs_h0 demo编译SDK,并使用logview工具合并成烧录文件,为便于区分,修改文件名为V1.0.0.mimgx,再用logview工具烧录到模组。
3.2 编译目标版本并制作差分包
修改用户版本号user_ver为“V2.0.0”,再编译、合并文件,修改烧录文件名为V2.0.0.mimgx,使用logview工具生成差分包,得到xyDelta和xyDelta_downgrade两个差分文件,xyDelta是升级差分包,xyDelta_downgrade是降级差分包(本次只测试升级,不测试降级)。
图7 差分包制作
由于OneNET平台差分包文件类型支持.zip .rar .bin .apk,故我们可以将差分文件改为xyDelta.bin,xyDelta_downgrade.bin。
3.3 在平台上部署差分升级包
图8 选择远程升级OTA
图8 上传差分包文件
点击“验证升级”,“跳过验证”,直接进行FOTA测试。
图9 验证升级
3.4 添加升级任务
模组先执行一次登录OneNET平台,目的是将用户版本号更新到平台上,创建升级任务的时候才能勾选此版本号下面的设备,再点击“批量升级”,在弹出的对话框里添加升级任务。
图10 添加升级任务
图11 勾选需要升级的设备
点击“查看”该任务,可以看到升级任务的详细信息和状态。
图12 升级任务状态
3.5 模组触发FOTA升级
模组主串口输入CM:ONENET:VERSION查询当前版本号,通过执行函数接口cm_onenet_open或者cm_onenet_updata触发FOTA升级。若模组在“已注销登录”状态下,串口发送CM:ONENET:CHECKIN执行登录请求;若模组在“已登录”状态下,串口发送CM:ONENET:UPDATE执行更新请求。
模组检测到升级任务会收到上报event:40,如果模组长时间未收到此上报,可尝试多次发送更新请求指令,正常情况下模组会开始下载差分包然后升级重启,然后发送CM:ONENET:VERSION查询版本号,可以确认是否升级成功。
图13 OneNET FOTA升级前响应结果示例
图14 OneNET FOTA升级后响应结果示例
3.6 平台显示“升级成功”
图15 OneNET平台显示“升级成功”
以上就是使用OneNET平台对模组进行FOTA升级的完整程序流程解析。
四、常见问题
1、平台上添加升级设备时,无当前设备可选,一般是什么原因?
模组需要在升级前确保登录过OneNET平台,才能把当前版本号更新到平台,不然在升级任务的初始版本中无法选中当前设备。
2、模组有时执行cm_onenet_open或者cm_onenet_updata后长时间未打印检测到升级任务的回调,或者升级重启再次登录平台后长时间未打印升级成功的回调,一般是什么原因?
与平台和网络有关,确保网络正常后,建议用户程序逻辑上可以适当延长检测等待时间,并设置多次触发检测。
- 仅支持OneNET平台COAP方式的FOTA升级吗?HTTP方式呢?
目前MN316 OpenCPU SDK版本仅支持OneNET平台COAP方式的FOTA升级,后续版本会开发支持OneNET HTTP方式FOTA升级。