1 摘要
本專題接著上一專題對SOME/IP進行介紹,主要對SOME/IP報文格式以及定義的字段進行詳細介紹,有助于在實際項目過程中對SOME/IP報文的理解。
上文回顧:
車載以太網網絡測試 -24【SOME/IP概述】
2 SOME/IP-報文格式
通過上個專題介紹,SOME/IP是一個通信中間件,位于傳輸層之上,因此SOME/IP的數據封裝在傳輸層頭部的后面。如下圖所示,SOME/IP也有幀頭部分。
SOME/IP報頭的總長度為16個字節,共有9個字段。
各字段說明:
2.1 Service ID / 16 bits
服務標識,Service ID 是一個核心標識符,用于唯一標識車載網絡或分布式系統中的服務(Service)。
唯一標識服務
Service ID 是一個16位的無符號整數(0x0000~0xFFFF),用于在系統中唯一區分不同的服務。例如:
- 0x1234 可能代表“車速服務”,
- 0x5678 可能代表“電池管理服務”。
通過Service ID,客戶端和服務端可以明確識別通信的目標服務,避免混淆。
2.2 Method ID / Event ID / 16 bits
Method ID 和 Event ID 是用于標識服務通信中不同操作和事件的關鍵標識符。
- Method ID(方法標識符)
作用:唯一標識服務接口中的可調用方法(遠程過程調用,RPC)。
功能:- 客戶端通過發送包含
Method ID
的請求報文,調用服務端的特定方法。 - 服務端根據
Method ID
確定需要執行的方法,并返回響應(如方法返回值或狀態)。
示例場景: - 車輛ECU提供“獲取車速”服務,客戶端通過
Method ID = 0x1234
調用該方法,服務端返回當前車速值。
- 客戶端通過發送包含
- Event ID(事件標識符)
作用:唯一標識服務接口中的事件(由服務端主動通知客戶端的數據)。
功能:- 服務端通過
Event ID
標記特定事件(如傳感器數據變化、狀態更新)。 - 客戶端訂閱(Subscribe)指定
Event ID
后,服務端會在事件觸發時推送通知(Notification)。
示例場景: - 車載溫度傳感器服務通過
Event ID = 0x5678
定期發布溫度數據,客戶端訂閱后即可接收實時更新。
- 服務端通過
說明:
這個字段的第一個bit是標志位,如果標志位為0,表示后面15位為Method ID(Method、Field.Getter及Field.Setter);如果標志位為1,表示后面15位為Event ID(包括Event和Field.Notify)
Method/Event ID部分:
若最高位=0(ID < 0x8000)→ Method ID
若最高位=1(ID ≥ 0x8000)→ Event ID
因此,Method和Event可以從該字段的值來區分:
- Method ID的范圍為0x0000 ~ 0x7FFF
- Event ID的范圍為0x8000 ~ 0xFFFF。
Method和Event為SOME/IP的兩種通信方式,后面專題介紹。
Service ID和Method ID/Event ID兩個字段可以組成Message ID,每個Message ID在車內網絡都是唯一的,可以用來標識某個服務的某個接口。
2.3 Length / 32 bits
-
位置:位于SOME/IP Header的第5-8字節(即從第4字節開始,前4字節為Message ID和Length字段本身)。
-
數據類型:32位無符號整數(大端序,Big-endian)。
-
單位:字節(Byte)。
-
計算范圍:從
Client ID
字段開始到整個報文結束(包括Payload)的總字節數。
服務 ID(Service ID) 和 方法/事件 ID(Method/Event ID) 屬于 SOME/IP 報文頭 的一部分,位于 Length 字段之前,因此不被計入 Length。 -
作用:
- 報文邊界識別:接收方通過Length字段確定報文的結束位置,尤其在TCP等流式傳輸中區分多個連續的SOME/IP報文。
- 完整性校驗:驗證接收到的數據是否完整(實際接收的字節數是否與Length字段匹配)。
- 協議解析:幫助解析器正確分離Header和Payload部分
2.4 Client ID / 16 bits
Client ID是一個用于標識客戶端實例的唯一標識符,服務器可通過該字段區分不同的客戶端,在多個客戶端同時請求或使用同一個服務器中的同一個服務時可使用。Client ID也可以設置為車內網絡唯一的,這樣可以直接用于標識出具體的節點。它是一個16位的字段。
-
Client ID的作用
Client ID在SOME/IP通信中扮演著重要角色:- 服務實例識別:幫助服務端識別和區分不同的客戶端實例
- 會話管理:在請求-響應交互中維護客戶端與服務端之間的會話狀態
- 消息路由:確保響應能夠正確返回到發起請求的客戶端
- 負載均衡:在多個服務實例場景下,幫助實現請求的合理分配
- 狀態跟蹤:服務端可以跟蹤不同客戶端的狀態和生命周期
-
分配方式:
- 可以由客戶端自行生成(需確保唯一性)
- 可以由中間件或服務端分配
- 通常采用遞增或隨機方式生成
-
應用場景:
- 服務發現:在服務發現過程中,客戶端使用Client ID標識自己
- 方法調用:在RPC調用中標識調用方
- 事件訂閱:標識事件訂閱的客戶端
- 錯誤處理:幫助定位問題發生的客戶端
Client ID是SOME/IP實現多客戶端并發訪問同一服務的基礎機制之一,確保了服務端能夠正確處理來自不同客戶端的并行請求。
2.5 Session ID / 16 bits
會話標識,可以用來區分來自同一發送者的多條請求,表示請求或消息的順序。如果使用,應在每次調用后遞增,其范圍為0x0001到0xFFFF,當達到0xFFFF后,則循環至0x0001重新開始計數。對于請求/響應的method,客戶端可通過Session ID來識別正確的響應,如果響應的Session ID與其發送的請求中不一致,應忽略。對于Event,有多種不同場景下的應用,如果不使用該字段,可置為0x0000,接收端直接忽略即可。
-
Session ID的作用
- 會話標識:唯一標識客戶端與服務端之間的特定交互會話
- 請求-響應匹配:幫助客戶端將響應與正確的請求關聯起來
- 多路復用支持:允許多個并發會話通過同一連接進行
- 狀態跟蹤:協助跟蹤長時間運行的交互狀態
-
對于不同的通信模式有不同的使用方式:
- 請求/響應模式:用于匹配請求和響應
- 事件/通知模式:可能用于標識訂閱會話
- 字段通信:可能用于跟蹤字段更新會話
在SOME/IP-SD(服務發現)中,Session ID可能有特殊用途,用于標識服務實例
- 實際應用
在汽車電子系統中,Session ID幫助管理復雜的服務交互,特別是在以下場景:- 多個ECU之間的并發服務調用
- 長時間運行的操作(如固件更新)
- 需要保持狀態的交互序列
2.6 Protocol Version / 8 bits
協議版本,表示SOME/IP協議的版本,即SOME/IP的頭部格式版本。發送端和接收端所支持的協議版本應一致,如果不一致則無法處理,主要用于版本控制和兼容性管理。以下是其詳細定義與作用:
長度:1字節(8位)。
取值:通常為 0x01
(表示SOME/IP協議版本1),這是當前廣泛實現的版本。
標準參考:根據AUTOSAR規范,SOME/IP協議版本需嚴格定義以確保互通性。
- 作用
(1) 協議版本標識 - 標識數據包遵循的SOME/IP協議版本,確保通信雙方使用相同的協議規則(如消息格式、序列化方式等)。
- 例如:
0x01
表示版本1,可能支持基礎RPC和事件通知;未來版本可能擴展新功能(如增強的QoS機制)。
(2) 兼容性控制 - 接收方檢查:若接收方不支持該版本,可拒絕處理或觸發錯誤響應(如返回
NOT_OK
狀態)。 - 多版本共存:網關或中間件可能根據此字段對消息進行轉換或路由(如版本1與版本2互通時)。
(3) 未來擴展性 - 保留字段為未來協議升級提供可能(例如:
0x02
可能引入新的頭部字段或優化序列化效率)。
實際應用示例:
- 場景:ECU A(版本1)向ECU B(版本2)發送請求。
- 處理流程:
- ECU B檢測到
Protocol Version=0x01
,判斷自身是否支持向后兼容。 - 若不支持,通過SOME/IP錯誤響應通知ECU A;若支持,則按版本1規則處理消息。
- ECU B檢測到
2.7 Interface Version / 8 bits
接口版本,用于標識服務接口的版本號,在AUTOSAR等車載系統中,Interface Version通常與服務接口描述文件(ARXML)中定義的版本一致,確保通信雙方對接口定義的理解一致。
- 作用
-
版本控制:標識服務接口的版本,允許服務接口在不破壞向后兼容性的情況下進行演進。
-
兼容性管理:客戶端和服務端可以通過版本號判斷是否兼容,避免因版本不匹配導致的通信問題。
-
多版本支持:系統可以同時部署同一服務的多個版本,通過版本號區分。
- 使用場景
-
當服務接口有重大變更時(如新增方法、事件或字段),遞增主版本號。
-
當服務接口有向后兼容的修改時(如bug修復或性能優化),遞增次版本號。
-
客戶端在請求時可以指定它能處理的最高版本,服務端可以選擇使用兼容的版本進行響應。
-
注意事項
-
版本號遞增策略應由服務接口設計者明確定義
-
版本號比較通常采用簡單的數值比較
-
版本不匹配時應定義明確的錯誤處理機制
2.8 Message Type / 8 bits
報文類型,用于表示SOME/IP報文的類型。它在SOME/IP協議頭中占據重要位置,直接影響通信雙方對消息的處理邏輯,通過該字段可以識別該報文是請求、響應、通知或者錯誤等。其中第三位為分段標志位(TP-Flag),用于表示該條報文是否被分段。
說明:
TP指SOME/IP-TP(Transport Protocol),是SOME/IP的傳輸協議,可以簡單的理解為是分段傳輸機制,在后續專題中會詳細介紹。
以下是完整的Message Type取值及其含義(十六進制表示):
Type Value | 名稱 | 描述 |
---|---|---|
0x00 | REQUEST | 客戶端到服務的請求(請求并期望響應)。 |
0x01 | REQUEST_NO_RETURN | 客戶端到服務的請求(不期望響應)。 |
0x02 | NOTIFICATION | 事件通知(無響應)。 |
0x40 | REQUEST_ACK | REQUEST的ACK確認。 |
0x41 | REQUEST_NO_RETURN_ACK | REQUEST_NO_RETURN的ACK確認。 |
0x42 | NOTIFICATION_ACK | NOTIFICATION的ACK確認。 |
0x80 | RESPONSE | 服務端對REQUEST的響應(Bit 7=1表示響應)。 |
0x81 | ERROR | 響應中包含錯誤。 |
0xC0 | RESPONSE_ACK | RESPONSE的ACK確認。 |
0xC1 | ERROR _ACK | ERROR的ACK確認。 |
0x20 | TP_REQUEST | 分塊傳輸(TP)的請求報文(期待響應)。 |
0x21 | TP_REQUEST_NO_RETURN | 分塊傳輸(TP)的請求報文(無響應)。 |
0x22 | TP_NOTIFICATION | 一個TP通知/事件回調的請求,不期待有響應。 |
0xA0 | TP_RESPONSE | TP請求的響應報文。 |
0xA1 | TP_ERROR | TP請求的錯誤響應。 |
關鍵說明:
- Bit 7 (最高位):
0
: 表示請求或通知(客戶端→服務端)。1
: 表示響應或錯誤(服務端→客戶端)。
- Bit 6:
1
時表示響應(如RESPONSE
或ERROR
)。
- TP前綴:
- 標識報文使用分塊傳輸(Transport Protocol),用于超過SOME/IP默認MTU的數據。
2.9 Return Code / 8 bits
Return Code字段是一個8位(1字節)的無符號整數,用于表示遠程方法調用(RPC)或事件通知的處理結果狀態。它的定義和作用類似于HTTP狀態碼,用于指示請求是否成功、失敗或需要進一步處理。所以只會在響應或者錯誤類型的報文中才有意義。對于請求和通知類報文(REQUEST, REQUEST_NO_RETURN, NOTIFICATION) 該字段不使用,應置0x00。
SOME/IP協議規范(如AUTOSAR標準)定義了以下常見的Return Code值:
值(十進制) | 名稱 | 描述 |
---|---|---|
0x00 (0) | E_OK | 請求成功完成。 |
0x01 (1) | E_NOT_OK | 通用錯誤(未明確指定的失敗)。 |
0x02 (2) | E_UNKNOWN_SERVICE | 請求的服務ID不存在。 |
0x03 (3) | E_UNKNOWN_METHOD | 請求的方法ID在服務中不存在。 |
0x04 (4) | E_NOT_READY | 服務/方法尚未準備好(例如初始化未完成)。 |
0x05 (5) | E_NOT_REACHABLE | 服務端不可達(網絡或通信問題)。 |
0x06 (6) | E_TIMEOUT | 請求超時(未在指定時間內收到響應)。 |
0x07 (7) | E_WRONG_PROTOCOL_VERSION | 協議版本不匹配。 |
0x08 (8) | E_WRONG_INTERFACE_VERSION | 接口版本不匹配。 |
0x09 (9) | E_MALFORMED_MESSAGE | 消息格式錯誤(如字段長度或類型不符)。 |
0x0A (10) | E_WRONG_MESSAGE_TYPE | 消息類型不匹配(如期望請求但收到響應)。 |
0x0B–0x7F | 保留 | 協議規范保留的代碼,未來可能擴展。 |
0x80–0xFF | 供應商特定 | 供廠商自定義使用(如特定ECU或中間件的擴展錯誤碼)。 |
Return Code的作用:
-
反饋調用狀態
客戶端通過Return Code快速判斷請求是否成功,或定位失敗原因(如服務不可用、參數錯誤等)。 -
錯誤處理與恢復
客戶端可根據不同Return Code采取不同策略(如重試、回退、日志記錄等)。例如:- 遇到
E_NOT_READY
可延遲重試。 - 遇到
E_UNKNOWN_METHOD
需檢查方法ID配置。
- 遇到
-
協議兼容性
- 版本不匹配(如
E_WRONG_PROTOCOL_VERSION
)提示雙方升級協議。 - 供應商特定代碼(0x80以上)支持私有擴展。
- 版本不匹配(如
-
調試與診斷
在開發和測試階段,Return Code幫助快速定位通信或邏輯問題。
示例場景:
-
成功請求
客戶端調用方法0x1234
,服務端返回Return Code = 0x00 (E_OK)
,表示執行成功。 -
服務不存在
客戶端請求一個未注冊的服務(如ID0x9999
),服務端返回0x02 (E_UNKNOWN_SERVICE)
。 -
超時處理
客戶端未在設定時間內收到響應,本地SOME/IP棧生成0x06 (E_TIMEOUT)
。
注意事項:
- AUTOSAR兼容性:不同AUTOSAR版本可能擴展Return Code,需參考對應標準文檔(如AUTOSAR_SWS_SOMEIPProtocol)。
- 自定義代碼:供應商特定代碼需確保收發雙方約定一致,避免沖突。
- 與Response Code區別:Return Code是協議層狀態,而Response Code可能用于應用層錯誤(如參數校驗失敗)。
2.10 通信過程示例
以下是一個詳細的SOME/IP報文通信過程示例,包含報頭結構解析和交互流程:
1. SOME/IP報文頭結構(12字節)
字段 | 長度(字節) | 示例值 | 說明 |
---|---|---|---|
Message ID | 4 | 0x12345678 | 高16位:Service ID (0x1234) |
低16位:Method ID (0x5678) | |||
Length | 4 | 0x00000010 | 從Request ID開始的剩余長度 |
Request ID | 4 | 0xDEADBEEF | 高32位:Client ID (0xDEAD) |
低32位:Session ID (0xBEEF) | |||
Protocol Version | 1 | 0x01 | SOME/IP版本(通常為1) |
Interface Version | 1 | 0x02 | 服務接口版本 |
Message Type | 1 | 0x00 (REQUEST) | 0x80=REQUEST, 0x40=RESPONSE |
Return Code | 1 | 0x00 (E_OK) | 0x00=成功,其他為錯誤碼 |
2. 通信流程示例(客戶端調用服務端方法)
步驟1:客戶端發送REQUEST
SOME/IP Header:Message ID: 0x12345678 (Service ID=0x1234, Method ID=0x5678)Length: 0x00000010 (16字節,含Request ID后的數據)Request ID: 0xDEADBEEF (Client ID=0xDEAD, Session ID=0xBEEF)Protocol Ver: 0x01Interface Ver: 0x02Message Type: 0x80 (REQUEST)Return Code: 0x00Payload:0x11223344 (示例數據:輸入參數)
步驟2:服務端回復RESPONSE
SOME/IP Header:Message ID: 0x12345678 (與請求匹配)Length: 0x0000000C (12字節,僅含返回值)Request ID: 0xDEADBEEF (與請求匹配)Protocol Ver: 0x01Interface Ver: 0x02Message Type: 0x40 (RESPONSE)Return Code: 0x00 (E_OK)Payload:0xAABBCCDD (示例數據:計算結果)
3. 異常場景示例
場景:方法調用失敗(服務不可用)
SOME/IP Header:Message Type: 0x40 (RESPONSE)Return Code: 0x07 (E_NOT_READY)# 其他字段與請求匹配
Payload: 無
4. 關鍵字段說明
- Message ID:唯一標識服務和方法(如
0x1234:0x5678
表示服務A的Method X)。 - Request ID:匹配請求與響應(同一Client ID + 自增Session ID)。
- Message Type:
0x80
= REQUEST(需要響應)0x40
= RESPONSE0x20
= ERROR
- Return Code:常見值:
0x00
(E_OK):成功0x01
(E_NOT_OK):通用錯誤0x07
(E_NOT_READY):服務未初始化
5. 通信流程圖示
Client Server| --- REQUEST (0x80) ---> || <-- RESPONSE (0x40) --- || (ReturnCode=0x00) |
通過上述示例,可以清晰理解SOME/IP協議中報頭如何標識服務、匹配請求/響應及處理異常。實際應用中需結合服務發現(SOME/IP-SD)實現動態服務訂閱。
3 總結
以上是對SOME/IP報文的格式以及各字段的定義進行了介紹,并且通過列舉實例來幫助大家對SOME/IP通信過程的理解,希望能有所幫助!