SOME/IP-SD也是基于SOME/IP的報文,用來實現服務發現和事件訂閱機制。SOME/IP-SD消息通過UDP進行傳輸,報文格式如下圖所示:
Flags=重新啟動標志+單播標志+顯示初始數據控制標志,如下圖所示:
服務重新啟動后,所有消息的Reboot Flag須置為1,直到Session ID重新從1開始計數,之后的Reboot Flag須置為0。
Entries Array,Entry可以理解為“入口”,包含了服務實例以及需要訂閱的事件組的信息,分為Service和Eventgroup兩種類型,一個SD報文可能包含多個Entry,每個Entry大小都是16個字節,一個Entry可能包含0-2個Option。下圖為一個完整的SD報文示例:
Service Entry 用于服務發現:
Type:當網絡中未收到相關服務的OfferService或者暫時未收到,而Client又需要訪問該服務,那Client可以發出FindService去主動尋找服務,如果Service已經就緒的話,會回復OfferService報文;服務就緒后,主動發出OfferService,用以告知組播內其他節點,該服務已經啟動,可以創建連接;當服務不可用時,會主動發送StopOfferService報文,用以告知組播內其他節點,該服務目前不可用,停止發送請求,并取消訂閱。
Index 1st options:Option1排在Array里第幾個
Index 2nd options:Option2排在Array里第幾個
of opt 1:Option1的數目
of opt 2:Option2的數目
Service ID:Entry關于哪個服務
Instance ID:Entry關于服務的哪個實例,0xFFFF表示全部實例
Major Version:服務的主版本號
TTL:“入口”的生命周期,單位為秒,我理解為發現服務時的搜索時間,提供服務時的有效時間
Minor Version:服務的次版本號
服務發現,說白了,就是想辦法讓服務消費者能夠找到服務提供者。打個比方,想象你在一個有很多人的廣場上找一個會唱歌的人,很顯然有兩種情況:
你認識這個人,提前說好了,他站在某個地方等你,而你知道那個地方的位置,那你肯定很容易就找到他了,這就是靜態配置;
你并不認識這個人,存在一個中間人,你告訴中間人你想找一個會唱歌的,而那個人也會告訴中間人我是會唱歌的,我站在廣場的哪個位置,然后中間人把位置給你,你就可以找到他了,這就是動態發現,而SOME/IP-SD就是那個中間人。
Eventgroup Entry 用于事件訂閱:
Type:當Client收到服務OfferService之后,Client可以發送Subscribe報文主動跟Service訂閱感興趣的事件組;當Client訂閱某個事件組之后,后續發現不再需要改事件組的數據了,可以通過StopSubscribe報文來通知Service,避免不必要的數據交互;當Service收到Client的Subscribe報文之后,需要先行判斷是否符合可訂閱的條件,如果該Client滿足事件組訂閱條件,則返回SubscribeAck,告知Client訂閱成功,當事件組內的事件準備就緒之后,Service會以某種約定好的形式發送相關事件給成功訂閱的Client,如果該Client不符合事件組訂閱條件,那Service就會直接回復SubscribeEventgroupNack,告知訂閱失敗。
Initial Data Requested Flag:如初始值由服務發送,須置為1
Counter:區分相同訂閱者的訂閱請求
Eventgroup ID:事件組ID,也就是說SOME/IP事件訂閱和取消訂閱的顆粒度到一個事件組,而不是一個事件
下面的示例,說明了一個Client發現服務和訂閱事件組的過程:
Options Array,Option可以理解為選項參數,Type=0x01時,用于傳輸Entry的附加信息,比如服務名等等:
Type=0x04時,用于傳輸IPv4相關的參數,比如服務的IP地址、TCP還是UDP、端口號:
從下圖可知,對于不同的消息,要配置的選項類型也不一樣,甚至不需要配置,其他幾種選項的具體內容不一一列舉了
到這里,SOME/IP算介紹完了。是不是覺得如果要自己實現SOME/IP全部的協議,還是有點復雜的,目前GENIVI的vsomeip開源庫已經實現了SOME/IP協議棧,所以通常并不用再去造輪子。換言之,我們完全可以基于vsomeip開發SOME/IP應用程序,不用關心報文長什么樣,也不用關心服務發現和事件訂閱的細節,拿到手已經是Payload了,如果再用上GENIVI的CommonAPI,IDL一寫,一條命令下去,代碼自動生成了,Payload都用不著解析了,這樣就實現了真正的RPC。
審核編輯:劉清
-
TTL
+關注
關注
7文章
503瀏覽量
70314 -
RPC
+關注
關注
0文章
111瀏覽量
11540 -
UDP協議
+關注
關注
0文章
69瀏覽量
12715
發布評論請先 登錄
相關推薦
評論