![]()
接上篇《車載以太網(上)》,樓主在本篇收下尾,需要說明的是,車載以太網涉及的知識點太多了,樓主整理和介紹的是有限的,感興趣的童鞋可針對每個點再深入查閱資料。
SOME/IP介紹
![]()
如上篇闡述的,車載以太網采用基于 TCP/IP 的網絡分層模型,TCP/IP 模型沒有對 OSI 的 5~7 層做嚴格區(qū)分,統(tǒng)稱為應用層,如上。
![]()
其中應用層協議有關的協議有SOME/IP、AVB/TSN、DoIP等,本篇我們主要闡述SOME/IP協議。SOME/IP (Scalable Service-Oriented MiddlewarE Over IP) ,即“運行于IP之上的可伸縮的面向服務的中間件”,它是車載以太網技術中的核心內容,可用于控制消息及應用數據傳輸,該技術是SOA架構的重要支撐。它在系統(tǒng)中其實就是一個中間件的存在,所謂“Middleware中間件”是一種獨立的系統(tǒng)軟件或服務程序,分布式應用軟件可借助Middleware在不同的技術之間共享資源。所謂的分布式應用軟件,在這里指的就是“服務”;不同的技術之間,在這里指的就是“不同的平臺或操作系統(tǒng),比如Adaptive AUTOSAR系統(tǒng)等。因此SOME/IP用于面向服務的通訊,可實現方法復用和擴展、可降低負載(因SOME/IP是在接收方有需求的時候才發(fā)送,這種方法的優(yōu)點在于總線上不會出現過多不必要的數據,從而降低負載。)并適用于不同操作系統(tǒng)
![]()
![]()
上篇的最后我們也已經說過了輸出的傳輸過程:數據從應用層到物理層是經過一層一層封裝然后傳輸的,上三層的數據流在傳輸層被封裝成數據段,在網絡層數據段被封裝成數據報,在數據鏈路層數據報被封裝成數據幀,最后在物理層編碼成比特流進行傳輸,這次我們重點關注TCP/IP模型中應用層數據經SOME/IP協議是如何封裝的。
![]()
服務是SOME/IP的最核心概念,在一個服務中,定義了Server和Client兩個角色:Server提供服務,Client調用服務。對于同一個服務,只能存在一個Server,但可以同時存在多個Client調用服務,一個Service由Event/Method/Field組成。
Method類型:即函數調用的形式,Client通過函數調用的方式向Server端請求數據。
![]()
Event類型:即事件類型,Client會向Server端訂閱信息,Server則會以事件觸發(fā)的形式向Client端發(fā)送所訂閱的內容。
![]()
Filed類型:是Method和Event的組合,由以下三項內容構成:
Notifier:通知,Client訂閱了服務后,Server第一時間主動向其發(fā)送數據-Event方式
Getter:獲取,由Client向Server請求數據-Method方式
Setter:設置,由Client修改Server的數據--Method方式
![]()
![]()
從上面可看到Notification分為Event和Field 兩類,這兩類通知都需要首先使用SOME/IP-SD(Service Discovery)來進行服務訂閱,然后才能發(fā)布通知。
![]()
區(qū)別在于,Event是某一時刻的快照,只是事件通知,而Field除了事件通知之外,還具有Getter和Setter的功能,即對信息進行讀寫的操作。
![]()
對于上面三種方法的總結如下:
![]()
SOME/IP數據格式
SOME/IP 的數據格式如下:
![]()
![]()
![]()
Message Type用來識別不同的消息類型,目前類型如下圖,其中TP用來表示分包的報文:
![]()
REQUEST、REQUEST_NO_RETURN、RESPONSE屬于同一類遠程過程調用方法,當Client有需求的時候,發(fā)送一個Request消息,Server根據這個消息類型(REQUEST或REQUEST_NO_RETURN)來決定是否發(fā)Rresponse消息。
Return Code則用于表示請求是否被成功的處理,下表是AUTOSAR標準中定義的Return Code類型:
![]()
Payload就是用于自定義原始數據了。
SOME/IP- SD介紹
上面我們提到Event和Field這兩類的通知都首先需要使用SOME/IP-SD(Service Discovery)來進行服務訂閱,然后才能發(fā)布通知并且服務需要由Server和Client共同完成,因此在進行正常的數據傳輸之前,需要一系列的準備工作確認Server和Client之間是否已有網絡連接。之后,Client還要詢問Server能否提供所需的服務,并對服務的Event進行訂閱。
那么Client是怎么知道Server提供哪些服務呢,就是通過SOME/IP-SD來實現服務發(fā)現過程的。SOME/IP服務發(fā)現用于定位服務實例、檢查服務是否可用以及部署發(fā)布和訂閱句柄,。服務發(fā)現只能通過UDP實現。SOME/IP-SD是一種特殊的SOME/IP格式,它對SOME/IP-SD報文中的Payload進行了定義和實現,。而Message ID字段則是固定的0xFF FF 81 00。
其主要功能就是:定位服務實例、檢測服務實例是否在運行(即服務實例的狀態(tài))、發(fā)布/訂閱行為的管理。格式如下:
![]()
關于SOME/IP樓主就簡單介紹到這下,想詳細了解的同學可通過如下網站進行學習:
Scalable service-Oriented MiddlewarE over IP (SOME/IP)->http://www.some-ip.com/index.shtml
參考文獻:
1、Ethernet introduction(BOSCH、Vector、CSDN、BMW、中國汽研等資料)
![]()
點個“在看”再走!