作者 | 不可說
出品 | 汽車電子與軟件
#01 引 入
服務發現模塊(Service Discovery Module)的主要任務是在車內通信中管理服務(functional entities)的可用性,這些服務被稱為功能實體,并控制事件消息的發送行為。這一機制確保僅將事件消息發送給需要它們的接收方(即采用發布/訂閱模式)。此處描述的解決方案就被稱為SOME/IP-SD(基于IP的可擴展面向服務中間件 - 服務發現,Scalable service-Oriented MiddlewarE over IP - Service Discovery)。
通過服務發現功能,不同的電子控制單元(ECU)可以提供服務實例,并在車輛網絡中查找可用的服務實例。一個ECU可以停止提供之前提供的服務實例,之后對該服務實例的查找將得不到響應。服務實例是由其服務接口定義的服務的單個實現。
除了管理服務實例的狀態外,服務發現還能控制發送一種特殊消息,即事件消息。這些事件消息被分組到事件組中,服務發現可以以發布/訂閱的方式開啟或關閉這些事件組,從而開啟或關閉該事件組中事件的發送和接收。
#02 SOME/IP SD對不同ECU角色的職責
ECU的服務發現模塊在處理服務器服務和客戶端服務時扮演著不同的角色,并需要執行相應的操作來確保服務的正確提供和查找。
一個ECU需要處理兩種不同類型的服務:服務端服務(Server Services):本地ECU向車輛的其他部分提供服務器服務實例(即位于本地的服務實例),并可以被視為該服務實例的服務端。
客戶端服務(Client Services):本地ECU可能會使用車輛內另一個ECU提供的服務器服務實例,并可以被視為該服務實例的客戶端。
對于服務端服務,本地ECU的SOME/IP SD模塊(擔任服務器角色)需要執行以下操作:
- 當服務可用時(即提供服務的軟件組件(SWC)準備就緒,且服務在當前ECU狀態下可用)提供本地服務。
- 當服務不再可用時,撤回本地服務的提供(停止提供)。
- 響應其他ECU的查找請求。
對于客戶端服務,本地ECU的服務發現模塊(擔任客戶端角色)需要執行以下操作:
- 根據配置監聽提供的服務和查找請求,并將這些信息存儲在易失性存儲器中。
- 監聽停止提供的服務信息,并根據配置將這些信息存儲在易失性存儲器中。
- 根據當前ECU及其軟件組件(SWC)的狀態發送查找請求。
服務發現同樣可用于管理發布/訂閱(Publish/Subscribe)關系。在基于服務發現的發布/訂閱應用場景中,一個ECU(作為具有已消費事件組的發布/訂閱客戶端)對從另一個ECU(作為具有事件處理器的發布/訂閱服務器)接收某些數據(即訂閱)感興趣。
雖然訂閱關系在服務發現(SD)消息中明確定義,但發布關系則基于服務實例本身的可用性(即提供服務條目)。基于所提供的服務實例,發布/訂閱客戶端可通過訂閱事件組條目進行訂閱。此時,發布/訂閱服務器將利用此訂閱關系,將發布/訂閱客戶端注冊為對訂閱中指定的某些信息感興趣的方,并在發生某些事件或超時后,開始將這些信息發送給發布/訂閱客戶端。
為進行優化,服務發現支持使用多播消息而非每個客戶端的單播消息,將事件消息發送給多個客戶端。但請注意,服務器端和客戶端預先配置的多播之間存在差異:
- 如果SdServerService(服務端服務)為每個事件處理器預先配置了多播地址和端口(即所謂“事件處理器多播端點”),則當訂閱了具有不同端點信息的SdClientServices(客戶端服務)達到閾值(SdEventHandler MulticastThreshold,事件處理器多播閾值)時,SdServerService將切換至此多播地址和端口。
- 如果SdClientService(客戶端服務)使用多播地址和端口(即所謂“已消費事件組多播端點”)進行了訂閱,則SdServerService在訂閱已消費事件組多播端點(多播地址和端口)時,會向其發送事件。

#03 SD流程
服務發布流程
Down Phase
服務處于不可用狀態
Initial Wait Phase
服務準備完成后, 進入該階段, 延遲一定時間后發送服務發布報文
Repetition Phase
重復發送服務發布報文, 重復次數由配置參數決定, 此階段收到服務發現請求后,通過服務發布報文進行應答
Main Phase
服務發現流程
Down Phase
服務未被應用請求
Initial Wait Phase
應用發起服務請求后進入該階段
Repetition Phase
重復發送服務發現報文, 重復次數由配置文件參數REPETITION_MAX決定, 收到服務發布報文后, 停止發送服務發現報文
Main Phase
不再重復發送服務發現報文, 每次收到服務發布報文后, 觸發服務訂閱請求報文。
服務訂閱流程
- 服務發現
- 連接建立
- 注冊服務
- 事件通知
#04 SOME/IP SD協議規范

Request ID 由Client ID 和Session ID 組成。雖然Client ID 不用于服務發現,但Session ID 用于檢測車輛中其他服務發現實例的重啟或重啟,以修復服務發現模塊的本地狀態。在初始化 Service Discovery Module 后, ECU 發送的消息的 Session ID應為0x0001。
Protocol Version 字段是用來描述當前SOME/IP協議版本,目前是0x01;
Return Code用于表示請求是否已成功處理。這不適用于SOME/IP-SD;因此返回碼被靜態設置為0x00。
SOME/IP SD從Message ID到Return Code字段的格式與SOME/IP 協議格式是一致的;后面的字段才是SOME/IP SD獨有的。
Flag
如果服務4端或客戶端通過評估通信方發送的SOME/IP-SD消息的會話ID(Session ID)和重啟標志(Reboot Flag)檢測到重啟,則受影響的通信本地狀態將失效,并應執行以下操作:
客戶端檢測到服務端重啟時的處理:
1)如果客戶端檢測到服務端重啟,并且該客戶端正在使用該服務端的服務,則客戶端應將此次重啟視為接收到“停止提供服務”(StopOffer)消息。
2)如果為該服務配置了SdClientServiceTcpRef,則活動客戶端應通過調用SoAd_CloseSoCon()函數并設置參數“abort”為TRUE來關閉相應的TCP連接。
服務器檢測到客戶端重啟時的處理:
Reserved
Length of Entries Array
Entries Array
服務Services Entries

- Type為0x00時,表示FindService;為0x01時,表示OfferService和StopOfferService
- Index 1st options 標明屬于這個Entry的第一個option的起始索引序號,從0開始計算;Index 2st options 標明屬于這個Entry的第二個option的起始索引序號,從0開始計算;#of opt 1表明該entry有幾個第一組option;#of opt 2表明有幾個第二組option。
- 該類型Service ID字段應攜帶服務的Service ID,根據是服務端還是客戶端,使用參數SdServerServiceID或SdClientServiceID進行靜態配置。
- Instance ID字段應攜帶服務的Instance ID,根據是服務端還是客戶端,使用參數SdServerSer-viceInstanceID和SdClientServiceInstanceID靜態配置。
- Major Version字段應包含SdServerServiceMajorVersion或者SdClientServiceMajorVersion,這取決于該條消息是服務端發送的還是客戶端發送的。
- TTL字段定義了使用參數SdServerTimer TTL和SdClientTimer TTL配置的服務器條目的生存期(秒),但TTL為0的Stop Entries除外。
- Minor字段應攜帶SdServerServiceMinorVersion或者SdClientServiceMinorVersion,這些都是在服務設計階段就已經規范好的。

Length of Options Array
Options Array
Type為0x1;
IPv4 Endpoint Option

該Option傳輸單播IP地址、第四層協議(如UDP或TCP)和端口號;從而獲取與服務通信所需的信息。當接收到提供服務并傳輸IPv4選項的服務發現消息時,接收此消息的ECU可以通過更新Socket連接,動態配置套接字適配器以使用此服務。
IPv4 Multicast Option

IPv4多播選項由SdServerService或者SdClientService用于通告其配置的事件多播端點;
- 如果用作服務端的多播端點,則SdServerService會聲明IPv4多播地址、傳輸層協議(ISO/OSI第4層)和端口號,多播事件和多播通知事件將發送到這些端口。
- 如果它用作客戶端事件組多播端點,則SdClientSer指示IPv4多播地址、傳輸層協議(ISO/OSI第4層)和端口號,SdClient期望在其中接收事件。作為傳輸層協議,只支持UDP。

IPv4 SD端點選項傳輸發送方SD實現的端點(即IP地址和端口)。這用于在無法使用IP地址和/或端口號的情況下標識SOME/IP-SD實例。
Option也支持 IPv6 Endpoint Option、IPv6 Multicast Option、IPv6 SD Endpoint Option,但是在車載通信中,IPv4就足夠了,并且通常會禁用IPv6,因此此處不介紹IPv6相關的Option。
#05 通信實例分析
第一個(offer)

第二個(Subscribe)
