【OpenDDS开发指南V3.20】第一章:介绍
OpenDDS 是用于實(shí)時(shí)系統(tǒng)規(guī)范 v1.4(OMG Document formal/2015-04-10)的 OMG 數(shù)據(jù)分發(fā)服務(wù) (DDS) 和實(shí)時(shí)發(fā)布訂閱有線協(xié)議DDS Interoperability Wire Protocol Specificatio (DDSI- RTPS)v2.3(OMG Document formal/2019-04-03)。
OpenDDS 還實(shí)現(xiàn)了 DDS 安全規(guī)范 v1.1(OMG Document formal/2018-04-01)和 DDS XTypes v1.3(OMG Document formal/2020-02-04)。
OpenDDS 由 Object Computing, Inc. (OCI) 贊助,可在 https://www.opendds.org/ 獲得。本開(kāi)發(fā)人員指南基于 OpenDDS 的 3.20 版本。
DDS 定義了一種服務(wù),用于在分布式應(yīng)用程序的參與者之間有效地分發(fā)應(yīng)用程序數(shù)據(jù)。此服務(wù)不綁定到 CORBA。該規(guī)范提供了一個(gè)平臺(tái)獨(dú)立模型 (PIM) 以及一個(gè)將 PIM 映射到 OMG IDL 實(shí)現(xiàn)的平臺(tái)特定模型 (PSM)。
有關(guān) DDS 的更多詳細(xì)信息,開(kāi)發(fā)人員應(yīng)參考 DDS 規(guī)范(OMG Document formal/2015-04-10),因?yàn)樗瑢?duì)所有服務(wù)功能的深入介紹。
注意:OpenDDS 當(dāng)前實(shí)現(xiàn)了 OMG DDS 1.4 版規(guī)范。 有關(guān)更多信息,請(qǐng)參閱 https://www.opendds.org/ 中的合規(guī)信息。
DCPS 概述
在本節(jié)中,我們將介紹 DCPS 層的主要概念和實(shí)體,并討論它們?nèi)绾谓换ズ蛥f(xié)同工作。
基本概念
圖 1-1 顯示了 DDS DCPS 層的概覽。 以下小節(jié)定義了此圖中顯示的概念。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-VcUUwFh1-1652410199857)(https://note.youdao.com/yws/res/2874/WEBRESOURCE8b0550fd5df1608881ecff7b6d1cbb7d)]
Domain(域)
Domain是 DCPS 中的基本劃分單元。
每個(gè)其他實(shí)體都屬于一個(gè)Domain,并且只能與同一Domain中的其他實(shí)體交互。
應(yīng)用程序代碼可以自由地與多個(gè)Domain交互,但必須通過(guò)屬于不同Domain的單獨(dú)實(shí)體來(lái)進(jìn)行。
DomainParticipant(域參與者)
域參與者是應(yīng)用程序在特定域中交互的入口點(diǎn)。
域參與者是許多涉及寫入或讀取數(shù)據(jù)的對(duì)象的工廠。
Topic
主題是發(fā)布和訂閱應(yīng)用程序之間交互的基本方式。
每個(gè)主題在域中都有一個(gè)唯一的名稱和它發(fā)布的特定數(shù)據(jù)類型。
每個(gè)主題數(shù)據(jù)類型都可以指定零個(gè)或多個(gè)構(gòu)成其鍵的字段。發(fā)布數(shù)據(jù)時(shí),發(fā)布過(guò)程始終指定主題。 訂閱者通過(guò)主題請(qǐng)求數(shù)據(jù)。
在 DCPS 術(shù)語(yǔ)中,您針對(duì)某個(gè)主題的不同實(shí)例發(fā)布單獨(dú)的數(shù)據(jù)樣本。每個(gè)實(shí)例都與鍵的唯一值相關(guān)聯(lián)。 發(fā)布過(guò)程通過(guò)對(duì)每個(gè)樣本使用相同的鍵值,在同一實(shí)例上發(fā)布多個(gè)數(shù)據(jù)樣本。
DataWriter
發(fā)布應(yīng)用程序代碼使用數(shù)據(jù)寫入器將值傳遞給 DDS。每個(gè)數(shù)據(jù)編寫器都綁定到一個(gè)特定的主題。
應(yīng)用程序使用數(shù)據(jù)編寫器的類型特定接口發(fā)布關(guān)于該主題的示例。 數(shù)據(jù)寫入者負(fù)責(zé)編組數(shù)據(jù)并將其傳遞給發(fā)布者進(jìn)行傳輸。
Publisher(發(fā)布者)
發(fā)布者負(fù)責(zé)獲取發(fā)布的數(shù)據(jù)并將其傳播給域中的所有相關(guān)訂閱者。 所采用的確切機(jī)制留給服務(wù)實(shí)現(xiàn)。
Subscriber(訂閱者)
訂閱者從發(fā)布者接收數(shù)據(jù)并將其傳遞給與其連接的任何相關(guān)數(shù)據(jù)讀取器。
DataReader(數(shù)據(jù)讀取器)
數(shù)據(jù)讀取器從訂閱者那里獲取數(shù)據(jù),將其分解為適合該主題的類型,然后將樣本交付給應(yīng)用程序。 每個(gè)數(shù)據(jù)閱讀器都綁定到一個(gè)特定的主題。 應(yīng)用程序使用數(shù)據(jù)讀取器的特定類型接口來(lái)接收樣本。
Built-In Topics(內(nèi)置主題)
DDS 規(guī)范定義了許多內(nèi)置于 DDS 實(shí)現(xiàn)的主題。
訂閱這些內(nèi)置主題使應(yīng)用程序開(kāi)發(fā)人員可以訪問(wèn)正在使用的域的狀態(tài),包括注冊(cè)了哪些主題、連接和斷開(kāi)了哪些數(shù)據(jù)讀取器和數(shù)據(jù)寫入器,以及各種實(shí)體的 QoS 設(shè)置。
訂閱時(shí),應(yīng)用程序會(huì)收到指示域內(nèi)實(shí)體更改的樣本。 下表顯示了 DDS 規(guī)范中定義的內(nèi)置主題:
| DCPSParticipant | 每個(gè)實(shí)例代表一個(gè)域參與者 |
| DCPSTopic | 每個(gè)實(shí)例代表一個(gè)普通(非內(nèi)置)主題 |
| DCPSPublication | 每個(gè)實(shí)例代表一個(gè)數(shù)據(jù)寫入器 |
| DCPSSubscription | 每個(gè)實(shí)例代表一個(gè)數(shù)據(jù)讀取器 |
服務(wù)質(zhì)量政策
DDS 規(guī)范定義了許多服務(wù)質(zhì)量 (QoS) 策略,應(yīng)用程序使用這些策略來(lái)指定其對(duì)服務(wù)的 QoS 要求。
參與者指定他們需要從服務(wù)中獲得什么行為,而服務(wù)決定如何實(shí)現(xiàn)這些行為。
這些策略可以應(yīng)用于各種 DCPS實(shí)體(主題、數(shù)據(jù)寫入器、數(shù)據(jù)讀取器、發(fā)布者、訂閱者、域參與者),盡管并非所有策略都對(duì)所有類型的實(shí)體都有效。
訂閱者和發(fā)布者使用請(qǐng)求與提供 (RxO) 模型進(jìn)行匹配。
訂閱者請(qǐng)求一組最低要求的策略。 發(fā)布者向潛在訂閱者提供一組 QoS 策略。 然后,DDS 實(shí)現(xiàn)嘗試將請(qǐng)求的策略與提供的策略匹配; 如果這些策略是兼容的,那么就形成了關(guān)聯(lián)。
OpenDDS 目前實(shí)施的策略將在第 3 章詳細(xì)討論。
監(jiān)聽(tīng)
DCPS 層為每個(gè)實(shí)體定義了一個(gè)回調(diào)接口,允許應(yīng)用程序進(jìn)程“監(jiān)聽(tīng)”與該實(shí)體相關(guān)的某些狀態(tài)更改或事件。 例如,當(dāng)有數(shù)據(jù)值可供讀取時(shí),會(huì)通知數(shù)據(jù)讀取器偵聽(tīng)器。
條件
條件和等待集允許在 DDS 中檢測(cè)感興趣的事件時(shí)替代偵聽(tīng)器。
一般模式是應(yīng)用程序創(chuàng)建特定類型的 Condition 對(duì)象,例如 StatusCondition,并將其附加到 WaitSet。
-
應(yīng)用程序在 WaitSet 上等待,直到一個(gè)或多個(gè)條件變?yōu)檎妗?/p>
-
應(yīng)用程序調(diào)用對(duì)相應(yīng)實(shí)體對(duì)象的操作以提取必要的信息。
-
DataReader 接口還具有采用ReadCondition 參數(shù)的操作。
-
QueryCondition 對(duì)象作為 ContentSubscription Profile 實(shí)現(xiàn)的一部分提供。 QueryCondition 接口擴(kuò)展了 ReadCondition 接口。
penDDS 實(shí)施
規(guī)范
OpenDDS 符合 OMG DDS 和 OMG DDSI-RTPS 規(guī)范。
該合規(guī)性的詳細(xì)信息如下。 OpenDDS 還實(shí)現(xiàn)了 OMG DDS 安全規(guī)范。 符合該規(guī)范的詳細(xì)信息在第 14.8 節(jié)中。
XTypes 合規(guī)性的詳細(xì)信息在第 16.8 和 16.9 節(jié)中。
DDS 規(guī)范
DDS 規(guī)范的第 2 節(jié)定義了 DDS 實(shí)施的五個(gè)合規(guī)點(diǎn):
OpenDDS 符合整個(gè) DDS 規(guī)范(包括所有可選配置文件)。 這包括實(shí)施所有服務(wù)質(zhì)量政策,并附有以下說(shuō)明:
- RELIABILITY.kind = RELIABLE 受RTPS_UDP 傳輸、TCP 傳輸或IP 多播傳輸(配置為可靠時(shí))支持。
- TRANSPORT_PRIORITY 未實(shí)現(xiàn)為可更改的。 盡管 DDS 規(guī)范的 1.5 版尚未發(fā)布,但 OpenDDS 包含了為該版本計(jì)劃的一些更改,這些更改是穩(wěn)健實(shí)施所需的:
- DDS15-257:IDL 類型 BuiltinTopicKey_t 是一個(gè)包含
16 個(gè)八位字節(jié)的數(shù)組
- DDS15-257:IDL 類型 BuiltinTopicKey_t 是一個(gè)包含
DDSI-RTPS 規(guī)范
OpenDDS 實(shí)現(xiàn)符合 OMG DDSI-RTPS 規(guī)范的要求。
OpenDDS RTPS 實(shí)施說(shuō)明
OMG DDSI-RTPS 規(guī)范(formal/2019-04-03)提供了實(shí)施聲明,但并非合規(guī)性要求。 在使用 OpenDDS RTPS 功能進(jìn)行傳輸和/或發(fā)現(xiàn)時(shí),應(yīng)考慮以下事項(xiàng)。
DDSI-RTPS 規(guī)范的章節(jié)編號(hào)隨每個(gè)項(xiàng)目一起提供,以供進(jìn)一步參考。
OpenDDS 中未實(shí)現(xiàn)的項(xiàng)目:
OpenDDS 可能仍然會(huì)丟棄任何相關(guān)閱讀器不需要的樣本(由于內(nèi)容過(guò)濾)——這是在傳輸層之上完成的
– OpenDDS 將使用 Directed Write 參數(shù),如果它出現(xiàn)在傳入消息中(例如,由不同 DDS 實(shí)現(xiàn)生成的消息)
IDL 規(guī)范
OMG IDL 在 OpenDDS 代碼庫(kù)和下游以幾種不同的方式使用
使用它的地方:
- OpenDDS 附帶的文件(例如 dds/DdsDcpsTopic.idl)定義了中間件庫(kù)和應(yīng)用程序之間的 API 部分。 這稱為 OMG IDL 平臺(tái)特定模型 (PSM)。
- 除了 C++ 或 Java 的源代碼文件之外,OpenDDS 的用戶還可以編寫 IDL 文件。
本節(jié)只描述后者的使用。
IDL 規(guī)范(4.2 版)使用術(shù)語(yǔ)“構(gòu)建塊”來(lái)定義某些工具可能支持的整個(gè) IDL 語(yǔ)法的子集。
OpenDDS 支持以下構(gòu)建塊,下面列出了注釋/警告:
- 核心數(shù)據(jù)類型
- 對(duì)“固定”數(shù)據(jù)類型(定點(diǎn)小數(shù))的支持不完整。
- 匿名類型
- 當(dāng)匿名類型作為序列/數(shù)組實(shí)例直接作為結(jié)構(gòu)字段類型出現(xiàn)時(shí),對(duì)匿名類型的支持有限。 建議使用顯式命名的類型。
- 注釋
- 有關(guān)支持的內(nèi)置注釋的詳細(xì)信息,請(qǐng)參閱第 2.1.1 和 16.6 節(jié)。
- 還支持用戶定義的注釋類型。
- 擴(kuò)展數(shù)據(jù)類型
- 整數(shù)類型 int8、int16、int32 和 int64 以及無(wú)符號(hào)版本
- 支持它們,例如 uint32。
- 不支持構(gòu)建塊的其余部分。
DDS 規(guī)范的擴(kuò)展
DDS IDL 模塊(C++ 命名空間、Java 包)中的數(shù)據(jù)類型、接口和常量直接對(duì)應(yīng)于 DDS 規(guī)范,只有極少數(shù)例外:
? DDS::SampleInfo 包含一個(gè)以“opendds_reserved”開(kāi)頭的額外字段
? 特定類型的DataReader(包括那些用于內(nèi)置主題的)具有額外的操作read_instance_w_condition() 和take_instance_w_condition()。
OpenDDS 模塊/命名空間/包中的各種類和接口提供了額外的擴(kuò)展行為。 其中包括 Recorder 和 Replayer 等功能(參見(jiàn)第 12 章)以及:
? OpenDDS::DCPS::TypeSupport 添加了 DDS 規(guī)范中沒(méi)有的 unregister_type() 操作。
? OpenDDS::DCPS::ALL_STATUS_MASK、NO_STATUS_MASK 和 DEFAULT_STATUS_MASK 是 DDS::Entity、DDS::StatusCondition 和各種 create_*() 操作使用的 DDS::StatusMask 類型的有用常量。
OpenDDS 架構(gòu)
本節(jié)簡(jiǎn)要概述了 OpenDDS 的實(shí)現(xiàn)、它的特性以及它的一些組件。 $DDS_ROOT 環(huán)境變量應(yīng)該指向 OpenDDS 發(fā)行版的基本目錄。 OpenDDS 的源代碼可以在 $DDS_ROOT/dds/ 目錄下找到。 DDS 測(cè)試可以在 $DDS_ROOT/tests/ 下找到。
設(shè)計(jì)理念
OpenDDS 實(shí)現(xiàn)和 API 基于對(duì) OMG IDL PSM 的相當(dāng)嚴(yán)格的解釋。
在幾乎所有情況下,OMG 的 IDL-to-C++ 語(yǔ)言映射都用于定義 DDS 規(guī)范中的 IDL 如何映射到 OpenDDS 向客戶端公開(kāi)的 C++ API。
與 OMG IDL PSM 的主要偏差是本地接口用于實(shí)體和各種其他接口。 這些在 DDS 規(guī)范中被定義為不受約束的(非本地)接口。 將它們定義為本地接口可以提高性能,減少內(nèi)存使用,簡(jiǎn)化客戶端與這些接口的交互,并使客戶端更容易構(gòu)建自己的實(shí)現(xiàn).
可擴(kuò)展傳輸框架 (ETF)
OpenDDS 使用 DDS 規(guī)范定義的 IDL 接口來(lái)初始化和控制服務(wù)的使用。
數(shù)據(jù)傳輸是通過(guò)特定于 OpenDDS 的傳輸框架完成的,該框架允許服務(wù)與各種傳輸協(xié)議一起使用。
這被稱為可插拔傳輸,并使 OpenDDS 的可擴(kuò)展性成為其架構(gòu)的重要組成部分。 OpenDDS 目前支持 TCP/IP、UDP/IP、IP 多播、共享內(nèi)存和 RTPS_UDP 傳輸協(xié)議,如圖 1-2 所示。
傳輸通常通過(guò)配置文件指定,并附加到發(fā)布者和訂閱者進(jìn)程中的各種實(shí)體。 有關(guān)配置 ETF 組件的詳細(xì)信息,請(qǐng)參閱第 7.4.4 節(jié)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-iJVPmlo9-1652410199858)(https://note.youdao.com/yws/res/2971/WEBRESOURCE0f1e9d5a37f72b244d07554ab3b0cd27)]
ETF 使應(yīng)用程序開(kāi)發(fā)人員能夠?qū)崿F(xiàn)他們自己的定制傳輸。 實(shí)現(xiàn)自定義傳輸涉及專門化傳輸框架中定義的許多類。
udp 傳輸提供了開(kāi)發(fā)人員在創(chuàng)建自己的實(shí)現(xiàn)時(shí)可以使用的良好基礎(chǔ)。 有關(guān)詳細(xì)信息,請(qǐng)參閱 $DDS_ROOT/dds/DCPS/transport/udp/ 目錄。
DDS Discovery
DDS 應(yīng)用程序必須通過(guò)某個(gè)中央代理或某個(gè)分布式方案來(lái)發(fā)現(xiàn)彼此。
OpenDDS 的一個(gè)重要特性是 DDS 應(yīng)用程序可以配置為使用 DCPSInfoRepo 或 RTPS 發(fā)現(xiàn)來(lái)執(zhí)行發(fā)現(xiàn),但在數(shù)據(jù)寫入器和數(shù)據(jù)讀取器之間使用不同的傳輸類型進(jìn)行數(shù)據(jù)傳輸。
DDS 規(guī)范(正式/2015-04-10)將發(fā)現(xiàn)的細(xì)節(jié)留給實(shí)現(xiàn)。
在 DDS 實(shí)現(xiàn)之間的互操作性的情況下,OMG DDSI-RTPS(正式/2014-09-01)規(guī)范提供了對(duì)等發(fā)現(xiàn)風(fēng)格的要求。
OpenDDS 提供了兩個(gè)發(fā)現(xiàn)選項(xiàng):
DCPSInfoRepo 的集中式發(fā)現(xiàn)
OpenDDS 實(shí)現(xiàn)了一個(gè)名為 DCPS 信息存儲(chǔ)庫(kù) (DCPSInfoRepo) 的獨(dú)立服務(wù)來(lái)實(shí)現(xiàn)集中式發(fā)現(xiàn)方法。
它被實(shí)現(xiàn)為 CORBA 服務(wù)器。
當(dāng)客戶請(qǐng)求訂閱某個(gè)主題時(shí),DCPS 信息庫(kù)會(huì)定位該主題并通知任何現(xiàn)有發(fā)布者新訂閱者的位置。每當(dāng)在非 RTPS 配置中使用 OpenDDS 時(shí),都需要運(yùn)行 DCPSInfoRepo 進(jìn)程。
RTPS 配置不使用 DCPSInfoRepo。 DCPSInfoRepo 不參與數(shù)據(jù)傳播,其作用僅限于發(fā)現(xiàn)彼此的 OpenDDS 應(yīng)用程序。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-b68Jxii6-1652410199858)(https://note.youdao.com/yws/res/2983/WEBRESOURCEb3ef55e501340bf47c2752d76a29db3f)]
應(yīng)用程序開(kāi)發(fā)人員可以自由運(yùn)行多個(gè)信息存儲(chǔ)庫(kù),每個(gè)存儲(chǔ)庫(kù)管理自己的非重疊 DCPS 域集。
還可以使用多個(gè)存儲(chǔ)庫(kù)來(lái)操作域,從而形成分布式虛擬存儲(chǔ)庫(kù)。 這稱為存儲(chǔ)庫(kù)聯(lián)合。 為了讓各個(gè)存儲(chǔ)庫(kù)參與聯(lián)合,每個(gè)存儲(chǔ)庫(kù)都必須在啟動(dòng)時(shí)指定自己的聯(lián)合標(biāo)識(shí)符值(32 位數(shù)值)。 有關(guān)存儲(chǔ)庫(kù)聯(lián)合的更多信息,請(qǐng)參見(jiàn) 9.2。
使用 RTPS 的點(diǎn)對(duì)點(diǎn)發(fā)現(xiàn)
OpenDDS 功能可以滿足需要對(duì)等發(fā)現(xiàn)模式的 DDS 應(yīng)用程序。
這種發(fā)現(xiàn)方式只能通過(guò)使用當(dāng)前版本的 RTPS 協(xié)議來(lái)完成。
這種簡(jiǎn)單的發(fā)現(xiàn)形式是通過(guò)對(duì)運(yùn)行在應(yīng)用程序進(jìn)程中的 DDS 應(yīng)用程序數(shù)據(jù)讀取器和數(shù)據(jù)寫入器的簡(jiǎn)單配置來(lái)完成的,如圖 1-4 所示。
當(dāng)每個(gè)參與進(jìn)程為其數(shù)據(jù)讀取器和寫入器激活 OpenDDS 中的 DDSI-RTPS 發(fā)現(xiàn)機(jī)制時(shí),使用默認(rèn)或配置的網(wǎng)絡(luò)端口創(chuàng)建網(wǎng)絡(luò)端點(diǎn),以便 DDS 參與者可以開(kāi)始宣傳其數(shù)據(jù)讀取器和數(shù)據(jù)寫入器的可用性。
一段時(shí)間后,那些根據(jù)標(biāo)準(zhǔn)相互尋找的人將找到彼此,并根據(jù)可擴(kuò)展傳輸框架 (ETF) 中討論的配置的可插拔傳輸建立連接。在第 7.4.1.1 節(jié)和第 7.4.5.5 節(jié)中討論了這種靈活配置方法的更詳細(xì)描述。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-dGl90RQQ-1652410199858)(https://note.youdao.com/yws/res/2991/WEBRESOURCE97d86e139a72c587a19c7a3ec93069db)]
以下是開(kāi)發(fā)人員在開(kāi)發(fā)和部署使用 RTPS 發(fā)現(xiàn)的應(yīng)用程序時(shí)需要考慮的其他實(shí)施限制:
有關(guān) RTPS 發(fā)現(xiàn)如何發(fā)生的更多詳細(xì)信息,可以在實(shí)時(shí)發(fā)布-訂閱有線協(xié)議 DDS 互操作性有線協(xié)議規(guī)范 (DDSI-RTPS) v2.2 的第 8.5 節(jié)中找到非常好的閱讀參考(OMG 文件正式/2014-09-01)。
Threading
OpenDDS 創(chuàng)建自己的 ORB(當(dāng)需要時(shí))以及運(yùn)行該 ORB 的單獨(dú)線程。
它還使用自己的線程來(lái)處理傳入和傳出的傳輸 I/O。創(chuàng)建一個(gè)單獨(dú)的線程以在意外連接關(guān)閉時(shí)清理資源。
您的應(yīng)用程序可能會(huì)通過(guò) DCPS 的偵聽(tīng)器機(jī)制從這些線程中回調(diào)。通過(guò) DDS 發(fā)布樣本時(shí),OpenDDS 通常會(huì)嘗試使用調(diào)用線程將樣本發(fā)送給任何連接的訂閱者。如果發(fā)送調(diào)用阻塞,則樣本可能會(huì)排隊(duì)等待在單獨(dú)的服務(wù)線程上發(fā)送。此行為取決于第 3 章中描述的 QoS 策略。
訂閱者中的所有傳入數(shù)據(jù)都由服務(wù)線程讀取,并排隊(duì)等待應(yīng)用程序讀取。從服務(wù)線程調(diào)用 DataReader 偵聽(tīng)器。
配置
OpenDDS 包括一個(gè)基于文件的配置框架,用于配置全局項(xiàng)目,例如調(diào)試級(jí)別、內(nèi)存分配和發(fā)現(xiàn),以及發(fā)布者和訂閱者的傳輸實(shí)現(xiàn)細(xì)節(jié)。配置也可以直接在代碼中實(shí)現(xiàn),但是,為了便于維護(hù)和減少運(yùn)行時(shí)錯(cuò)誤,建議將配置外部化。完整的配置選項(xiàng)集在第 7 章中描述。
Installation
如何構(gòu)建 OpenDDS 的步驟可以在 $DDS_ROOT/INSTALL.md 中找到。
要使用 DDS 安全性構(gòu)建 OpenDDS,請(qǐng)參閱下面的第 14.1 節(jié)。為避免編譯您不會(huì)使用的 OpenDDS 代碼,有些功能可以排除在構(gòu)建之外。
下面討論這些特征。
需要小尺寸配置或與面向安全的平臺(tái)兼容的用戶應(yīng)考慮使用 OpenDDS 安全配置文件,該配置文件在本指南的第 13 章中進(jìn)行了描述。
啟用或禁用功能的構(gòu)建配置腳本支持大多數(shù)功能
配置腳本創(chuàng)建具有正確內(nèi)容的配置文件,然后運(yùn)行MPC。
如果您正在使用配置腳本,請(qǐng)使用“–help”命令行選項(xiàng)運(yùn)行它并查找您希望啟用/禁用的功能。如果您不使用配置腳本,請(qǐng)繼續(xù)閱讀以下有關(guān)直接運(yùn)行 MPC 的說(shuō)明。對(duì)于下面描述的功能,MPC 用于啟用(默認(rèn))功能或禁用該功能。
對(duì)于名為 feature 的功能,使用以下步驟從構(gòu)建中禁用該功能:
或者,將行 feature=0 添加到文件 $ACE_ROOT/bin/MakeProjectCreator/config/default.features 并使用 MPC 重新生成項(xiàng)目文件。
要顯式啟用該功能,請(qǐng)使用上面的 feature=1。
注意:您還可以使用 $DDS_ROOT/configure 腳本來(lái)啟用或禁用功能。 要禁用該功能,請(qǐng)將 --no-feature 傳遞給腳本,以啟用 pass --feature。 在這種情況下,使用“-”而不是特征名稱中的“_”。 例如,要禁用下面討論的功能 content_subscription,請(qǐng)將 --no-content subscription 傳遞給配置腳本。
禁用內(nèi)置主題支持的構(gòu)建
功能名稱:built_in_topics
通過(guò)禁用內(nèi)置主題支持,您可以將核心 DDS 庫(kù)的占用空間減少多達(dá) 30%。有關(guān)內(nèi)置主題的描述,請(qǐng)參見(jiàn)第 6 章。
禁用合規(guī)配置文件功能的構(gòu)建
DDS 規(guī)范定義了合規(guī)性配置文件,以提供一個(gè)通用術(shù)語(yǔ)來(lái)指示 DDS 實(shí)現(xiàn)可能支持或可能不支持的某些功能集。
下面給出了這些配置文件,以及用于禁用對(duì)該配置文件或該配置文件組件的支持的 MPC 功能的名稱。
許多配置文件選項(xiàng)涉及 QoS 設(shè)置。如果您嘗試使用與禁用的配置文件不兼容的 QoS 值,則會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。如果配置文件涉及類,如果您嘗試使用該類并且配置文件被禁用,則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。
內(nèi)容訂閱配置文件
功能名稱:content_subscription 此配置文件添加了第 5 章中討論的類 ContentFilteredTopic、QueryCondition 和 MultiTopic。此外,可以使用下表中給出的功能排除單個(gè)類。
| ContentFilteredTopic | content_filtered_topic |
| QueryCondition | query_condition |
| MultiTopic | multi_topic |
持久性配置文件
功能名稱:persistence_profile
此配置文件添加了 QoS 策略 DURABILITY_SERVICE 以及 DURABILITY QoS 策略類型的設(shè)置“TRANSIENT”和“PERSISTENT”。
所有權(quán)概況
功能名稱:ownership_profile
此配置文件添加:
? OWNERSHIP 類型的設(shè)置“EXCLUSIVE”
? 支持 OWNERSHIP_STRENGTH 政策
? 為HISTORY QoS 策略設(shè)置深度> 1。
注意:一些用戶可能希望排除對(duì)獨(dú)占 OWNERSHIP 策略及其關(guān)聯(lián)的 OWNERSHIP_STRENGTH 的支持,而不影響對(duì) HISTORY 的使用。 為了支持這種配置,OpenDDS 還具有 MPC 特性 owner_kind_exclusive(配置腳本選項(xiàng) --no-ownership-kind-exclusive)。
對(duì)象模型配置文件
功能名稱:object_model_profile
此配置文件包括對(duì)“GROUP”的 PRESENTATION access_scope 設(shè)置的支持。
注意:目前,禁用 object_model_profile 時(shí),也會(huì)排除“TOPIC”的 PRESENTATION access_scope。
構(gòu)建使用 OpenDDS 的應(yīng)用程序
本節(jié)適用于任何直接或間接包含 OpenDDS 標(biāo)頭的 C++ 代碼。 對(duì)于 Java 應(yīng)用程序,請(qǐng)參閱下面的第 10 章。 包含 OpenDDS 標(biāo)頭的 C++ 源代碼可以使用以下任一構(gòu)建系統(tǒng)構(gòu)建:MPC 或 CMake。
MPC:Makefile、項(xiàng)目和工作區(qū)創(chuàng)建者
OpenDDS 本身是使用 MPC 構(gòu)建的,因此設(shè)置為使用 OpenDDS 的開(kāi)發(fā)系統(tǒng)已經(jīng)具有 MPC 可用。 OpenDDS 配置腳本創(chuàng)建一個(gè)帶有環(huán)境設(shè)置的“setenv”腳本(Windows 上的 setenv.cmd;Linux/macOS 上的 setenv.sh)。
此環(huán)境包含使用 MPC 所需的 PATH 和 MPC_ROOT 設(shè)置。 MPC 的源代碼樹(在 MPC_ROOT 中)包含一個(gè)“docs”目錄,其中包含 HTML 和純文本文檔(USAGE 和 README 文件)。
2.1 節(jié)中的示例演練使用 MPC 作為其構(gòu)建系統(tǒng)。 OpenDDS 源代碼樹包含許多使用 MPC 構(gòu)建的測(cè)試和示例。 這些可以用作應(yīng)用程序 MPC 文件的起點(diǎn)。
cmake
應(yīng)用程序也可以使用 CMake ( https://cmake.org) 構(gòu)建。
請(qǐng)參閱 OpenDDS 源代碼樹中包含的文檔:docs/cmake.md
OpenDDS 源代碼樹還包括使用 CMake 的示例。它們列在 cmake.md 文件中。
自定義構(gòu)建系統(tǒng)
強(qiáng)烈建議 OpenDDS 的用戶選擇上面列出的兩個(gè)選項(xiàng)之一(MPC 或 CMake),以便在任何受支持的平臺(tái)上生成一致的構(gòu)建文件。如果無(wú)法做到這一點(diǎn),OpenDDS 的用戶必須確保自定義構(gòu)建設(shè)置中的所有代碼生成器、編譯器和鏈接器設(shè)置都生成與 API 和 ABI 兼容的代碼。
為此,請(qǐng)從 MPC 或 CMake 生成的項(xiàng)目文件(makefile 或 Visual Studio 項(xiàng)目文件)開(kāi)始,并確保在自定義構(gòu)建系統(tǒng)中表示所有相關(guān)設(shè)置。這通常通過(guò)檢查項(xiàng)目文件和運(yùn)行帶有詳細(xì)輸出的構(gòu)建的組合來(lái)完成,以查看工具鏈(代碼生成器、編譯器、鏈接器)是如何被調(diào)用的。
通過(guò) https://objectcomputing.com/products/opendds/consultingsupport 聯(lián)系 Object Computing, Inc. (OCI),讓我們的專業(yè)軟件工程師為您解決此問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的【OpenDDS开发指南V3.20】第一章:介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 67、ulimit的使用
- 下一篇: 有点憋,说两句