opendds协议服务器,OpenDDS 开发手册
2017-10-30
最后更新時間:
綜述
OpenDDS 的 Recorder 特性允許應用程序在不需要了解數據類型的前提下記錄任意主題下樣本的發布。類似的,Replayer 特性允許這些記錄的樣本以相同或是不同的主題重新進行發布。和其他的 Data Readers 和 Writers 所不同的是其可以在任何類型下正常工作,甚至在編譯階段并不知道數據類型。樣本的每一行包含不透明的字節序列。
本章節的目的是描述 recording/replaying 工作的 OpendDDS 所提供的公共 API。
API Structure
兩個新的用戶可見的類被定義在 OpenDDS:DCPS 命名空間下,其包含 Listener 接口。Listerners 應用程序可選進行實現。Recorder 類扮演的角色類似于 DataReader,Replayer 類扮演的角色類似于 DataWriter。
Recorder 和 Replayer 使用 OpenDDS 底層的發現和傳輸庫,就好像 DataReader 和 DataWriter 一樣。正常的在域中的 OpenDDS 應用程序將會感知到 Recorder 同遠程 DataReader 一樣,而 Replayer 就好像 DataWriter 一樣。
模型用法
應用程序可以按需創建任意數量的 Replayer 和 Recorder。這是基于內建主題在域中動態發現哪些主題是活躍狀態的。創建 Recorder 或是 Replayer 需要應用程序提供主題名和類型名(如同 DomainParticipant::create_topic())以及相關的 QoS 數據結構。Recorder 需要 SubscriberQos,然而 Replayer 需要 PublisherQos 和 DataWriterQos。這些值在 reader/writer 匹配時使用。查看 QoS 處理相關章節來獲得 Recorder 和 Replayer 如何使用 Qos。下面代碼創建一個 recorder:
OpenDDS::DCPS::Recorder_var recorder =
Service_participant->create_recorder(domain_participant,
topic.in(),
sub_qos,
dr_qos,
recorder_listener);
通過 RecorderListener 使用 “one callback per sample” 模型來使得數據樣本可用。樣本作為 OpenDDS::DCPS::RawDataSample 對象。該對象包括數據樣本的時間戳以及排序的樣本值。下面是一個用戶定義的 RecorderListener 類定義:
class MessagerRecorderListener: public OpenDDS::DCPS::RecorderListener
{
public:
MessagerRecorderListener();
virtual void on_sample_data_received(OpenDDS::DCPS::Recorder*,
const OpenDDS::DCPS::RawDataSample &sample);
virtual void on_recorder_matched(OpenDDS::DCPS::Recorder*,
const DDS::SubscriptionMatchedStatus &status);
}
應用程序可以存儲到合適的地方(內存、文件系統、數據庫等等)。后續,應用程序可以將相同的樣本提供給配置了相同主題的 Replayer 對象。應用程序有責任保證主題類型匹配。下面是 replays 將樣本發送給已連接的所有 readers 的例子:
replayer->write(sample);
由于存儲的數據依賴于數據結構的定義,所以參與的 OpenDDS 所使用的版本號和 IDL 版本應該一直。
QoS 處理
由于缺失數據樣本詳細的信息,使得許多在 Replayer 端的正常的 DDS QoS 屬性使用變得復雜。屬性可以分為以下幾類:
Supported
- Liveliness
- Time-Based Filter
- Lifespan
- Durability(transient local level, see details below)
- Presentation(topic level only)
- Transport Priority(pass-thru to transport)
Unsupported
- Deadline(still used for reader/writer match)
- History
- Resource Limits
- Durability Service
- Ownership and Owership Strength(still used for reader/writer match)
Affects reader/writer matching and Built-in Topics otherwise ignored
- Partition
- Reliability(still used by transport negotiation)
- Destination Order
- Latency Budget
- User/Group Data
持久性細節
在 Recorder 端,短暫的本地持久化工作與任何正常的 DataReader 類似。持久化數據從匹配的 DataWriters 獲得。在 Replayer 端有些不同。與正常的 DDS DataWriter 相反,Replayer 不會捕獲/存儲任何數據樣本(其只是傳輸)。由于實力并不知道,因此根據通常歷史和資源限制規則存儲數據樣本是不可能的。相反,短暫本地持久化可以支持 “pull”,這是當一個新的遠端 DataReader 被發現時,中間件調用 ReplayerListener 的方法來實現的。應用程序可以 Replayer 上調用任何數據樣本來發送給新連接上的 DataReader。決定哪些樣本是留給應用端確定的。
參考
Home
Profile
Code
總結
以上是生活随笔為你收集整理的opendds协议服务器,OpenDDS 开发手册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无废话XML--XML约束(DTD)
- 下一篇: oracle 9i从入门到精通读书笔记2