DDS協(xié)議解讀及測(cè)試開(kāi)發(fā)實(shí)踐

DDS概述
DDS是OMG在2004年發(fā)布的中間件協(xié)議和應(yīng)用程序接口(API)標(biāo)準(zhǔn),它為分布式系統(tǒng)提供了低延遲、高可靠性、可擴(kuò)展的通信架構(gòu)標(biāo)準(zhǔn)。DDS目前在工業(yè)、醫(yī)療、交通、能源、國(guó)防領(lǐng)域都有廣泛的應(yīng)用。OMG(Object Management Group)成立于1989年,是一個(gè)開(kāi)放性的非營(yíng)利性的計(jì)算機(jī)行業(yè)標(biāo)準(zhǔn)聯(lián)盟。OMG多年來(lái)致力于為工業(yè)分布式系統(tǒng)提供可互操作的,可移植的,可復(fù)用的軟件標(biāo)準(zhǔn)。它的成員包括IT行業(yè)的設(shè)備供應(yīng)商,終端用戶,政府部門,以及學(xué)術(shù)組織等。很多我們熟知的標(biāo)準(zhǔn)都來(lái)自O(shè)MG,比如UML(Unified Modeling Language),CORBA(Common Object Request Broker Architecture)等。
在去年關(guān)于SOME/IP的文章中我們?cè)?jiǎn)單解釋過(guò)中間件的概念,即在分布式系統(tǒng)中,中間件是位于操作系統(tǒng)和用戶應(yīng)用程序之間的軟件層,它將操作系統(tǒng)提供的資源進(jìn)行抽象和封裝,為應(yīng)用程序提供各種各樣的高級(jí)的服務(wù)和功能,比如通信或數(shù)據(jù)共享。中間件的存在簡(jiǎn)化了應(yīng)用程序開(kāi)發(fā)者的工作,這使他們能夠?qū)⒆⒁饬Ψ旁趹?yīng)用程序本身上,而不必在不同應(yīng)用程序之間或不同系統(tǒng)之間的數(shù)據(jù)傳輸上花太多精力。
DDS最重要的特性是以數(shù)據(jù)為中心,這是與其他很多通信中間件不同的地方。DDS的數(shù)據(jù)共享以Topic為單元,應(yīng)用程序能夠通過(guò)Topic判斷其所包含的數(shù)據(jù)類型,而不必依賴其他的上下文信息。同時(shí),DDS能夠按照用戶定義的方式自動(dòng)地進(jìn)行存儲(chǔ)、發(fā)布或訂閱數(shù)據(jù),使應(yīng)用程序能夠像訪問(wèn)本地?cái)?shù)據(jù)一樣去寫入或者讀取數(shù)據(jù)。
DDS實(shí)現(xiàn)的數(shù)據(jù)共享可以理解成一個(gè)抽象的“全局?jǐn)?shù)據(jù)空間”,任何應(yīng)用程序,不論開(kāi)發(fā)語(yǔ)言,或者運(yùn)行的操作系統(tǒng)類型,都可以通過(guò)相同的方式訪問(wèn)這個(gè)“全局?jǐn)?shù)據(jù)空間”,就好像訪問(wèn)本地的存儲(chǔ)空間一樣。當(dāng)然“全局?jǐn)?shù)據(jù)空間”僅僅是一個(gè)抽象的概念,在實(shí)現(xiàn)時(shí)仍然是分別存儲(chǔ)在每個(gè)應(yīng)用程序的本地空間當(dāng)中。在系統(tǒng)運(yùn)行時(shí),數(shù)據(jù)是按需傳輸或存儲(chǔ)的,數(shù)據(jù)的發(fā)布者僅僅發(fā)送對(duì)方需要的數(shù)據(jù),而訂閱者僅接收并存儲(chǔ)本地應(yīng)用程序當(dāng)前需要的數(shù)據(jù)。
DDS還提供了非常靈活的QoS(Quality of Service)策略,以滿足用戶對(duì)數(shù)據(jù)共享方式的不同需求,比如可靠性,故障處理等等。針對(duì)數(shù)據(jù)安全性要求比較高的系統(tǒng),DDS還提供了細(xì)顆粒度的數(shù)據(jù)安全控制,包括應(yīng)用程序身份認(rèn)證,權(quán)限控制,數(shù)據(jù)加密等等。
類似于SOME/IP-SD,DDS提供了對(duì)數(shù)據(jù)發(fā)布者和訂閱者的動(dòng)態(tài)發(fā)現(xiàn)機(jī)制,這意味著用戶不必去配置通信節(jié)點(diǎn)的地址或其他屬性信息,因?yàn)樗麄冊(cè)谶\(yùn)行的過(guò)程中會(huì)自動(dòng)發(fā)現(xiàn)對(duì)方,并自動(dòng)完成相關(guān)配置,即實(shí)現(xiàn)了“即插即用“。
DCPS模型
DCPS(Data-Centric Publish-Subscribe)是DDS標(biāo)準(zhǔn)中定義的以數(shù)據(jù)為中心的訂閱-發(fā)布模型。在這個(gè)模型中,向“全局?jǐn)?shù)據(jù)空間“寫入數(shù)據(jù)的一方稱為Publishers和DataWriter,同樣地,在”全局?jǐn)?shù)據(jù)空間“中讀取數(shù)據(jù)的一方稱為Subscriber和DataReader,下圖中展示了它們之間的邏輯關(guān)系。除了DCPS模型,DDS標(biāo)準(zhǔn)中還定義了一套完整的應(yīng)用程序接口(API),該接口標(biāo)準(zhǔn)是與平臺(tái)無(wú)關(guān)的,這意味著不論應(yīng)用程序使用什么開(kāi)發(fā)語(yǔ)言,或運(yùn)行在什么平臺(tái)之上,只要DDS中間件的實(shí)現(xiàn)符合DDS標(biāo)準(zhǔn),那么相關(guān)的應(yīng)用程序即可實(shí)現(xiàn)不同平臺(tái)間的移植。

數(shù)據(jù)的發(fā)送過(guò)程,簡(jiǎn)單來(lái)說(shuō)就是應(yīng)用程序調(diào)用DataWriter對(duì)象提供的write方法,把數(shù)據(jù)傳遞給Publisher對(duì)象,而Publisher負(fù)責(zé)將數(shù)據(jù)在網(wǎng)絡(luò)上發(fā)送出去。
數(shù)據(jù)的接收過(guò)程,簡(jiǎn)單來(lái)說(shuō)就是Subscriber負(fù)責(zé)從網(wǎng)絡(luò)上接收數(shù)據(jù),并把它存儲(chǔ)在對(duì)應(yīng)的DataReader中。應(yīng)用程序可以為對(duì)應(yīng)的DataReader注冊(cè)一個(gè)回調(diào)函數(shù),或者使用DataReader提供的read和take方法來(lái)輪詢DataReader中的數(shù)據(jù)。
具體來(lái)說(shuō),DataWriter在邏輯上從屬于Publisher,并受Publisher管理。一個(gè)DataWriter只能從屬一個(gè)Publisher,而Publisher可以擁有多個(gè)DataWriter。每一個(gè)DataWriter都綁定一個(gè)Topic,所以同一個(gè)應(yīng)用程序中可能存在多個(gè)DataWriter和Topic,此外還可以為同一個(gè)Topic綁定多個(gè)DataWriter。
同理,DataReader在邏輯上從屬于Subscriber,并受Subscriber管理。一個(gè)DataReader只能從屬一個(gè)Subscriber,而Subscriber可以擁有多個(gè)DataReader。每一個(gè)DataReader都綁定一個(gè)Topic,所以同一個(gè)應(yīng)用程序中可能存在多個(gè)DataReader和Topic,此外還可以為同一個(gè)Topic綁定多個(gè)DataWriter。
這個(gè)DSCP模型的工作過(guò)程實(shí)際上很像日常生活中報(bào)紙的發(fā)行過(guò)程。我們以《人民日?qǐng)?bào)》為例,其中Topic就是“人民日?qǐng)?bào)“,數(shù)據(jù)即報(bào)紙中的文字或者圖片,DDS中間件負(fù)責(zé)報(bào)紙發(fā)行的所有中間環(huán)節(jié)和渠道,包括報(bào)紙的印刷,存儲(chǔ),運(yùn)輸?shù)鹊取?/p>
QoS策略
用戶可以通過(guò)設(shè)置QoS策略來(lái)控制數(shù)據(jù)在應(yīng)用程序之間共享的方式,每個(gè)DCPS實(shí)體,包括Topic,DataWriter,Publisher,DataReader,Subscriber等,都能夠獨(dú)立配置相應(yīng)的QoS策略。
下面是幾種常用的QoS策略:
DEADLINE
如果希望某個(gè)Topic能夠周期更新,可以設(shè)置DEADLINE屬性。在數(shù)據(jù)的發(fā)布方設(shè)置DEADLINE,這意味著應(yīng)用程序必須以小于DEADLINE的周期去更新Topic;而在數(shù)據(jù)的訂閱方設(shè)置DEADLINE,這意味著數(shù)據(jù)的發(fā)布方必須以小于DEADLINE的周期去發(fā)布Topic。
LIFESPAN
通過(guò)設(shè)置LIFESPAN,可以使DataWriter寫入的每個(gè)數(shù)據(jù)樣本都有一個(gè)關(guān)聯(lián)的“到期時(shí)間”,超過(guò)該時(shí)間后,該數(shù)據(jù)樣本不再傳送給任何應(yīng)用程序,并且這些數(shù)據(jù)將從DataReader緩存中清除。
HISTORY
設(shè)置HISTORY屬性可以讓DataWriter保存并發(fā)送舊的采樣數(shù)據(jù),新的DDS節(jié)點(diǎn)如果訂閱了相關(guān)的Topic,它不僅能夠接收到數(shù)據(jù)的當(dāng)前值,也能收到一部分歷史值,從而了解數(shù)據(jù)近期的變化趨勢(shì)
RELIABILITY
為DataWriter設(shè)置RELIABILITY屬性,可以使數(shù)據(jù)實(shí)現(xiàn)“可靠”的傳輸,當(dāng)出現(xiàn)通信錯(cuò)誤導(dǎo)致數(shù)據(jù)采樣沒(méi)有被接收到時(shí),DataWriter會(huì)持續(xù)重傳,直到所有數(shù)據(jù)被正確接收。
RTPS協(xié)議
DDS的標(biāo)準(zhǔn)中并不包含傳輸層協(xié)議,所以不同的DDS實(shí)現(xiàn)可能使用不同的消息交互方式,甚至使用不同的傳輸協(xié)議,這就可能導(dǎo)致來(lái)自不同廠家的DDS實(shí)現(xiàn)是不能互操作的。而隨著DDS在大型分布式系統(tǒng)中的應(yīng)用越來(lái)越廣泛,制定統(tǒng)一傳輸層標(biāo)準(zhǔn)的需求越來(lái)越強(qiáng)烈。
RTPS(Real-Time Publish Subscribe)就是在此背景下誕生,它主要為了滿足工業(yè)自動(dòng)化領(lǐng)域大規(guī)模分布式系統(tǒng)的需求,也能夠很好的契合DDS協(xié)議特點(diǎn)。規(guī)范中定義了消息格式,各種使用場(chǎng)景下的消息交互方式等。它的主要特點(diǎn)包括:
提供容錯(cuò)機(jī)制,避免單點(diǎn)故障
高擴(kuò)展性,支持“即插即用”
模塊化設(shè)計(jì),針對(duì)計(jì)算能力較弱的平臺(tái),可只實(shí)現(xiàn)RTPS的一個(gè)子集功能,并且不會(huì)出現(xiàn)兼容性問(wèn)題

RTPS基于多播、無(wú)連接的傳輸模型,這個(gè)模型可以映射到不同的傳輸協(xié)議上,如UDP/IP(這也是目前RTPS標(biāo)準(zhǔn)中唯一被標(biāo)準(zhǔn)化的傳輸協(xié)議)。除此之外,基于TCP的傳輸,以及基于TSN(Time-Sensitive Networks)的傳輸?shù)南嚓P(guān)標(biāo)準(zhǔn)也在制定中。很多DDS的實(shí)現(xiàn)支持除UDP/IP之外的多種傳輸協(xié)議,但并沒(méi)有遵循統(tǒng)一的標(biāo)準(zhǔn),因此不同供應(yīng)商的DDS實(shí)現(xiàn)之間可能存在互操作問(wèn)題。
DDS與SOME/IP
DDS與SOME/IP存在諸多不同,但是需要強(qiáng)調(diào)的是,二者的設(shè)計(jì)需求不同,目標(biāo)應(yīng)用場(chǎng)景不同,所以我們不能簡(jiǎn)單的判定孰優(yōu)孰劣。在選取技術(shù)方案時(shí),應(yīng)考慮具體的應(yīng)用場(chǎng)景,結(jié)合各個(gè)方案的功能,性能,成本等多個(gè)維度,才能做出合理的選擇。我們可以從以下幾個(gè)方面進(jìn)行對(duì)比,為讀者提供參考。
通信模式
SOME/IP是面向服務(wù)的通信,服務(wù)端將方法和數(shù)據(jù)以服務(wù)的形式暴露給其他節(jié)點(diǎn)。而DDS最大的特點(diǎn)是以數(shù)據(jù)為中心,側(cè)重?cái)?shù)據(jù)的分發(fā),這種模式其實(shí)很像傳統(tǒng)的面向信號(hào)的通信,只不過(guò)DDS更靈活,功能更強(qiáng)大。
應(yīng)用程序接口
SOME/IP協(xié)議標(biāo)準(zhǔn)中沒(méi)有定義標(biāo)準(zhǔn)API,所以基于不同SOME/IP實(shí)現(xiàn)的應(yīng)用程序一般是不能互相移植的。DDS制定了多種編程語(yǔ)言的標(biāo)準(zhǔn)API,因此DDS應(yīng)用程序理論上能夠在不同的DDS實(shí)現(xiàn)上進(jìn)行移植。
傳輸協(xié)議
SOME/IP支持UDP和TCP,此外,從AUTOSAR 4.3開(kāi)始支持對(duì)大于1400字節(jié)的UDP數(shù)據(jù)進(jìn)行分段傳輸,即SOME/IP-TP。DDS則使用前面提到的RTPS協(xié)議,至少支持UDP/IP,而很多DDS實(shí)現(xiàn)還支持其他傳輸協(xié)議,如TCP。 RTPS實(shí)現(xiàn)了與傳輸無(wú)關(guān)的可靠性和分段協(xié)議,理論上可在任何傳輸形式之上運(yùn)行。
安全性
SOME/IP本身并不提供數(shù)據(jù)安全的控制,所以它的安全性依賴于傳輸協(xié)議,比如基于IPsec或TLS上運(yùn)行。DDS當(dāng)然也可以在IPsec或TLS上運(yùn)行,但這并不是首選的方式。DDS提供多種插件,實(shí)現(xiàn)了對(duì)安全性的更細(xì)粒度的控制,比如數(shù)據(jù)的加密傳輸,讀寫權(quán)限控制,應(yīng)用程序身份認(rèn)證等,并且DDS安全機(jī)制與傳輸協(xié)議無(wú)關(guān),因此使用任何傳輸協(xié)議都不影響安全機(jī)制的實(shí)現(xiàn)。
QoS支持
DDS提供多種QoS策略,而SOME/IP本身不提供QoS的支持,因此只能在傳輸協(xié)議或者應(yīng)用程序中實(shí)現(xiàn)。
資源需求
DDS在諸多方面提供了更豐富的特性,這自然就導(dǎo)致了在資源需求上,比如內(nèi)存占用,比SOME/IP要大得多。
AUTOSAR平臺(tái)支持
AUTOSAR Adaptive平臺(tái)從2018年起開(kāi)始支持對(duì)DDS的綁定,Classic平臺(tái)目前還并沒(méi)有支持DDS綁定的規(guī)劃。而SOME/IP是針對(duì)汽車應(yīng)用定制的,可以無(wú)縫部署在AUTOSAR Adaptive和Classic平臺(tái)中。
DDS測(cè)試
OMG組織并不提供DDS軟件實(shí)現(xiàn),各廠商可以根據(jù)該標(biāo)準(zhǔn)實(shí)現(xiàn)自己的DDS。我們可以在DDS官網(wǎng)(https://www.omg.org/dds-directory/)查詢DDS的供應(yīng)商列表,用戶可以按照自己的具體需求進(jìn)行選擇。這種由第三方供應(yīng)商提供的預(yù)構(gòu)建軟件,一般稱為商業(yè)現(xiàn)貨軟件(COTS)。對(duì)于COTS軟件,我們?cè)跍y(cè)試策略的選擇上與自行開(kāi)發(fā)的軟件是不同的。一般來(lái)說(shuō),COTS軟件往往是經(jīng)過(guò)市場(chǎng)和時(shí)間驗(yàn)證的產(chǎn)品,其核心部分是比較穩(wěn)定的,并且已由供應(yīng)商進(jìn)行了單元和功能測(cè)試。因此我們可以減少對(duì)COTS軟件本身功能的重新測(cè)試,應(yīng)該更側(cè)重在系統(tǒng)集成測(cè)試或性能測(cè)試等測(cè)試類型上。
下面為大家展示了一個(gè)簡(jiǎn)單的DDS硬件在環(huán)(HIL)測(cè)試環(huán)境。

為了保證ECU的正常運(yùn)行環(huán)境,并監(jiān)測(cè)或觸發(fā)ECU的某些行為,我們需要仿真ECU的外圍IO信號(hào)或者總線信號(hào),這時(shí)我們可以借助Vector提供的豐富的IO激勵(lì)和測(cè)量板卡,如VT系統(tǒng),以及總線接口卡,如VN系列硬件等工具。在測(cè)試環(huán)境中,我們還需要仿真DDS Writer或者Reader,來(lái)發(fā)布或訂閱ECU的DDS數(shù)據(jù),以此來(lái)驗(yàn)證被測(cè)節(jié)點(diǎn)的變量范圍,非法值的錯(cuò)誤處理機(jī)制等。由于CANoe暫不支持DDS節(jié)點(diǎn)的仿真功能,我們可以使用開(kāi)源或者DDS廠商提供的庫(kù),如pydds,RTI Connector等,來(lái)快速搭建DDS應(yīng)用程序,并在CANoe中編寫接口來(lái)控制仿真節(jié)點(diǎn)。

測(cè)試用例方面,可使用vTESTstudio進(jìn)行測(cè)試用例的設(shè)計(jì)和管理。vTESTstudio不但提供了圖形化和圖表化的測(cè)試用例設(shè)計(jì)方式,而且提供多種基于測(cè)試參數(shù)自動(dòng)生成測(cè)試用例的功能,并支持模糊測(cè)試,能夠極大的提高測(cè)試用例的開(kāi)發(fā)效率和測(cè)試覆蓋度。

總結(jié)
自從汽車在十九世紀(jì)末被發(fā)明以來(lái),技術(shù)的創(chuàng)新就從未停止過(guò)。汽車作為一種消費(fèi)產(chǎn)品,已經(jīng)從最初的交通工具變成了一種生活方式,正如今天的智能手機(jī)不再僅僅是一個(gè)打電話的工具而已。通過(guò)持續(xù)的技術(shù)創(chuàng)新和融合,汽車變得更安全,更人性化,更智能,更互聯(lián)。DDS的引入,無(wú)疑是在汽車和互聯(lián)世界之間打開(kāi)的另一扇大門。至于DDS能否在汽車行業(yè)內(nèi)得到更廣泛的應(yīng)用,還需要更全面和更細(xì)致的評(píng)估,但我們期待DDS以其豐富的特性和功能,能夠?yàn)槠噾?yīng)用領(lǐng)域帶來(lái)更多可能性,幫助應(yīng)對(duì)汽車智能化和互聯(lián)化道路上的更多挑戰(zhàn)。
索引文檔
[1] Data Distribution Service (DDS) Version 1.4
[2] DDS Security Version 1.1
[3] The Real-time Publish-Subscribe Protocol DDS Interoperability Wire Protocol (DDSI-RTPSTM) Specification Version 2.3