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