头图

01 引言

在开发、调测过程中,经常通过 Ota 技术升级应用软件、底软。目前,项目上已将 Matrix6 的 Demo 部署在实车上,每次软件、底软需要版本更替或版本升级时,都需要研发测试同学上到车上使用工控机进行手动升级。这流程存在耗费人力多,花费时间长,流程易出错的问题,并且车辆异地时远程操作困难的问题。
基于当前现状,需要基于 Trigger 进程、Boyan Ota 组件、底软 Ota 工具等模块,实现一套 Matrix6 云端 Ota 升级方案,具有云端下发到车辆实现 Ota 的全自动化流程,代替人工升级的方案。

02 全流程方案设计
基于 Trigger 进程、Boyan Ota 组件、底软 Ota 工具等模块的 Matrix6 云端 Ota 升级方案的方案设计图如下。

图片
通过模块、数据链路,Matrix6 云端 Ota 升级方案的流程可以被分解成如下步骤:

  1. 本地/CICD 服务器上构建对应版本的 Ota 升级包。
  2. 上传 Ota 包到云端系统上。
  3. 研发测试同学在云端系统上选择指定车辆,触发云端 Ota 升级。
  4. 车云系统与工控机上的 Trigger 模块交互,将对应的 Ota 升级包下发给 Trigger。
  5. Trigger 模块与板端 Ota manager 模块交互,请求发起 Ota,并将升级包传输到板端。
  6. Ota manager 与板端 SM、EM 模块交互,切换系统状态、关闭上层应用进程。
  7. Ota manger 与 Ota service 模块交互,下发升级包给 Ota service,并同事 Ota service 进行 ota 升级。
  8. Ota service 对升级包进行校验、解压等操作,并使用 LibUpdate.so 动态库进行刷写升级。
  9. Ota service 刷写成功后,通过 Ota manager 通知 SM 模块下电重启域控。
  10. 域控重启后,Ota manager 通过 SM/EM 校验系统是否正常,Ota service 通过 Libupdate.so 动态库校验刷写、引导是否正常。
  11. 校验完成后,Ota manager 与 Trigger 模块通信,通知 Trigger 模块本次 Ota 升级结果。
  12. 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整包

地平线智驾开发者
1 声望2 粉丝

地平线智能驾驶开发者社区旨在连接智能驾驶领域的开发者和对相关技术感兴趣的其他行业开发者、从业者。