征程 6 云端 Ota 升級方案設計與實(shí)現
在開(kāi)發(fā)、調測過(guò)程中,經(jīng)常通過(guò) Ota 技術(shù)升級應用軟件、底軟。目前,項目上已將 Matrix6 的 Demo 部署在實(shí)車(chē)上,每次軟件、底軟需要版本更替或版本升級時(shí),都需要研發(fā)測試同學(xué)上到車(chē)上使用工控機進(jìn)行手動(dòng)升級。
這流程存在耗費人力多,花費時(shí)間長(cháng),流程易出錯的問(wèn)題,并且車(chē)輛異地時(shí)遠程操作困難的問(wèn)題。
基于當前現狀,需要基于 Trigger 進(jìn)程、Boyan Ota 組件、底軟 Ota 工具等模塊,實(shí)現一套 Matrix6 云端 Ota 升級方案,具有云端下發(fā)到車(chē)輛實(shí)現 Ota 的全自動(dòng)化流程,代替人工升級的方案。
基于 Trigger 進(jìn)程、Boyan Ota 組件、底軟 Ota 工具等模塊的 Matrix6 云端 Ota 升級方案的方案設計圖如下。
通過(guò)模塊、數據鏈路,Matrix6 云端 Ota 升級方案的流程可以被分解成如下步驟:
本地/CICD 服務(wù)器上構建對應版本的 Ota 升級包。
上傳 Ota 包到云端系統上。
研發(fā)測試同學(xué)在云端系統上選擇指定車(chē)輛,觸發(fā)云端 Ota 升級。
車(chē)云系統與工控機上的 Trigger 模塊交互,將對應的 Ota 升級包下發(fā)給 Trigger。
Trigger 模塊與板端 Ota manager 模塊交互,請求發(fā)起 Ota,并將升級包傳輸到板端。
Ota manager 與板端 SM、EM 模塊交互,切換系統狀態(tài)、關(guān)閉上層應用進(jìn)程。
Ota manger 與 Ota service 模塊交互,下發(fā)升級包給 Ota service,并同事 Ota service 進(jìn)行 ota 升級。
Ota service 對升級包進(jìn)行校驗、解壓等操作,并使用 LibUpdate.so 動(dòng)態(tài)庫進(jìn)行刷寫(xiě)升級。
Ota service 刷寫(xiě)成功后,通過(guò) Ota manager 通知 SM 模塊下電重啟域控。
域控重啟后,Ota manager 通過(guò) SM/EM 校驗系統是否正常,Ota service 通過(guò) Libupdate.so 動(dòng)態(tài)庫校驗刷寫(xiě)、引導是否正常。
校驗完成后,Ota manager 與 Trigger 模塊通信,通知 Trigger 模塊本次 Ota 升級結果。
Trigger 模塊將本次 Ota 升級結果上傳到云端,研發(fā)測試同學(xué)確認結果。
在方案開(kāi)發(fā)驗證階段,本文聚焦于 征程 6 Ota 包和 征程 6 板端相關(guān)的流程 1 和流程 4~11,使用 ota 測試工具 manager_client_test 程序代替 trigger 模塊,在板端完成開(kāi)發(fā)測試驗證。
制作底軟 Ota 整包用于 ota 升級(應用包等其他包同流程)。底軟 Ota 整包中包括組件:底軟 ota 包 + 簽名文件 + manifest 文件。各組件作用如下:
底軟 ota 包:用于刷寫(xiě)升級底軟;
簽名文件:用于對 Ota 包的校驗,反正 Ota 包損壞或被篡改等;
manifest 文件:用于記錄 Ota 包的相關(guān)升級信息。
組件 a 底軟 ota 包來(lái)源于系統軟件發(fā)布;簽名文件和 manifest 文件需按照 Boyan ota 組件的規則生成。最后將這些組件按照規則壓縮成 zip 包即可。
底軟包來(lái)源于系統軟件發(fā)布,詳情見(jiàn)系統軟件 release note。獲取步驟如下:
判斷 征程 6 域控是 secure/non-secure (國密/國際) 類(lèi)型,判斷指令如下:
[ -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")
根據 國密/國際 類(lèi)型,在 releaser note 文檔 - 發(fā)布鏡像 中下載對應的 OTA 包。
解壓鏡像包,選擇所需要的 ota 包。ota 包目前分為兩種:all_in_one.zip 和 all_in_one_full.zip。
all_in_one.zip:只刷寫(xiě)更新底軟分區,不刷寫(xiě)更新中間件和應用。
all_in_one_full.zip:同時(shí)刷寫(xiě)底軟 + 中間件 + 應用分區。
簽名文件和 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", // 包類(lèi)型
"name": "all_in_one_full.zip", // 包名稱(chēng)
"manifest": ""
}
],
"short_name": "J6A"
}
],
"scripts": []
}
將 ota 包、簽名文件、manifest 文件放到同一目錄下,通過(guò) 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 升級。
Ota 測試工具 manager_client_test 程序代替 trigger 模塊,在板端完成開(kāi)發(fā)測試驗證。操作步驟如下:
上傳 Ota 測試工具 manager_client_test 到板端。
查看/記錄升級前域控的分區面:
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 狀態(tài)變化:
---- 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
輸入 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 狀態(tài)并重啟
---- 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
升級前,處于 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整包
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。