国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

DDS分布式系統(tǒng)快速開發(fā)

2022-12-30 07:51:36唐江文
關(guān)鍵詞:代碼生成開發(fā)者代碼

唐江文

(中國電子科技集團(tuán)公司 電子科學(xué)研究院,北京 100041)

0 引 言

數(shù)據(jù)分發(fā)服務(wù)(data-distribution service,DDS)是一種發(fā)布訂閱式的通信中間件,它由OMG組織于2004年發(fā)布為國際開放標(biāo)準(zhǔn),并不斷擴(kuò)充發(fā)展至今。DDS引入了虛擬全局?jǐn)?shù)據(jù)空間的概念,在全局?jǐn)?shù)據(jù)空間中,應(yīng)用可以通過讀寫帶有主題的數(shù)據(jù)對(duì)象的方式進(jìn)行通信。同時(shí),DDS提供了QoS參數(shù)配置功能,可以實(shí)現(xiàn)對(duì)可靠性、帶寬、通信截止時(shí)間以及資源上限的靈活控制。DDS可以實(shí)現(xiàn)分布式通信實(shí)體間的解耦,發(fā)布者和訂閱者可以動(dòng)態(tài)加入和退出,使系統(tǒng)具有高擴(kuò)展性;另外,DDS采用組播自動(dòng)發(fā)現(xiàn)的機(jī)制,DDS應(yīng)用可以靈活部署在網(wǎng)絡(luò)中的任一計(jì)算機(jī)設(shè)備上。

目前,DDS廣泛應(yīng)用于各種需要實(shí)時(shí)數(shù)據(jù)交換的場景和領(lǐng)域。文獻(xiàn)[1]在EXata仿真器構(gòu)建的子系統(tǒng)間,使用DDS實(shí)現(xiàn)數(shù)據(jù)交互和時(shí)間同步,提高了大規(guī)模電力通信網(wǎng)的仿真效率;文獻(xiàn)[2]基于DDS實(shí)現(xiàn)了組織靈活、支持實(shí)時(shí)狀態(tài)監(jiān)控與用戶管理的語音通信系統(tǒng);文獻(xiàn)[3]基于DDS實(shí)現(xiàn)了一種分布式的熱處理集散控制監(jiān)控系統(tǒng),用于航天火箭發(fā)動(dòng)機(jī)制造領(lǐng)域;文獻(xiàn)[4]中的ROS2,是基于DDS開發(fā)的多Agent機(jī)器人系統(tǒng)開發(fā)框架,廣泛應(yīng)用于機(jī)器人研究和仿真;文獻(xiàn)[5]基于DDS實(shí)現(xiàn)了航天器軟件通信框架,可以實(shí)現(xiàn)靈活便捷的通信過程。

通過前面各領(lǐng)域的工程實(shí)踐,已經(jīng)充分證明了DDS作為分布式系統(tǒng)的通信中間件,具有的高擴(kuò)展性和高靈活性。但在開發(fā)基于DDS的大規(guī)模分布式系統(tǒng)時(shí)暴露了一項(xiàng)不足之處:缺乏分布式系統(tǒng)建模的能力。這是因?yàn)橛糜贒DS開發(fā)的IDL語言,只描述接口的數(shù)據(jù)類型,而沒有描述主題、消息域,更沒有描述應(yīng)用。這些信息的缺失造成DDS無法像常見的建模語言(例如UML和SysML)那樣方便地進(jìn)行代碼自動(dòng)生成[6,7],進(jìn)而限制了DDS應(yīng)用的開發(fā)效率,不得不使用文檔以文字的形式來描述系統(tǒng)模型,并且編寫大量重復(fù)冗余的代碼,易錯(cuò)難查。

本文擴(kuò)展了IDL語法,添加了topic和domain關(guān)鍵字,從而可以從IDL文件中同時(shí)解析出來接口數(shù)據(jù)類型信息和主題、消息域信息;另外又為應(yīng)用設(shè)計(jì)了應(yīng)用描述XML文件,用于獲取應(yīng)用對(duì)主題的發(fā)布訂閱相關(guān)信息。實(shí)現(xiàn)了編譯器dseappgen,直接為應(yīng)用生成面向主題發(fā)布訂閱的C++代碼文件,并自動(dòng)編譯成動(dòng)態(tài)庫,去除了重復(fù)冗余代碼,大大簡化了開發(fā)者的開發(fā)工作,并降低了出錯(cuò)風(fēng)險(xiǎn)。另外,本文還在自動(dòng)生成的代碼中植入了一些增強(qiáng)功能,比如植入了Lua語言解釋器[8,9],讓開發(fā)者可以進(jìn)行快速仿真;又如Json字符串與DDS消息之間的相互轉(zhuǎn)換,增強(qiáng)了DDS原有的序列化能力;并且植入了輕量級(jí)的Http Server,支持用戶為應(yīng)用進(jìn)行B/S架構(gòu)開發(fā)。

1 DDS通信原理簡介

DDS是通過自動(dòng)發(fā)現(xiàn)協(xié)議實(shí)現(xiàn)與網(wǎng)絡(luò)IP的解耦[10]。只要應(yīng)用位于同一個(gè)支持組播的二層網(wǎng)絡(luò)中,就可以自動(dòng)匹配具有相同主題的發(fā)布者和訂閱者,所以應(yīng)用可以部署運(yùn)行在網(wǎng)絡(luò)中的任何一臺(tái)計(jì)算機(jī)設(shè)備上,這讓開發(fā)者無需關(guān)注網(wǎng)絡(luò)具體的組網(wǎng)結(jié)構(gòu)。

DDS的發(fā)布者和訂閱者的自動(dòng)匹配能力,源自于DDS的自動(dòng)發(fā)現(xiàn)協(xié)議,協(xié)議涉及的主要概念和基本過程如圖1所示。DDS中的通信實(shí)體稱作“參與者(Participant)”,參與者記錄了當(dāng)前計(jì)算機(jī)設(shè)備所有的IP地址和端口,以及共享內(nèi)存的“端口”。當(dāng)應(yīng)用中實(shí)例化一個(gè)參與者時(shí),它會(huì)執(zhí)行參與者發(fā)現(xiàn)協(xié)議(PDP),用PDP寫者(PDPWriter)通過組播的方式將自己的IP地址以及EDP的發(fā)布(Pub)/訂閱(Sub)的讀者(Reader)/寫者(Writer)等信息發(fā)送給其它參與者,其它參與者會(huì)記錄下這位新參與者的信息,并把自己的相應(yīng)信息發(fā)送回來,從而保證每個(gè)參與者都能感知到網(wǎng)絡(luò)中其它參與者的存在,并且知曉與其它參與者的通信方法。

圖1 DDS通信原理:自動(dòng)發(fā)現(xiàn)協(xié)議支撐發(fā)布訂閱通信方式

當(dāng)用戶使用DDS進(jìn)行業(yè)務(wù)數(shù)據(jù)通信時(shí),首先會(huì)定義某個(gè)主題的發(fā)布者(Publisher)/訂閱者(Subscriber),然后關(guān)聯(lián)到用戶寫者(UserWriter)/用戶讀者(UserReader)。此時(shí),參與者會(huì)執(zhí)行終端發(fā)現(xiàn)協(xié)議(EDP),將用戶寫者/用戶讀者的相關(guān)信息,比如主題、消息類型等,發(fā)送給網(wǎng)絡(luò)中需要這些信息的其它參與者,進(jìn)行用戶讀/寫者的匹配,這樣發(fā)布者就知道了其發(fā)布的消息應(yīng)該發(fā)送給哪些訂閱者,從而實(shí)現(xiàn)了發(fā)布訂閱的通信方式。

圖2簡單展示了DDS底層數(shù)據(jù)緩存及收發(fā)模型,DDS在發(fā)送消息時(shí),從更改池(CacheChange Pool)中取出一個(gè)更改(CacheChange,“更改”可以簡單理解為一個(gè)消息),從負(fù)載池(Payload Pool)中取出一個(gè)負(fù)載(Payload),將需要發(fā)送的數(shù)據(jù)序列化后填入負(fù)載,然后掛載到更改中。隨后,更改會(huì)被添加到寫者歷史(Writer History,可以理解為一個(gè)消息隊(duì)列)里,發(fā)送線程會(huì)將寫者歷史中的更改通過指定的傳輸方式(UDP、TCP、共享內(nèi)存)發(fā)送到相應(yīng)接收方。發(fā)送結(jié)束后,該更改會(huì)從寫者歷史中移除,其負(fù)載會(huì)在釋放數(shù)據(jù)后重新放到負(fù)載池中,而該更改也會(huì)被回收到更改池中。接收消息的一方,其內(nèi)存也會(huì)進(jìn)行類似的鏈?zhǔn)窖h(huán)操作。可見,DDS充分利用了內(nèi)存池技術(shù),最大程度地提高了內(nèi)存效率。

圖2 DDS底層數(shù)據(jù)緩存及收發(fā)模型

2 DDS分布式系統(tǒng)開發(fā)流程的改進(jìn)

傳統(tǒng)DDS分布式系統(tǒng)的開發(fā)流程如圖3所示,設(shè)計(jì)人員一側(cè),首先撰寫系統(tǒng)軟件設(shè)計(jì)文檔,然后手動(dòng)編寫IDL文件,由ddsgen生成各接口正反序列化代碼。開發(fā)人員一側(cè),手動(dòng)編寫主題、消息域、主題與接口相關(guān)、主題與發(fā)布訂閱相關(guān)以及大量業(yè)務(wù)代碼,最后和ddsgen自動(dòng)生成的代碼完成編譯鏈接生成DDS應(yīng)用。

圖3 傳統(tǒng)DDS分布式系統(tǒng)的開發(fā)流程

其中存在的問題是,設(shè)計(jì)文檔是一種供人閱讀的、格式相對(duì)自由的文本,無法為開發(fā)提供強(qiáng)制約束。設(shè)計(jì)人員根據(jù)設(shè)計(jì)文檔編寫IDL文件,容易出現(xiàn)謄抄錯(cuò)誤,后期一旦文檔發(fā)生更改需要手動(dòng)進(jìn)行同步,費(fèi)時(shí)費(fèi)力。而且,主題、消息域、主題與接口的關(guān)聯(lián)、主題與發(fā)布訂閱的關(guān)聯(lián)是設(shè)計(jì)內(nèi)容,卻侵入到了開發(fā)人員的代碼中,設(shè)計(jì)和開發(fā)出現(xiàn)交叉,導(dǎo)致設(shè)計(jì)和開發(fā)邊界不清,既加大了開發(fā)者工作量,也讓代碼容易出錯(cuò)。事實(shí)上,設(shè)計(jì)一旦固定下來,業(yè)務(wù)之外的其它代碼基本是固定不變的,完全可以自動(dòng)生成,避免不必要的出錯(cuò)風(fēng)險(xiǎn)。

改進(jìn)后的DDS應(yīng)用開發(fā)流程如圖4所示,由格式化、結(jié)構(gòu)化較強(qiáng)的類代碼文件(IDL文件、應(yīng)用描述XML文件)替代系統(tǒng)軟件設(shè)計(jì)文檔作為原始設(shè)計(jì)輸入,后期系統(tǒng)軟件設(shè)計(jì)文檔可以由這些文件自動(dòng)生成,這就解決了文檔和工程實(shí)現(xiàn)之間難以同步的問題,而且這些類代碼文件還可以通過一些版本管理工具(如Git)進(jìn)行歷史版本管理。之前業(yè)務(wù)代碼之外需要手動(dòng)編寫的代碼也可以通過語法解析和模板生成的方式,進(jìn)行自動(dòng)生成。這樣一來,設(shè)計(jì)和開發(fā)實(shí)現(xiàn)完全解耦,業(yè)務(wù)開發(fā)人員只需要關(guān)心業(yè)務(wù)內(nèi)容,編寫業(yè)務(wù)代碼即可,大大減少了開發(fā)人員的工作量,同時(shí)也避免了出錯(cuò)風(fēng)險(xiǎn)。最后將這些代碼自動(dòng)編譯鏈接,生成DDS應(yīng)用。

圖4 DDS分布式系統(tǒng)的快速開發(fā)流程

自動(dòng)生成代碼的另一個(gè)優(yōu)勢是,還可以根據(jù)解析出來的接口、主題、消息域等元信息,自動(dòng)生成各種增強(qiáng)性功能代碼,這里主要添加了Lua解釋器、Json與接口消息的轉(zhuǎn)換、Http Server、消息記錄、消息統(tǒng)計(jì)等功能,進(jìn)一步增強(qiáng)DDS應(yīng)用的基礎(chǔ)能力。

3 改進(jìn)的IDL編譯器dseappgen關(guān)鍵技術(shù)

前面介紹了DDS分布式系統(tǒng)開發(fā)流程的改進(jìn),而支撐改進(jìn)的核心是dseappgen這個(gè)改進(jìn)的IDL編譯器的實(shí)現(xiàn)。本部分主要介紹dseappgen的關(guān)鍵技術(shù)途徑,分為5個(gè)方面:①新的設(shè)計(jì)輸入;②語法解析;③代碼生成;④Lua解釋器;⑤其它增強(qiáng)功能。

3.1 新的設(shè)計(jì)輸入

前面提到,在新的開發(fā)流程中使用格式化、結(jié)構(gòu)化較強(qiáng)的類代碼文件(IDL文件、應(yīng)用描述XML文件)替代系統(tǒng)軟件設(shè)計(jì)文檔作為原始設(shè)計(jì)輸入。

在包含傳統(tǒng)的IDL文件內(nèi)容,諸如模塊(module)、結(jié)構(gòu)體(struct)、枚舉類型(enum)等等之外,dseappgen又添加了兩個(gè)新的語法關(guān)鍵字——主題(topic)和消息域(domain),具體語法可以見表1。這兩個(gè)關(guān)鍵字描述了系統(tǒng)中有哪些主題和消息域,以及主題與哪個(gè)結(jié)構(gòu)體進(jìn)行關(guān)聯(lián)。從而把主題和消息域的定義,從代碼轉(zhuǎn)移到了IDL文件。IDL文件還加入了@description的注解語法,可以為各種語法元素添加注解,這些注解經(jīng)過dseappgen處理后,可以生成為代碼注釋,以及軟件設(shè)計(jì)文檔,方便閱讀。

表1 topic和domain關(guān)鍵字的基本語法

應(yīng)用描述XML文件,該文件指明了引用哪個(gè)IDL文件,并且描述了該應(yīng)用具體用到了哪些主題,這些主題在哪些消息域中進(jìn)行發(fā)布或是訂閱。dseappgen在獲取這些信息后,一方面可以從IDL中裁減出該應(yīng)用引用到的主題、消息域和接口,屏蔽掉未引用到的,從而加快代碼生成和編譯鏈接效率;另一方面,可以避免未引用主題和接口的干擾,防止應(yīng)用開發(fā)者錯(cuò)誤使用非設(shè)計(jì)的主題和接口。應(yīng)用描述XML文件的基本格式見表2。其中,本文將主題的發(fā)布訂閱方式具體劃分為4種,即INPUT(只訂閱該主題),OUTPUT(只發(fā)布該主題),LOOPBACK(在同一消息域中既發(fā)布也訂閱該主題),CONVERT(在一個(gè)消息域中訂閱該主題,在另一消息域中發(fā)布該主題),方便設(shè)計(jì)者靈活運(yùn)用。

表2 應(yīng)用描述XML文件的基本格式

這兩類設(shè)計(jì)輸入文件,IDL文件是面向系統(tǒng)全局,其內(nèi)容由系統(tǒng)內(nèi)所有應(yīng)用共享,而應(yīng)用描述XML文件是面向具體應(yīng)用,每個(gè)應(yīng)用有一份自己的應(yīng)用描述XML文件,這兩種文件實(shí)現(xiàn)了對(duì)DDS分布式系統(tǒng)的建模。

3.2 語法解析

語法解析是實(shí)現(xiàn)代碼自動(dòng)生成的前提,是實(shí)現(xiàn)用IDL和應(yīng)用描述XML文件替代設(shè)計(jì)文檔的關(guān)鍵技術(shù)。需要用語法解析技術(shù)解析出的元信息包括模塊(module)、結(jié)構(gòu)體(struct)、結(jié)構(gòu)體元素(struct element)、枚舉(enum)、枚舉元素(enum element)、內(nèi)置類型(如short、long等)、主題(topic)、消息域(domain)、應(yīng)用名等,并且要解析出這些元信息之間的關(guān)聯(lián)關(guān)系。

其中,應(yīng)用、應(yīng)用和主題之間的關(guān)聯(lián)關(guān)系可以使用XML解析工具進(jìn)行解析。而描述其它元信息及關(guān)聯(lián)關(guān)系的IDL文件,使用的是經(jīng)過關(guān)鍵字?jǐn)U展后的IDL語法,這里采用ANTLR4進(jìn)行語法分析,該工具在語法分析領(lǐng)域應(yīng)用廣泛[11,12]。核心的語法結(jié)構(gòu)使用廣泛應(yīng)用的巴科斯范式(Backus-Naur form[13],BNF)表示見表3。

表3 語法結(jié)構(gòu)核心部分的巴科斯范式

ANTLR4可以對(duì)語法元素進(jìn)行分析和提取,但語法樹的數(shù)據(jù)結(jié)構(gòu)需要自行設(shè)計(jì)。dseappgen的語法樹主要包括語法元素哈希表,以及表征語法元素關(guān)聯(lián)關(guān)系的樹形鏈表。語法樹構(gòu)建成功之后,就可以支撐后續(xù)步驟——代碼生成——進(jìn)行語法元素查找和遍歷。

3.3 代碼生成

在獲取了各種必要的語法元信息之后,就需要對(duì)具體的DDS應(yīng)用進(jìn)行代碼生成。代碼生成從技術(shù)上來說,是通過一種模板引擎,將代碼模板中待替換的內(nèi)容,替換為相應(yīng)的信息,在本文所研究的場景中,即替換為各種由語法解析分析出來的語法元信息。這里選用的模板引擎是StringTemplate,該引擎靈活高效,簡單易用,而且能夠滿足代碼遞歸生成的需求,該引擎經(jīng)常和ANTLR4配合使用。

在選定代碼生成引擎之后,需要對(duì)代碼模板的結(jié)構(gòu)進(jìn)行設(shè)計(jì)。需要考慮的問題有目標(biāo)生成的代碼結(jié)構(gòu),以及暴露給用戶的C++API。圖5展示了代碼模板的基本結(jié)構(gòu)。在代碼模板中,自動(dòng)生成了與應(yīng)用描述XML文件內(nèi)容相對(duì)應(yīng)的參與者、主題、發(fā)布者、訂閱者等各種DDS的通信概念實(shí)體,從而免去了開發(fā)者手動(dòng)編寫的工作量,而且讓開發(fā)者完全不需要了解這些具體概念。并且這些API將主題名具化到函數(shù)名里(圖5中“xxx”表示的是某個(gè)主題的名字),從而可以讓C++編譯器協(xié)助檢查,尤其是在使用IDE開發(fā)過程中,會(huì)有函數(shù)名自動(dòng)提示,大大降低了開發(fā)者出錯(cuò)風(fēng)險(xiǎn)。與該應(yīng)用無關(guān)的主題不會(huì)出現(xiàn)在生成的API中,也防止了開發(fā)者錯(cuò)誤發(fā)布或訂閱與其無關(guān)的主題。

圖5 代碼模板的基本結(jié)構(gòu)

對(duì)于消息結(jié)構(gòu)體的正反序列化代碼,依然調(diào)用DDS自帶的生成工具(ddsgen)進(jìn)行生成。不過由于每個(gè)應(yīng)用只引用了IDL文件中的部分結(jié)構(gòu)體,所以為了避免生成冗余的正反序列化代碼,這里通過對(duì)語法樹中語法元素的依賴關(guān)系進(jìn)行分析,只提取引用到的必要的語法信息,生成新的精簡過的IDL文件,然后再交給ddsgen處理。其中,語法元素的依賴關(guān)系分析用到了DAG(有向無環(huán)圖)的拓?fù)渑判蛩惴╗14]。

代碼生成還包括各種增強(qiáng)功能,以及CMake編譯文件和配置文件的生成等等。

3.4 Lua解釋器

Lua是一種可以動(dòng)態(tài)解釋執(zhí)行的腳本語言,它具有輕量、方便嵌入集成、執(zhí)行速度快等優(yōu)點(diǎn),在許多大型軟件中作為嵌入式腳本語言存在。這里,引入Lua腳本語言,進(jìn)一步提高DDS分布式系統(tǒng)的開發(fā)效率,并賦予DDS應(yīng)用隨時(shí)編寫隨時(shí)運(yùn)行的動(dòng)態(tài)執(zhí)行能力,方便分布式系統(tǒng)的功能調(diào)試和仿真,尤其適用于功能原型的快速搭建,以及消息激勵(lì)器、算法仿真器等模擬器的開發(fā)。

Lua腳本由Lua解釋器加載執(zhí)行,本文將Lua解釋器內(nèi)嵌到DDS應(yīng)用中,并將DDS消息發(fā)布訂閱相關(guān)API以Lua語言的形式暴露給用戶。這里需要解決的主要問題是Lua對(duì)DDS C++接口的封裝,Lua數(shù)據(jù)結(jié)構(gòu)與DDS消息結(jié)構(gòu)體的轉(zhuǎn)換,暴露給用戶的Lua API的設(shè)計(jì)。圖5也展示了DDS應(yīng)用中Lua相關(guān)部分的代碼模板結(jié)構(gòu)。代碼模板將發(fā)布者和訂閱者封裝成Lua對(duì)象,并通過Lua Table和C++結(jié)構(gòu)的轉(zhuǎn)換實(shí)現(xiàn)消息在Lua API和DDS C++API之間的傳遞,用戶只需要獲取Lua封裝的相應(yīng)主題的發(fā)布者和訂閱者對(duì)象,即可實(shí)現(xiàn)消息的發(fā)布訂閱操作。

3.5 其它增強(qiáng)功能

考慮到DDS應(yīng)用開發(fā)者在日常開發(fā)過程中的一些常用需求,又在生成的代碼中加入了一些增強(qiáng)功能。

3.5.1 Json字符串與DDS消息的轉(zhuǎn)換

開發(fā)者經(jīng)常需要通過打印消息內(nèi)容進(jìn)行功能調(diào)試,然而實(shí)際系統(tǒng)中用到的DDS消息往往字段較多,逐字段打印會(huì)加大開發(fā)者工作量。前面通過語法解析,已經(jīng)獲取了DDS消息每個(gè)字段的名稱和類型,因此可以通過代碼生成的方法自動(dòng)生成DDS消息與Json字符串之間的互相轉(zhuǎn)換代碼(這里用到了C++Json庫nlohmann)。這樣,需要打印消息內(nèi)容時(shí)就可以將DDS消息以格式化良好的Json字符串形式打印,大大減輕了開發(fā)者的工作負(fù)擔(dān)。另外,開發(fā)者也可以在代碼中使用Json字符串作為DDS消息的字面值,然后轉(zhuǎn)換為DDS消息結(jié)構(gòu)體,進(jìn)而進(jìn)行消息發(fā)布,這樣具有更好的可讀性。

3.5.2 Http Server的嵌入

DDS應(yīng)用多是運(yùn)行在服務(wù)器的后臺(tái)程序,若想與DDS應(yīng)用在運(yùn)行時(shí)進(jìn)行交互,會(huì)比較困難,因此在DDS應(yīng)用中嵌入了輕量級(jí)的Http Server——Boost Beast[15],它允許用戶通過瀏覽器加載Web頁面,執(zhí)行Javascript代碼,可以進(jìn)行HTTP請(qǐng)求應(yīng)答通信,支持WebSocket,當(dāng)用戶有運(yùn)行時(shí)交互或者圖形化交互需求時(shí),可以開啟該輕量級(jí)Http Server。

3.5.3 消息記錄和統(tǒng)計(jì)

DDS分布式系統(tǒng)中往往記錄DDS消息,以方便對(duì)系統(tǒng)進(jìn)行數(shù)據(jù)分析或故障排查。由于在代碼生成中已經(jīng)掌控了DDS消息的發(fā)布和訂閱,因此在發(fā)布和訂閱過程中加入對(duì)消息的記錄和統(tǒng)計(jì)。消息記錄的內(nèi)容包括消息Json字符串、應(yīng)用名稱、發(fā)布訂閱時(shí)間等,使用Elasticsearch作為記錄存儲(chǔ)數(shù)據(jù)庫,以支持快速高效的記錄查詢。消息統(tǒng)計(jì)主要統(tǒng)計(jì)的是消息的發(fā)布訂閱次數(shù)、頻率,通過Http Server開放了相應(yīng)Restful Api,支持當(dāng)前流行的數(shù)據(jù)采集平臺(tái)Prometheus進(jìn)行訪問采集。

圖6給出了dseappgen編譯生成的可執(zhí)行文件內(nèi)部各功能的組成、協(xié)作以及與外部的交互。

圖6 編譯生成的可執(zhí)行文件內(nèi)部功能結(jié)構(gòu)

4 簡單實(shí)例

這里以一個(gè)簡單的發(fā)布訂閱實(shí)例說明使用dseappgen編譯器后給DDS分布式系統(tǒng)開發(fā)帶來的便利。

為了實(shí)現(xiàn)如圖7所示的發(fā)布訂閱通信功能,表4是該DDS分布式系統(tǒng)的IDL文件,表5是應(yīng)用pubtest的應(yīng)用描述XML文件,表6是應(yīng)用subtest的應(yīng)用描述XML文件,這3個(gè)文件由設(shè)計(jì)者編寫。

圖7 一個(gè)簡單的發(fā)布訂閱通信實(shí)例

表4 示例IDL文件test.idl

表5 示例應(yīng)用pubtest的應(yīng)用描述XML文件pubtest.xml

表6 示例應(yīng)用subtest的應(yīng)用描述XML文件subtest.xml

然后設(shè)計(jì)者使用表7中命令調(diào)用dseappgen生成兩個(gè)可執(zhí)行程序pubtest和subtest(dseappgen也可以生成供C++開發(fā)者使用的動(dòng)態(tài)庫,這里以生成Lua解釋器為例)。

表7 使用dseappgen編譯生成可執(zhí)行程序

接下來,開發(fā)者可以為pubtest和subtest撰寫Lua腳本實(shí)現(xiàn)消息的發(fā)布訂閱。發(fā)布Lua腳本見表8,訂閱Lua腳本見表9。

表8 示例應(yīng)用pubtest的腳本pubtest.lua

表9 示例應(yīng)用subtest的腳本subtest.lua

分別啟動(dòng)pubtest和subtest,將會(huì)看到subtest打印出pubtest發(fā)布的消息。從該示例可以直觀看出,設(shè)計(jì)者和開發(fā)者的工作是解耦的。設(shè)計(jì)者使用IDL和應(yīng)用描述XML文件就完成了整個(gè)分布式系統(tǒng)的應(yīng)用組成和消息互聯(lián)的設(shè)計(jì),也就是完成了系統(tǒng)建模。通過dseappgen自動(dòng)生成可執(zhí)行文件后,即可將工作轉(zhuǎn)移到開發(fā)者進(jìn)行業(yè)務(wù)開發(fā)。dseappgen的代碼生成隱藏了DDS諸多概念,使得發(fā)布訂閱API變得非常簡單,即使并不了解DDS的各種概念,也可以簡單幾行代碼輕松實(shí)現(xiàn)發(fā)布訂閱通信。

5 優(yōu)勢分析

本文在實(shí)現(xiàn)改進(jìn)的IDL編譯器dseappgen的基礎(chǔ)上,提出了新的DDS分布式系統(tǒng)快速開發(fā)流程,主要的優(yōu)勢有以下幾點(diǎn):

(1)賦予IDL語言進(jìn)行分布式系統(tǒng)建模的能力,貫徹了基于模型的系統(tǒng)工程化(MBSE)思想,IDL文件和應(yīng)用描述XML文件完全建模了整個(gè)分布式系統(tǒng)的框架和通信結(jié)構(gòu),方便項(xiàng)目管理者從全局掌握項(xiàng)目拓?fù)淝闆r。

(2)傳統(tǒng)DDS分布式系統(tǒng)開發(fā)方式,主題和消息域的定義是侵入到代碼中的,無法實(shí)現(xiàn)設(shè)計(jì)和開發(fā)的解耦,而新的開發(fā)流程中,主題和消息域定義在IDL文件中,應(yīng)用的主題和消息域使用情況定義在應(yīng)用描述XML文件中,從而使得設(shè)計(jì)者和開發(fā)者完全解耦。

(3)dseappgen生成的動(dòng)態(tài)庫或Lua解釋器,只包含應(yīng)用描述XML文件中涉及到的主題的API,避免了開發(fā)者發(fā)布訂閱無關(guān)主題,方便項(xiàng)目管理者對(duì)主題訪問權(quán)限進(jìn)行管理;而且API是具化到函數(shù)名中的,C++編譯器和Lua解釋器會(huì)協(xié)助檢查,防止開發(fā)者錯(cuò)誤使用。

(4)自動(dòng)生成的動(dòng)態(tài)庫和Lua解釋器,隱藏了DDS內(nèi)部復(fù)雜概念,使得發(fā)布訂閱API更加簡化,一行代碼實(shí)現(xiàn)通信,大大減少了開發(fā)者的代碼量,尤其是在動(dòng)輒幾百個(gè)主題的大型項(xiàng)目中,大大提高了開發(fā)效率,降低了項(xiàng)目風(fēng)險(xiǎn)。

(5)Lua語言的嵌入,以及各種增強(qiáng)功能的加入,讓DDS應(yīng)用更適合快速開發(fā)、快速測試、快速仿真。

(6)與當(dāng)前熱門的機(jī)器人操作系統(tǒng)ROS2[16]相比,ROS2同樣使用DDS進(jìn)行各應(yīng)用節(jié)點(diǎn)之間的通信,并且定義了參數(shù)、服務(wù)等概念,并提供了基于Python的腳本開發(fā)方式,加上開源社區(qū)為ROS2提供了豐富的自動(dòng)化控制領(lǐng)域的第三方庫,是目前自動(dòng)化領(lǐng)域設(shè)計(jì)仿真的首選框架。而本文更關(guān)注的是,為大型DDS分布式系統(tǒng)開發(fā),提供一種開發(fā)模式,讓設(shè)計(jì)者和開發(fā)者為完成項(xiàng)目更好更高效地進(jìn)行合作,而ROS2并沒有在這方面提供相應(yīng)的解決方案,而且本文也提供了基于Lua的腳本開發(fā)方式。

6 結(jié)束語

本文結(jié)合當(dāng)前DDS分布式系統(tǒng)工程開發(fā)現(xiàn)狀,對(duì)工程開發(fā)實(shí)踐中遇到的問題進(jìn)行了分析,設(shè)計(jì)實(shí)現(xiàn)了改進(jìn)的IDL編譯器dseappgen,并基于此工具提出DDS分布式系統(tǒng)開發(fā)流程,其中涉及到的技術(shù)手段包括語法解析、代碼生成、Lua解釋器等等。新方法貫徹了MBSE的思想,將工程實(shí)踐中設(shè)計(jì)和開發(fā)進(jìn)行解耦合,一方面讓設(shè)計(jì)獨(dú)立于開發(fā),不需要將設(shè)計(jì)侵入代碼,另一方面也節(jié)省了開發(fā)者的很多工作量,尤其是Lua解釋器的引入,讓DDS應(yīng)用擁有了隨時(shí)修改隨時(shí)運(yùn)行的能力,非常適用于算法驗(yàn)證、消息激勵(lì)等模擬器的開發(fā)。

目前dseappgen及其帶來的新開發(fā)模式在很多項(xiàng)目中開始了實(shí)踐和應(yīng)用,很大程度加快了項(xiàng)目的設(shè)計(jì)、開發(fā)、測試進(jìn)度。

為了繼續(xù)推進(jìn)DDS分布式系統(tǒng)開發(fā)的工程化,未來還將基于本文提出的開發(fā)流程,構(gòu)建具有圖形界面的“低代碼[17]”開發(fā)平臺(tái),可以用于工程的系統(tǒng)原型快速搭建,提升工程開發(fā)的自動(dòng)化,降低工程開發(fā)的復(fù)雜性。

猜你喜歡
代碼生成開發(fā)者代碼
Lustre語言可信代碼生成器研究進(jìn)展
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
代碼生成技術(shù)在軟件開發(fā)中的應(yīng)用
電子世界(2016年15期)2016-08-29 02:14:28
16%游戲開發(fā)者看好VR
CHIP新電腦(2016年3期)2016-03-10 13:06:42
基于XML的代碼自動(dòng)生成工具
電子科技(2015年2期)2015-12-20 01:09:20
iOS開發(fā)者調(diào)查
電腦迷(2015年8期)2015-05-30 12:27:10
iOS開發(fā)者調(diào)查
電腦迷(2015年4期)2015-05-30 05:24:09
石城县| 郧西县| 女性| 梨树县| 绍兴市| 油尖旺区| 湄潭县| 筠连县| 新余市| 革吉县| 武义县| 纳雍县| 苗栗市| 阿拉善右旗| 高雄市| 西昌市| 万盛区| 泸州市| 岑溪市| 高青县| 射阳县| 渝北区| 绥化市| 军事| 郸城县| 顺昌县| 泾阳县| 文登市| 罗源县| 商南县| 稻城县| 尼勒克县| 勃利县| 寻乌县| 蕲春县| 麟游县| 凤山市| 长治市| 巴林右旗| 龙胜| 株洲县|