本系列學習筆記基於 AUTOSAR Adaptive Platform 官方文檔 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf。作者 Zijian/TENG,原文地址(獲取最新更新):https://www.cnblogs.com/tengzijian/p/15112262.html
縮寫
- CM:Communication Management
- SOME/IP:Scalable service-Oriented MiddlewarE over IP
- DDS:Data Distribution Service
- IPC:Inter-Process Communication
- PDU:Protocol Data Unit
- SOA:Service Oriented Architecture
- AP:AUTOSAR Adaptive Platform
7 通信管理
7.1 概述
CM 負責分布式、實時、嵌入式環境下的應用間通信。CM 從實現中抽象出一套發現、連接通信對象的機制。這樣應用開發者就能專注於應用軟件本身的業務邏輯。
7.2 面向服務通信
Service 即提供給應用的、基礎軟件之外的功能。CM 提供了 Service 消費者/提供者的機制,支持機器內和跨機器通信。
服務由事件Event
、方法Methods
、字段Fields
的組合構成。通信各方的通信路徑可以在設計、啟動或者運行時建立。Service Registry 是 CM 軟件中的一個重要組件,起到中間人的作用。
每個提供服務的應用向 Service Registry 注冊服務。服務的客戶端應用先向 Service Registry 查找(find)服務,這一過程叫做服務發現(Service Discovery)。
7.3 語言綁定和網絡綁定
CM 標准化了:
- 服務如何呈現給應用實現者(上層,語言綁定)
- 服務數據如何在網絡中表示(下層,網絡綁定)
以上兩點保證了源碼的可移植性和已編譯的服務在不同平台實現的兼容性。
語言綁定定義了:如何將服務的 methods,events,fields 翻譯成目標語言中可直接訪問的標識符。性能和類型安全(只要目標語言支持)是首要目標。因此,語言綁定一般實現為以服務接口定義為輸入的代碼生成器。
類型安全:編譯時驗證類型
網絡綁定定義了:服務數據如何序列化以及如何綁定到特定網絡。可以實現為基於 CM 的配置(AUTOSAR 元模型接口定義)實現:或通過解釋(生成的)服務 recipe,或直接生成序列化代碼。
目前 CM 支持 SOME/IP,DDS,IPC 以及 Signal PDU(基於信號的網絡綁定)。
本地 Service Registry 也是網絡綁定的一部分。
注意:語言綁定和網絡綁定之間的接口應當視為 CM 內部的 private
接口。盡管如此,平台供應商應當盡量為其軟件定義獨立的接口,以便在平台內實現除 C++ 之外的語言綁定。
7.4 C++ 語言綁定 Proxies 和 Skeletons 代碼生成
C++ 語言綁定的上層接口提供了(定義在AUTOSAR 元模型接口描述中的)服務的面向對象映射。生成器是部署工具的一部分,用於為 CM 生成包含各個 Service 的 fields、events 和 methods 的類型安全表示的 C++ 類。
在服務實現側,生成的類叫 Service Provider Skeletons;在客戶端側,叫 Service Requester Proxies。對於服務方法,服務請求代理提供同步(調用者阻塞,直到 Server 返回結果)和異步(被調函數立即返回)調用機制。調用者可以並行執行其他任務,當服務端返回結果時,通過 Core Type 的 ara::core::future
接收結果。平台可以配置生成器生成 mockup 類,當服務尚未開發完成時,便於開發客戶端功能,也可用於客戶端的單元測試。
客戶端可以直接使用代理類,而 Service Provider Skeletons 只是抽象基類,服務實現需要繼承自生成的抽象基類,實現相應的功能。
ara::com 接口可以為 proxies 和 skeletons 提供安全相關、受 E2E 保護的通信。這些接口旨在確保與應用程序的兼容性,無論是否開啟 E2E 保護。
7.5 靜態、動態配置
通信路徑的配置可能發生在設計、啟動或者運行時。因此配置可以是靜態或者動態的:
- 全靜態配置
完全不需要服務發現,服務端知道所有的客戶端,客戶端也知道服務端。 - 客戶應用無需發現
客戶端知道服務端,但服務端不知道客戶端。應用中唯一的動態通信方式就是事件訂閱。 - 全服務發現
配置時不知道通信路徑。服務發現 API 允許應用代碼在運行時選擇服務實例。
7.6 服務合同版本控制
SOA(Service Oriented Architecture)環境下,服務的客戶端和提供端依賴覆蓋服務接口和行為的合同。服務開發過程中,服務的接口和行為會改變。因此,引入服務合同版本控制來區分不同版本的服務。AP 支持設計、部署階段的服務合同版本控制。不僅如此,客戶端的服務發現可配置為向后兼容,即如果服務版本向后兼容客戶端請求的服務版本,客戶端可以連接到一個不同於其請求版本的服務。
7.7 原始數據流接口
除了面向服務的通信,CM 還提供了用於處理外部 ECU(如 ADAS 系統中的傳感器)原始二進制數據流的獨立、靜態 API。
- 為客戶端應用實現了:建立到服務端的通信通道的功能
- 為服務端應用實現了:等待客戶端連接的功能
- 為客戶端和服務端提供了:銷毀通信通道以及通過通道讀寫原始數據流的功能
原始數據流通道可以由集成配置其部署信息,包括網絡端點信息、協議等。目前傳輸層使用 TCP/IP 套接字,但今后可能增加其他替代方式。原始數據流接口定義在 ara::com::raw
命名空間中。