01 引言
在开发、调测过程中,经常通过 Ota 技术升级应用软件、底软。目前,项目上已将 Matrix6 的 Demo 部署在实车上,每次软件、底软需要版本更替或版本升级时,都需要研发测试同学上到车上使用工控机进行手动升级。这流程存在耗费人力多,花费时间长,流程易出错的问题,并且车辆异地时远程操作困难的问题。
基于当前现状,需要基于 Trigger 进程、Boyan Ota 组件、底软 Ota 工具等模块,实现一套 Matrix6 云端 Ota 升级方案,具有云端下发到车辆实现 Ota 的全自动化流程,代替人工升级的方案。
02 全流程方案设计
基于 Trigger 进程、Boyan Ota 组件、底软 Ota 工具等模块的 Matrix6 云端 Ota 升级方案的方案设计图如下。
通过模块、数据链路,Matrix6 云端 Ota 升级方案的流程可以被分解成如下步骤:
- 本地/CICD 服务器上构建对应版本的 Ota 升级包。
- 上传 Ota 包到云端系统上。
- 研发测试同学在云端系统上选择指定车辆,触发云端 Ota 升级。
- 车云系统与工控机上的 Trigger 模块交互,将对应的 Ota 升级包下发给 Trigger。
- Trigger 模块与板端 Ota manager 模块交互,请求发起 Ota,并将升级包传输到板端。
- Ota manager 与板端 SM、EM 模块交互,切换系统状态、关闭上层应用进程。
- Ota manger 与 Ota service 模块交互,下发升级包给 Ota service,并同事 Ota service 进行 ota 升级。
- Ota service 对升级包进行校验、解压等操作,并使用 LibUpdate.so 动态库进行刷写升级。
- Ota service 刷写成功后,通过 Ota manager 通知 SM 模块下电重启域控。
- 域控重启后,Ota manager 通过 SM/EM 校验系统是否正常,Ota service 通过 Libupdate.so 动态库校验刷写、引导是否正常。
- 校验完成后,Ota manager 与 Trigger 模块通信,通知 Trigger 模块本次 Ota 升级结果。
- Trigger 模块将本次 Ota 升级结果上传到云端,研发测试同学确认结果。
在方案开发验证阶段,本文聚焦于 征程 6 Ota 包和 征程 6 板端相关的流程 1 和流程 4~11,使用 ota 测试工具 manager_client_test 程序代替 trigger 模块,在板端完成开发测试验证。
03 构建 Ota 整包
制作底软 Ota 整包用于 ota 升级(应用包等其他包同流程)。底软 Ota 整包中包括组件:底软 ota 包 + 签名文件 + manifest 文件。各组件作用如下:
- 底软 ota 包:用于刷写升级底软;
- 签名文件:用于对 Ota 包的校验,反正 Ota 包损坏或被篡改等;
- manifest 文件:用于记录 Ota 包的相关升级信息。
组件 a 底软 ota 包来源于系统软件发布;签名文件和 manifest 文件需按照 Boyan ota 组件的规则生成。最后将这些组件按照规则压缩成 zip 包即可。
3.1 获取底软 Ota 包
底软包来源于系统软件发布,详情见系统软件 release note。获取步骤如下:
1.判断 征程 6 域控是 secure/non-secure (国密/国际) 类型,判断指令如下:
[ -n "$(cat /proc/version_hsm)" ] && echo "secure" || echo "non-secure"; [ -n "$(hexdump -C /dev/block/platform/by-name/HSM_FW -n 1 | grep ad)" ] && echo "国密oscca" || ([ -n "$(hexdump -C /dev/block/platform/by-name/HSM_FW -n 4 | grep 'ed 44 47 14')" ] && echo "国际fips") || ([ -n "$(provision_tool --get-lifecycle | grep LIFECYCLE_OHP)" ] && echo "国际fips ohp")
2.根据 国密/国际 类型,在 releaser note 文档 - 发布镜像 中下载对应的 OTA 包。
3.解压镜像包,选择所需要的 ota 包。ota 包目前分为两种:all_in_one.zip 和 all_in_one_full.zip。
- all_in_one.zip:只刷写更新底软分区,不刷写更新中间件和应用
- all_in_one_full.zip:同时刷写底软 + 中间件 + 应用分区。
3.2 制作签名/manifest 文件
签名文件和 manifest 文件模板如下:
- 签名文件模板:
{
"all_in_one_full.zip": "0a12ee6d7c9028c0c50ec4c188acb43b", // 底软ota包名:md5
"vehicle_manifest.json": "9d2075ebc9fcbfaac83d9c67c10e407d" // manifest文件名:md5
}
- manifest文件模板:
{
"priority": [
"J6A"
],
"ota_services": [
{
"packages": [
{
"version": "V1.0.0", // 版本号
"type": "system", // 包类型
"name": "all_in_one_full.zip", // 包名称
"manifest": ""
}
],
"short_name": "J6A"
}
],
"scripts": []
}
3.3 制作 Ota 整包
将 ota 包、签名文件、manifest 文件放到同一目录下,通过 zip 压缩获取压缩包(保证解压后 all_in_one 目录下就有 ota 包等文件)。操作命令如下:
mkdir all_in_one
mv src/all_in_one.zip all_in_one/
mv src/signature.json all_in_one/
mv src/vehicle_manifest.json all_in_one/
cd all_in_one
zip ../all_in_one.zip ./*
制作好的 all_in_one.zip 整包就可以用于 ota 升级。
04 Ota 升级测试
4.1 升级测试操作步骤
Ota 测试工具 manager_client_test 程序代替 trigger 模块,在板端完成开发测试验证。操作步骤如下:
1.上传 Ota 测试工具 manager_client_test 到板端。
2.查看/记录升级前域控的分区面:
ota_tool -g
3.运行模拟测试工具,按照如下步骤操作;
4.输入 c,选取本机 IP 地址:
enter num to choose ip:port
a: 10.97.109.229:10292
10.97.109.229:10290
b: 10.97.109.229:10292
10.97.109.229:10290
c: 127.0.0.1:10292
127.0.0.1:10290
d: you choose enter ip:port manually!
>> c
5.输入 5,订阅 ota 状态变化:
---- cmd list ----
1: Get upgrade info
2: Cancel
3: Prepared upgrade
4: TransferFile
5: Subscribe manager state change
6: UnSubscribe manager state change
7: GetSwClusterInfo
8: Subscribe manager error code
9: UnSubscribe manager error code
10: Get all services's history
11: shake hands to manager
Enter cmd:
>> 5
6.输入 3,准备 ota 升级
---- cmd list ----
1: Get upgrade info
2: Cancel
3: Prepared upgrade
4: TransferFile
5: Subscribe manager state change
6: UnSubscribe manager state change
7: GetSwClusterInfo
8: Subscribe manager error code
9: UnSubscribe manager error code
10: Get all services's history
11: shake hands to manager
Enter cmd:
>> 3
7.输入 4,传输文件,并输入 ota 包的绝对路径:
---- cmd list ----
1: Get upgrade info
2: Cancel
3: Prepared upgrade
4: TransferFile
5: Subscribe manager state change
6: UnSubscribe manager state change
7: GetSwClusterInfo
8: Subscribe manager error code
9: UnSubscribe manager error code
10: Get all services's history
11: shake hands to manager
Enter cmd:
>> 4
enter file path:
>> /map/all_in_one.zip
8.等待 ota 升级到 restart_prepared 状态并重启
---- cmd list ----
1: Get upgrade info
2: Cancel
3: Prepared upgrade
4: TransferFile
5: Subscribe manager state change
6: UnSubscribe manager state change
7: GetSwClusterInfo
8: Subscribe manager error code
9: UnSubscribe manager error code
10: Get all services's history
11: shake hands to manager
Enter cmd:
recv manager state change to :transferring
[I][1896-1918][01-01][08:03:22:096][OTAM][manager_client_test][ota_manager_client_impl.cpp:196] current state is transferring
recv manager state change to :processing
[I][1896-1918][01-01][08:03:24:399][OTAM][manager_client_test][ota_manager_client_impl.cpp:196] current state is processing
recv manager state change to :restart_preparing
[I][1896-1918][01-01][08:05:04:716][OTAM][manager_client_test][ota_manager_client_impl.cpp:196] current state is restart_preparing
recv manager state change to :restart_prepared
[I][1896-1918][01-01][08:05:07:823][OTAM][manager_client_test][ota_manager_client_impl.cpp:196] current state is restart_prepared
9.查看 Ota_manager 的日志,确认是否验证-激活 成功
10.查看/记录升级后域控的分区面:
ota_tool -g
4.2 升级测试操作结果
1.升级前,处于 B 面:
root@hobot:~# ota_tool -g
[OTA_INFO][hobot_ota_hl.c:471] current slot is:B
2.Ota_manager 日志:
[I][1568-1850][01-01][09:07:33:638323][ota_service][OTAS][upgrade.cpp:262] get progress:85
[I][1568-1850][01-01][09:07:33:638343][ota_service][OTAS][upgrade.cpp:319] get result success,result:1
[I][1568-1850][01-01][09:07:43:638439][ota_service][OTAS][upgrade.cpp:262] get progress:85
[I][1568-1850][01-01][09:07:43:638466][ota_service][OTAS][upgrade.cpp:319] get result success,result:1
[I][1568-1850][01-01][09:07:53:648403][ota_service][OTAS][upgrade.cpp:262] get progress:100
[I][1568-1850][01-01][09:07:53:648427][ota_service][OTAS][service_state_delegate.cpp:343] Upgrade success
3.升级后,处于 A 面:
root@hobot:~# ota_tool -g
[OTA_INFO][hobot_ota_hl.c:468] current slot is:A3. 构建Ota整包
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。