技術團隊

SOME/IP 如何實現 SOA (服務導向架構)

SOME/IP 如何實現 SOA (服務導向架構)

什麼是 SOA?

服務導向架構 (Service-Oriented Architecture, SOA) 是一種軟體設計模式,將功能封裝為獨立的 “服務” (Services)。服務提供者 (Server) 發布服務,服務消費者 (Client) 訂閱或請求服務。這種鬆散耦合 (Loosely Coupled) 的架構使得車輛軟體更易於升級與擴展。

SOME/IP 的角色

SOME/IP (Scalable service-Oriented MiddlewarE over IP) 是專為汽車領域設計的通訊中間件協定。它運行在 TCP/UDP 之上,提供了實現 SOA 所需的關鍵機制:

  1. 服務發現 (Service Discovery, SD): 動態地尋找網路上可用的服務實例 (Instance)。
  2. 遠端程序呼叫 (RPC): Client 可以像呼叫本地函數一樣,呼叫 Server 端的函數 (Method)。
  3. 事件訂閱 (Event Subscription): Client 可以訂閱感測器資料或狀態變化,Server 僅在資料更新時發送通知 (Publish/Subscribe)。

實作 SOA 的關鍵步驟

1. 服務介面定義

使用 IDL (Interface Definition Language) 或 ARXML (AUTOSAR XML) 定義服務介面。例如,定義一個 RadarService,包含:

  • Method: getObjectList()
  • Event: onCollisionWarning
  • Field: sensorStatus (包含 Getter/Setter/Notifier)

2. 序列化 (Serialization)

SOME/IP 定義了高效的二進位序列化格式。不同於 JSON 或 XML,SOME/IP 的 Payload 緊湊且解析速度快,適合嵌入式系統。

3. 通訊流程

  1. Offer Service: Server 啟動後,透過 Multicast 發送 Offer Service 訊息。
  2. Find Service: Client 啟動後,發送 Find Service 訊息尋找目標服務。
  3. Subscribe Eventgroup: Client 找到服務後,訂閱感興趣的事件群組。
  4. Subscribe Ack: Server 確認訂閱,開始發送事件資料。

工具與實戰

Vector 工具鏈

  • PREEvision:用於設計 SOA 架構與服務介面。
  • CANoe Option .Ethernet:模擬 SOME/IP 節點,監控服務發現過程與 RPC 呼叫。CANoe 另提供 Communication Setup 介面配置 SOA 通訊系統,內建 Model Editor 可用圖形介面編輯資料模型與自訂通訊物件,也可用 vCDL 程式化描述通訊模型,再以 CAPL/C#/Python 實現 SOA 系統的模擬與測試。
  • AUTOSAR Adaptive 的設定:Adaptive 平台的 SOME/IP 綁定由 Vector 的 Adaptive 工具鏈負責;具體工具與版本組合請洽歐特莫夫確認,因為 Adaptive 側的工具名稱與分工變動較快。
  • 量測與標定:CANape 可透過 SOME/IP、DDS、DLT、CMP 對 AUTOSAR Adaptive 的 ECU 進行測量與標定,不必回到訊號層。

SOME/IP 不是唯一選擇:DDS

SOA 的中間件並非只有 SOME/IP。DDS(Data Distribution Service)在需要細緻服務品質控制的場合更常見,CANoe 也提供 DDS 支援:涵蓋 OMG 標準定義的所有 QoS 設定、複雜的主題資料型別(結構體、聯合、嵌套陣列、可選成員),並支援 DDS RPC 擴充安全擴充;通訊模型同樣可用 vCDL 定義,並附 DDS/ROS IDL 轉 vCDL 的轉換腳本。選 SOME/IP 還是 DDS,取決於您的架構要求與供應鏈生態。

開源實作:vsomeip

vsomeip 是由 GENIVI (現 COVESA) 維護的開源 SOME/IP 協定堆疊 (C++)。它廣泛應用於 Linux 平台的車載應用開發。

// vsomeip 範例:發送請求
std::shared_ptr<vsomeip::application> app = vsomeip::runtime::get()->create_application("Client");
app->init();
app->request_service(service_id, instance_id);
app->send(request_message);

透過 SOME/IP,車輛軟體不再是靜態的訊號交換,而是動態的服務協作,這為自動駕駛與聯網服務奠定了堅實的基礎。