定義
SOME/IP 即 Scalable service-Oriented MiddlewarE over IP,是定義在傳輸層(TCP/UDP)之上的面向服務的中間件,是汽車以太網面向服務的架構 SOA 中的重要內容。
功能
- 序列化
- RPC 遠程調用
- 服務發現 SD
- 發布/訂閱
- UDP 拆包組包
服務
服務是 SOME/IP 的核心,服務端提供服務,客戶端使用服務。服務由零個或多個方法、事件以及字段組成。
方法 Method
客戶端調用服務端的函數/程序/服務/方法。方法有兩種形式:
- Request & Response:常規的客戶端請求,服務端響應
- Fire & Forget(Request_NoReturn):單向客服端請求,服務端不響應
事件 Event
客戶端向服務端訂閱事件組 EventGroup,當事件組有更新時,服務端發布消息,通知所有訂閱的客戶端
字段 Field
方法和事件的組合,提供 Getter/Setter 兩個方法用於獲取/設置字段值,以及一個 Notification 事件,當字段值變化時,服務端發布消息,通知訂閱的客戶端。
消息格式
各字段含義如上圖,其中 Message Type 取值及含義如下表:
Message Type | 報文類型 | 說明 |
---|---|---|
0x00 | REQUEST | 請求,需要回復 |
0x01 | REQUEST_NO_RETURN | 請求,不需要回復 |
0x02 | NOTIFICATION | Notifier/Event,不需要回復 |
0x80 | RESPONSE | 回復 |
0x81 | ERROR | 錯誤 |
服務發現 SOME/IP SD
服務發現主要用於
- 定位服務實例
- 檢測服務實例狀態是否在運行
- 發布/訂閱行為管理
SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。並對 SOME/IP Payload 進行了詳細的定義。
SOME/IP SD 只用 UDP 協議的 30490 端口通信。
SOME/IP SD 的 Payload 中主要包含 Entry 和 Option:
Entry
用於提供服務、發現服務、訂閱事件組。Entry 有服務和 EventGroup 兩種:
服務 Entry
EventGroup Entry
Entry 的類型有
有的類型具有相同的值,這時需要通過 Entry 中的 TTL 字段來區分到底是 Start 還是 Stop,是ACK 還是 NACK。
SOME/IP SD 提供了兩種動態發現服務的機制。一種是 Offer Service(Type = 0x01),由服務端廣播其提供的服務;另一種是 Find Service(Type = 0x00),由客戶端請求可用的服務。
Option
Option 字段用來傳輸 Entry 的附加信息,包括對於服務實例的 IP 地址、傳輸協議、端口號等信息。
例如 Type = 0x04 時
有關 SOME/IP SD 報文格式的詳細解析可以參考 SOME/IP-SD 深入淺出 -熊貓眼老阿姨 一文。