博客專欄

        EEPW首頁 > 博客 > 征程 6 云端 Ota 升級方案設計與實現

        征程 6 云端 Ota 升級方案設計與實現

        發布人:地平線開發者 時間:2024-12-19 來源:工程師 發布文章
        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")


        1. 根據 國密/國際 類型,在 releaser note 文檔 - 發布鏡像 中下載對應的 OTA 包。

        1. 解壓鏡像包,選擇所需要的 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.運行模擬測試工具,按照如下步驟操作;

        1. 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
        1. 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
        1. 輸入 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整包


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。




        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 进贤县| 望都县| 思南县| 西吉县| 岐山县| 长寿区| 囊谦县| 黄梅县| 会东县| 澄江县| 定结县| 潜山县| 贞丰县| 左贡县| 昌江| 景泰县| 双江| 于田县| 桃园县| 牟定县| 郴州市| 年辖:市辖区| 乐东| 客服| 疏勒县| 郓城县| 乌兰察布市| 左云县| 若尔盖县| 苏州市| 南充市| 恭城| 扬州市| 湛江市| 华阴市| 昌平区| 永泰县| 宜阳县| 芦山县| 大竹县| 白玉县|