【DDS】DDS與OpenDDS

DDS與openDDS

DDS

  • 什麼是DDS?
    Data Distribution Service(DDS),根據字面理解就是數據分發服務。這套服務,在分佈式應用環境下,可以高效率地分發參與者(應用)間的數據信息。
  • 訂閱/發佈體系結構
    考慮到應用實現,肯定要定一套體系結構。DDS採用訂閱/發佈體系結構,以數據爲中心,也就是通過訂閱/發佈這個結構來實現消息(數據)的交換。
  • P/S與RTPS
    上面說的訂閱/發佈,從通信角度考慮。其實,就是P/S通信模式。P(Publish)是發佈者,S(Subscribe)是訂閱者,訂閱者訂閱發佈者提供的某些服務後,P與S間就存在了通信關係。P發佈了相應的消息後,訂閱者便可以收到這些消息(數據)。
    RTPS又是什麼?
    RTPS指Real Time Publish/Subscribe,它繼承自P/S模型。簡單來說,相比P/S,RTPS多出了QoS屬性(Quality of Service)、將發佈/訂閱模塊化等等優點。
    因此,OMG將RTPS標準化爲:DDS的實施互操作協議。
  • OMG
    一個組織,全名爲Object Management Group。DDS就是OMG這個組織規定的規範。
  • 全局數據空間
    DDS以數據爲中心,也就是基於數據去考慮如何分發消息。因此在DDS中存在全局數據空間的概念。這個全局數據空間是虛擬(邏輯)上的,所有數據都在這個空間中,每個分佈式結點可以向這個空間寫數據,也可以從這個空間讀數據。
    這個空間可以總結爲三點:All Data、Read and Write、Cache。
    全局數據空間

DCPS

OMG將RPTS重定義爲DCPS,DDS採用DCPS通信機制。DCPS主要組成有:

  • Domain : 域。參與者只有在同一個域內,纔可以通信。不同域間,不可通信。
  • DomainParticipant: 域參與者。一個域的入口點。
  • Topic:主題。只有使用相同主題(主題名)的P和S,才能夠通信。
  • DataWriter:數據寫入者,負責向Publisher寫入消息。
  • Publisher:發佈者,負責發佈DataWriter寫入的消息。
  • Subscriber:訂閱者,負責接收已訂閱的消息。
  • DataReader數據讀取寫,負責處理從Subscriber接收的消息。
    DCPS

DLRL與DCPS

DDS規範定義了兩類Interfaces結構

  1. DCPS:DDS核心,數據分佈基礎架構。
    DCPS

  2. DLRL(A Data Local Reconstruction Layer):更高的抽象接口層,隱藏細節實現。其實,Data Local Reconstruction可以理解爲將App與DDS直接的數據,根據應用環境重構爲需要的格式。
    DLRL

OpenDDS

  • 根據OpenDDS(目前最新版本是3.14)官網開發者手冊中的介紹

OpenDDS is an open source implementation of the OMG Data Distribution Service (DDS) for
Real-Time Systems Specification v1.4 (OMG Document formal/2015-04-10) and the Realtime Publish-Subscribe Wire Protocol DDS Interoperability Wire Protocol Specification
(DDSI-RTPS) v2.3 (OMG Document formal/2019-04-03). OpenDDS also implements the
DDS Security Specification v1.1 (OMG Document formal/2018-04-01).

  • 因此OpenDDS,是DDS規範的實現。當然還有其他一些DDS規範的實現。例如:RTI DDS、OpenSplice DDS。
  • OpenDDS框架:下圖爲OpenDDS官網給出的Framework圖。可以看出,主要部分爲Topic、Transport、Discovery。也就是,數據如何定義?如何傳輸信息?如何發現兩端(P/S)?
    OpenDDS架構
  • OpenDDS Topic:根據IDL,定義Topic結構,利用OpenDDS提供的工具,根據IDL文件自動生成主題文件。例:https://github.com/adver1991/DDS-Example/blob/master/Messenger.idl
  • OpenDDS Transport: OpenDDS提供了多種傳輸協議,TCP、UDP、Multicast、Shared-Memory、RTPS_UDP。使用者可以通過配置文件,指定使用的傳輸協議。
OpenDDS Discovery

DDS應用在分佈式環境中,訂閱者和發佈者兩端,如何發現對方?OpenDDS提供了兩種節點尋找方式:

  1. DCPSInfoRepo(默認):一個集中式的倉庫,相當於發現中心,它需要運行在獨立的進程中(例:P端一個進程,S端一個進程,還需要一個進程運行InfoRepo)。
    DCPSInfoRepo

  2. RTPS:使用RTPS協議,點對點,不需要額外的進程運行其他服務。
    RTPS

使用OpenDDS

  • 平臺(Ubuntu 16.4)
  • 下載解壓安裝報,根據官網提示操作即可。
  • https://opendds.org/quickstart/GettingStartedLinux.html
  • 例子(參考自OpenDDS官網開發手冊2.1.3節),使用RTPS發現方式,使用rtps_udp傳輸協議。這裏只給出代碼,代碼中具體的含義請參考OpenDDS開發者手冊。代碼見:
    https://github.com/adver1991/DDS-Example
  • 關於例子的簡單說明:例子中,包括訂閱者、發佈者、數據寫入者、數據讀取者(包含Listener)、Topic(IDL定義)部分。根據IDL文件,使用OpenDDS提供的工具,生成Topic相關的代碼。訂閱者與發佈者,在同一個域內,使用相同的主題(主題名)實現數據的分發。

參考

DDS系列

【DDS】DDS與OpenDDS
【DDS】DDS-RPC通信機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章