目錄
- 1 摘要
- 2 Method (FF/RR)、Event、Filed介紹
- 2.1. SOME/IP Method 接口
- 2.1.1 **Fire & Forget (FF)** - 單向調用
- 2.1.2 **Request/Response (RR)** - 請求/響應模式
- 2.1.3 **車載ECU通信實現示例**:
- 2.1.4 **通信序列示例**
- 2.1.5 實現注意事項
- 2.2 Event接口
- 2.2.1 **Event接口工作流程**:
- 2.2.2 報文通信示例
- 2.3 some/ip 的 Field(Getter、Setter、Notifier)接口
- 2.3.1 Getter 接口
- 2.3.2 Setter 接口
- 2.3.3 Notifier 接口
- 2.3.4 報文通信示例(車載ECU場景)
- 3 總結
1 摘要
本專題繼續對SOME/IP的通信方式進行介紹,主要有Method、Event以及Field這三類接口的定義、應用場景以及示例進行介紹。
上文回顧:
車載以太網網絡測試 -24【SOME/IP概述】
車載以太網網絡測試 -25【SOME/IP-報文格式-1】
2 Method (FF/RR)、Event、Filed介紹
SOME/IP主要為應用層提供API接口,創建CS接口,通過TCP/IP協議進行通信。而SOME/IP的訪問方式分為三種,分別是事件通知(Event Notification),遠程過程調用(Remote Procedure Call,RPC)和訪問進程數據(Accessing Process Data)。
2.1. SOME/IP Method 接口
SOME/IP (Scalable service-Oriented MiddlewarE over IP) 是一種面向服務的車載通信協議,Method 是 SOME/IP 提供的核心通信模式之一,主要用于實現遠程過程調用 (RPC)。
SOME/IP 支持兩種 Method 調用方式:
- Fire & Forget (FF) - 單向調用
- Request/Response (RR) - 請求/響應模式
2.1.1 Fire & Forget (FF) - 單向調用
Fire&Forget,可以直譯成點火即忘,觸發了但不在乎結果(有點類似診斷服務中的抑制正響應。)
-
客戶端發送請求后不等待響應
-
適用于不需要確認的操作或事件通知
-
特點:
- 單向通信,無響應
- 低延遲,不占用資源等待響應
- 適用于非關鍵性操作或事件通知
- 服務端不保證請求一定被處理
-
典型應用場景:
- 車門解鎖狀態通知
- 環境溫度更新
- 非關鍵診斷信息上報
-
報文示例:
客戶端請求報文:
SOME/IP Header:Message ID: 0x12345678 (ServiceID:MethodID)Length: 0x0000000CClient ID: 0x0010Session ID: 0x0001Protocol Ver: 0x01Interface Ver: 0x02Message Type: 0x01 (REQUEST)Return Code: 0x00 (E_OK)Payload:0x01 0x00 0x00 0x00 // 布爾值 true (車門解鎖)
2.1.2 Request/Response (RR) - 請求/響應模式
-
客戶端發送請求并等待服務端響應
-
適用于需要獲取返回值的操作
-
特點:
- 雙向通信,有請求和響應
- 客戶端等待服務端處理并返回結果
- 適用于需要確認或獲取數據的操作
- 支持同步和異步調用模式
-
典型應用場景:
- 讀取ECU版本信息
- 設置車輛配置參數
- 執行診斷命令
-
報文示例:
客戶端請求報文:
SOME/IP Header:Message ID: 0x12345678 (ServiceID:MethodID)Length: 0x0000000CClient ID: 0x0020Session ID: 0x0002Protocol Ver: 0x01Interface Ver: 0x02Message Type: 0x01 (REQUEST)Return Code: 0x00 (E_OK)Payload:0x00 0x00 0x00 0x00 // 無參數請求
服務端響應報文:
SOME/IP Header:Message ID: 0x12345678 (ServiceID:MethodID)Length: 0x0000000CClient ID: 0x0020Session ID: 0x0002Protocol Ver: 0x01Interface Ver: 0x02Message Type: 0x02 (RESPONSE)Return Code: 0x00 (E_OK)Payload:0x01 0x02 0x03 0x04 // ECU版本號 1.2.3.4
2.1.3 車載ECU通信實現示例:
- 車門狀態控制服務 (混合使用FF和RR)
服務定義 (ARXML):
<METHODS><METHOD NAME="SetDoorLock" ID="1" TYPE="FIRE_AND_FORGET"><ARGUMENTS><ARGUMENT NAME="doorState" TYPE="BOOLEAN"/></ARGUMENTS></METHOD><METHOD NAME="GetDoorStatus" ID="2" TYPE="REQUEST_RESPONSE"><ARGUMENTS><ARGUMENT NAME="doorID" TYPE="UINT8"/></ARGUMENTS><RETURN-ARGUMENT TYPE="BOOLEAN"/></METHOD>
</METHODS>
2.1.4 通信序列示例
-
設置車門狀態 (FF)
- 客戶端發送:
MessageID: 0x1001 (ServiceID=0x10, MethodID=0x01) Payload: 0x01 (true - 解鎖)
- 服務端接收但不響應
- 客戶端發送:
-
獲取車門狀態 (RR)
- 客戶端發送:
MessageID: 0x1002 (ServiceID=0x10, MethodID=0x02) Payload: 0x01 (查詢左前門)
- 服務端響應:
MessageID: 0x1002 Payload: 0x01 (門已解鎖)
- 客戶端發送:
2.1.5 實現注意事項
- 超時處理:RR方法需要設置合理的超時時間
- 會話管理:Session ID用于匹配請求和響應
- 錯誤處理:正確處理Return Code (如 E_NOT_OK, E_NOT_READY等)
- 序列化:確保payload按照定義的數據類型正確序列化
- 服務質量:根據應用需求配置TP協議或設置QoS參數
2.2 Event接口
Event接口是AUTOSAR SOME/IP (Scalable service-Oriented MiddlewarE over IP)協議中的一種重要通信機制,主要用于實現事件通知功能。在車載ECU通信中,Event接口允許服務提供者(Provider)主動向訂閱者(Subscriber)發送事件通知,而不需要訂閱者主動請求。
- 主要特點:
- 發布/訂閱模式:基于訂閱機制,只有訂閱了特定事件的ECU才會收到通知
- 實時性:適用于需要實時通知的場景,如傳感器數據更新、狀態變化等
- 可靠性:支持可靠和不可靠兩種傳輸模式
- 多播支持:可以通過IP多播實現一對多通信
2.2.1 Event接口工作流程:
- 訂閱階段:客戶端ECU向服務端ECU發送訂閱請求
- 確認階段:服務端確認訂閱(對于可靠Event)
- 通知階段:當事件發生時,服務端主動發送事件數據
- 取消訂閱:客戶端可以主動取消訂閱
在SOME/IP中,定義了三種通知發送的策略: - Cyclic update周期發送,以一定的周期發送通知。
- Update on change變化后發送,當該事件發生變化時,進行發送。
- Epsilon change變化超過閾值發送,當較上一次的變化超過預先設置的閾值時,進行發送。
2.2.2 報文通信示例
- 訂閱請求 (Subscribe Eventgroup)
[客戶端 -> 服務端]
SOME/IP Header:Message ID: 0x12345678 (Service ID: 0x1234, Method ID: 0x5678)Length: 0x00000010Request ID: 0x00010001Protocol Version: 0x01Interface Version: 0x01Message Type: 0x02 (REQUEST)Return Code: 0x00 (E_OK)Payload:Eventgroup ID: 0x0001Subscribe/Unsubscribe Flag: 0x01 (Subscribe)Options:- Endpoint Option (IP: 192.168.1.100, Port: 30500)
- 訂閱確認 (Subscribe Eventgroup Ack)
[服務端 -> 客戶端]
SOME/IP Header:Message ID: 0x12345678 Length: 0x00000010Request ID: 0x00010001Protocol Version: 0x01Interface Version: 0x01Message Type: 0x03 (RESPONSE)Return Code: 0x00 (E_OK)Payload:Eventgroup ID: 0x0001Subscribe/Unsubscribe Flag: 0x01 (Subscribe)Options:- Endpoint Option (IP: 192.168.1.200, Port: 30501)
- 事件通知 (Event Notification)
[服務端 -> 客戶端]
SOME/IP Header:Message ID: 0x12340001 (Service ID: 0x1234, Event ID: 0x0001)Length: 0x0000000CRequest ID: 0x00000000 (Notification不需要響應)Protocol Version: 0x01Interface Version: 0x01Message Type: 0x02 (NOTIFICATION)Return Code: 0x00 (E_OK)Payload:Event Data: [具體事件數據,如傳感器值、狀態標志等]例如: 0x00000042 (表示溫度值66)
- 取消訂閱 (Unsubscribe Eventgroup)
[客戶端 -> 服務端]
SOME/IP Header:Message ID: 0x12345678Length: 0x00000010Request ID: 0x00010002Protocol Version: 0x01Interface Version: 0x01Message Type: 0x02 (REQUEST)Return Code: 0x00 (E_OK)Payload:Eventgroup ID: 0x0001Subscribe/Unsubscribe Flag: 0x00 (Unsubscribe)Options:- Endpoint Option (IP: 192.168.1.100, Port: 30500)
- 車載ECU典型應用場景:
- 傳感器數據更新:如車速、發動機轉速、溫度等
- 狀態變化通知:如車門開關狀態、燈光狀態
- 故障報警:如電池電壓過低、發動機故障
- ADAS系統:如碰撞預警、車道偏離警告
2.3 some/ip 的 Field(Getter、Setter、Notifier)接口
在 SOME/IP (Scalable service-Oriented MiddlewarE over IP) 中,Field 是一種特殊類型的接口元素,它結合了 Getter、Setter 和 Notifier 功能,為車載ECU之間的通信提供了靈活的數據訪問機制。
- Field 的三種操作模式:
- Getter:客戶端可以請求讀取Field的當前值
- Setter:客戶端可以請求修改Field的值
- Notifier:服務器可以在Field值變化時主動通知客戶端
在Getter與Setter的方式中我們使用的Request/Response機制。在Getter的請求報文中是一個空的Payload,響應報文中的Payload才是需要獲取的值;使用Setter請求時,請求消息中的Payload則是要設置的值,如果設置成功,那么響應報文中Payload就是設定成功的值。
2.3.1 Getter 接口
通過Request/Response的方式來實現,Request中為空,不攜帶數據,Response返回Field的值。
功能:允許客戶端查詢Field的當前值
特點:
- 同步請求/響應模式
- 客戶端發起請求,服務器返回當前值
- 適用于不頻繁變化的或需要精確時刻值的場景
2.3.2 Setter 接口
通過Request/Response的方式來實現,Request攜帶想要將Field設置的值,Response返回Field設置好的值。
功能:允許客戶端修改Field的值
特點:
- 同步請求/響應模式
- 客戶端發送新值,服務器確認修改
- 可能包含權限驗證和有效性檢查
2.3.3 Notifier 接口
通過Event的方式來實現,發送策略與Event一致,不同的是當第一次訂閱成功后,Server會主動發送一次Notifier,攜帶當前Field的值,即訂閱成功后,Client可以立刻獲得Field的初始值,而不用等待事件觸發。
功能:服務器主動通知客戶端Field值的變化
特點:
- 異步通信模式
- 基于訂閱機制(客戶端需先訂閱)
- 適用于頻繁變化或需要實時更新的數據
- 可配置通知條件(如變化閾值、最小間隔等)
2.3.4 報文通信示例(車載ECU場景)
- 場景描述:
假設我們有一個車速Field(VehicleSpeed)在儀表盤ECU(客戶端)和車輛控制ECU(服務器)之間通信。
-
通信序列示例:
-
Getter 請求/響應:
-
客戶端請求 (儀表盤ECU → 車輛控制ECU)
SOME/IP Message: - Message Type: Request (0x00) - Request ID: 0x1234 - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0001 (GetVehicleSpeed) - Payload: Empty
-
服務器響應 (車輛控制ECU → 儀表盤ECU)
SOME/IP Message: - Message Type: Response (0x80) - Request ID: 0x1234 - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0001 (GetVehicleSpeed) - Payload: 60 (km/h, uint16)
- Setter 請求/響應
-
客戶端請求設置值 (診斷工具 → 車輛控制ECU)
SOME/IP Message: - Message Type: Request (0x00) - Request ID: 0x5678 - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0002 (SetVehicleSpeed) - Payload: 100 (km/h, uint16)
-
服務器響應 (車輛控制ECU → 診斷工具)
SOME/IP Message: - Message Type: Response (0x80) - Request ID: 0x5678 - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0002 (SetVehicleSpeed) - Payload: 0x00 (Success status)
- Notifier 訂閱與通知
-
客戶端訂閱 (儀表盤ECU → 車輛控制ECU)
SOME/IP Message: - Message Type: Request (0x00) - Request ID: 0x9ABC - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x8001 (SubscribeVehicleSpeed) - Payload: - EventGroup: 0x0001- TTL: 0xFFFFFFFF (永久訂閱)
-
服務器確認訂閱 (車輛控制ECU → 儀表盤ECU)
SOME/IP Message: - Message Type: Response (0x80) - Request ID: 0x9ABC - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x8001 (SubscribeVehicleSpeed) - Payload: 0x00 (Success status)
-
服務器通知變化 (車輛控制ECU → 儀表盤ECU)
SOME/IP Message: - Message Type: Notification (0x02) - Request ID: 0x0000 (無意義) - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0003 (VehicleSpeedEvent) - Payload: 65 (km/h, uint16)
- 典型車載應用場景
-
車輛狀態監控:
- 車速、轉速、油量等實時數據顯示
-
配置參數調整:
- 駕駛模式設置、懸架硬度調整
-
診斷接口:
- 讀取/寫入診斷參數
-
ADAS系統:
- 傳感器數據共享和協調
Field接口的靈活組合使得SOME/IP非常適合車載ECU之間復雜的數據交換需求,能夠滿足從簡單狀態讀取到實時數據流傳輸的各種場景。
3 總結
上文對SOME/IP協議的Method、Event以及Field這三類接口的定義、應用場景以及示例進行了介紹。希望能對大家學習車載以太網SOME/IP通信有所幫助!