作者 | 不可說
出品 | 汽車電子與軟件
#01 引 入
服務(wù)發(fā)現(xiàn)模塊(Service Discovery Module)的主要任務(wù)是在車內(nèi)通信中管理服務(wù)(functional entities)的可用性,這些服務(wù)被稱為功能實體,并控制事件消息的發(fā)送行為。這一機制確保僅將事件消息發(fā)送給需要它們的接收方(即采用發(fā)布/訂閱模式)。此處描述的解決方案就被稱為SOME/IP-SD(基于IP的可擴展面向服務(wù)中間件 - 服務(wù)發(fā)現(xiàn),Scalable service-Oriented MiddlewarE over IP - Service Discovery)。
通過服務(wù)發(fā)現(xiàn)功能,不同的電子控制單元(ECU)可以提供服務(wù)實例,并在車輛網(wǎng)絡(luò)中查找可用的服務(wù)實例。一個ECU可以停止提供之前提供的服務(wù)實例,之后對該服務(wù)實例的查找將得不到響應(yīng)。服務(wù)實例是由其服務(wù)接口定義的服務(wù)的單個實現(xiàn)。
除了管理服務(wù)實例的狀態(tài)外,服務(wù)發(fā)現(xiàn)還能控制發(fā)送一種特殊消息,即事件消息。這些事件消息被分組到事件組中,服務(wù)發(fā)現(xiàn)可以以發(fā)布/訂閱的方式開啟或關(guān)閉這些事件組,從而開啟或關(guān)閉該事件組中事件的發(fā)送和接收。
#02 SOME/IP SD對不同ECU角色的職責
ECU的服務(wù)發(fā)現(xiàn)模塊在處理服務(wù)器服務(wù)和客戶端服務(wù)時扮演著不同的角色,并需要執(zhí)行相應(yīng)的操作來確保服務(wù)的正確提供和查找。
一個ECU需要處理兩種不同類型的服務(wù):服務(wù)端服務(wù)(Server Services):本地ECU向車輛的其他部分提供服務(wù)器服務(wù)實例(即位于本地的服務(wù)實例),并可以被視為該服務(wù)實例的服務(wù)端。
客戶端服務(wù)(Client Services):本地ECU可能會使用車輛內(nèi)另一個ECU提供的服務(wù)器服務(wù)實例,并可以被視為該服務(wù)實例的客戶端。
對于服務(wù)端服務(wù),本地ECU的SOME/IP SD模塊(擔任服務(wù)器角色)需要執(zhí)行以下操作:
- 當服務(wù)可用時(即提供服務(wù)的軟件組件(SWC)準備就緒,且服務(wù)在當前ECU狀態(tài)下可用)提供本地服務(wù)。
- 當服務(wù)不再可用時,撤回本地服務(wù)的提供(停止提供)。
- 響應(yīng)其他ECU的查找請求。
對于客戶端服務(wù),本地ECU的服務(wù)發(fā)現(xiàn)模塊(擔任客戶端角色)需要執(zhí)行以下操作:
- 根據(jù)配置監(jiān)聽提供的服務(wù)和查找請求,并將這些信息存儲在易失性存儲器中。
- 監(jiān)聽停止提供的服務(wù)信息,并根據(jù)配置將這些信息存儲在易失性存儲器中。
- 根據(jù)當前ECU及其軟件組件(SWC)的狀態(tài)發(fā)送查找請求。
服務(wù)發(fā)現(xiàn)同樣可用于管理發(fā)布/訂閱(Publish/Subscribe)關(guān)系。在基于服務(wù)發(fā)現(xiàn)的發(fā)布/訂閱應(yīng)用場景中,一個ECU(作為具有已消費事件組的發(fā)布/訂閱客戶端)對從另一個ECU(作為具有事件處理器的發(fā)布/訂閱服務(wù)器)接收某些數(shù)據(jù)(即訂閱)感興趣。
雖然訂閱關(guān)系在服務(wù)發(fā)現(xiàn)(SD)消息中明確定義,但發(fā)布關(guān)系則基于服務(wù)實例本身的可用性(即提供服務(wù)條目)。基于所提供的服務(wù)實例,發(fā)布/訂閱客戶端可通過訂閱事件組條目進行訂閱。此時,發(fā)布/訂閱服務(wù)器將利用此訂閱關(guān)系,將發(fā)布/訂閱客戶端注冊為對訂閱中指定的某些信息感興趣的方,并在發(fā)生某些事件或超時后,開始將這些信息發(fā)送給發(fā)布/訂閱客戶端。
為進行優(yōu)化,服務(wù)發(fā)現(xiàn)支持使用多播消息而非每個客戶端的單播消息,將事件消息發(fā)送給多個客戶端。但請注意,服務(wù)器端和客戶端預先配置的多播之間存在差異:
- 如果SdServerService(服務(wù)端服務(wù))為每個事件處理器預先配置了多播地址和端口(即所謂“事件處理器多播端點”),則當訂閱了具有不同端點信息的SdClientServices(客戶端服務(wù))達到閾值(SdEventHandler MulticastThreshold,事件處理器多播閾值)時,SdServerService將切換至此多播地址和端口。
- 如果SdClientService(客戶端服務(wù))使用多播地址和端口(即所謂“已消費事件組多播端點”)進行了訂閱,則SdServerService在訂閱已消費事件組多播端點(多播地址和端口)時,會向其發(fā)送事件。
#03 SD流程
服務(wù)發(fā)布流程
Down Phase
服務(wù)處于不可用狀態(tài)
Initial Wait Phase
服務(wù)準備完成后, 進入該階段, 延遲一定時間后發(fā)送服務(wù)發(fā)布報文
Repetition Phase
重復發(fā)送服務(wù)發(fā)布報文, 重復次數(shù)由配置參數(shù)決定, 此階段收到服務(wù)發(fā)現(xiàn)請求后,通過服務(wù)發(fā)布報文進行應(yīng)答
Main Phase
服務(wù)發(fā)現(xiàn)流程
Down Phase
服務(wù)未被應(yīng)用請求
Initial Wait Phase
應(yīng)用發(fā)起服務(wù)請求后進入該階段
Repetition Phase
重復發(fā)送服務(wù)發(fā)現(xiàn)報文, 重復次數(shù)由配置文件參數(shù)REPETITION_MAX決定, 收到服務(wù)發(fā)布報文后, 停止發(fā)送服務(wù)發(fā)現(xiàn)報文
Main Phase
不再重復發(fā)送服務(wù)發(fā)現(xiàn)報文, 每次收到服務(wù)發(fā)布報文后, 觸發(fā)服務(wù)訂閱請求報文。
服務(wù)訂閱流程
- 服務(wù)發(fā)現(xiàn)
- 連接建立
- 注冊服務(wù)
- 事件通知
#04 SOME/IP SD協(xié)議規(guī)范
Request ID 由Client ID 和Session ID 組成。雖然Client ID 不用于服務(wù)發(fā)現(xiàn),但Session ID 用于檢測車輛中其他服務(wù)發(fā)現(xiàn)實例的重啟或重啟,以修復服務(wù)發(fā)現(xiàn)模塊的本地狀態(tài)。在初始化 Service Discovery Module 后, ECU 發(fā)送的消息的 Session ID應(yīng)為0x0001。
Protocol Version 字段是用來描述當前SOME/IP協(xié)議版本,目前是0x01;
Return Code用于表示請求是否已成功處理。這不適用于SOME/IP-SD;因此返回碼被靜態(tài)設(shè)置為0x00。
SOME/IP SD從Message ID到Return Code字段的格式與SOME/IP 協(xié)議格式是一致的;后面的字段才是SOME/IP SD獨有的。
Flag
如果服務(wù)4端或客戶端通過評估通信方發(fā)送的SOME/IP-SD消息的會話ID(Session ID)和重啟標志(Reboot Flag)檢測到重啟,則受影響的通信本地狀態(tài)將失效,并應(yīng)執(zhí)行以下操作:
客戶端檢測到服務(wù)端重啟時的處理:
1)如果客戶端檢測到服務(wù)端重啟,并且該客戶端正在使用該服務(wù)端的服務(wù),則客戶端應(yīng)將此次重啟視為接收到“停止提供服務(wù)”(StopOffer)消息。
2)如果為該服務(wù)配置了SdClientServiceTcpRef,則活動客戶端應(yīng)通過調(diào)用SoAd_CloseSoCon()函數(shù)并設(shè)置參數(shù)“abort”為TRUE來關(guān)閉相應(yīng)的TCP連接。
服務(wù)器檢測到客戶端重啟時的處理:
Reserved
Length of Entries Array
Entries Array
服務(wù)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字段應(yīng)攜帶服務(wù)的Service ID,根據(jù)是服務(wù)端還是客戶端,使用參數(shù)SdServerServiceID或SdClientServiceID進行靜態(tài)配置。
- Instance ID字段應(yīng)攜帶服務(wù)的Instance ID,根據(jù)是服務(wù)端還是客戶端,使用參數(shù)SdServerSer-viceInstanceID和SdClientServiceInstanceID靜態(tài)配置。
- Major Version字段應(yīng)包含SdServerServiceMajorVersion或者SdClientServiceMajorVersion,這取決于該條消息是服務(wù)端發(fā)送的還是客戶端發(fā)送的。
- TTL字段定義了使用參數(shù)SdServerTimer TTL和SdClientTimer TTL配置的服務(wù)器條目的生存期(秒),但TTL為0的Stop Entries除外。
- Minor字段應(yīng)攜帶SdServerServiceMinorVersion或者SdClientServiceMinorVersion,這些都是在服務(wù)設(shè)計階段就已經(jīng)規(guī)范好的。
Length of Options Array
Options Array
Type為0x1;
IPv4 Endpoint Option
該Option傳輸單播IP地址、第四層協(xié)議(如UDP或TCP)和端口號;從而獲取與服務(wù)通信所需的信息。當接收到提供服務(wù)并傳輸IPv4選項的服務(wù)發(fā)現(xiàn)消息時,接收此消息的ECU可以通過更新Socket連接,動態(tài)配置套接字適配器以使用此服務(wù)。
IPv4 Multicast Option
IPv4多播選項由SdServerService或者SdClientService用于通告其配置的事件多播端點;
- 如果用作服務(wù)端的多播端點,則SdServerService會聲明IPv4多播地址、傳輸層協(xié)議(ISO/OSI第4層)和端口號,多播事件和多播通知事件將發(fā)送到這些端口。
- 如果它用作客戶端事件組多播端點,則SdClientSer指示IPv4多播地址、傳輸層協(xié)議(ISO/OSI第4層)和端口號,SdClient期望在其中接收事件。作為傳輸層協(xié)議,只支持UDP。
IPv4 SD端點選項傳輸發(fā)送方SD實現(xiàn)的端點(即IP地址和端口)。這用于在無法使用IP地址和/或端口號的情況下標識SOME/IP-SD實例。
Option也支持 IPv6 Endpoint Option、IPv6 Multicast Option、IPv6 SD Endpoint Option,但是在車載通信中,IPv4就足夠了,并且通常會禁用IPv6,因此此處不介紹IPv6相關(guān)的Option。
#05 通信實例分析