您的位置:首页 > 运维架构

OpenDDS开发手册---第二章(开始)3

2017-06-11 15:59 337 查看

2.1.4 设置订阅服务器

   大部分订户的代码是相同的或与我们刚刚完成探索的发布者类似, 我们将迅速通过类似的部分进展, 并请您到讨论以上详细信息。此示例订阅服务器的完整源代码在

Subscriber.cpp 和 DataReaderListener.cpp 文件$DDS_ROOT/DevGuideExamples/DCPS/Messenger/.

2.1.4.1 初始化参与者

    在初始化服务时, 订阅服务器的开始与发布服务器相同,加入我们的域:

int main (int argc, char *argv[])

{

try {

DDS::DomainParticipantFactory_var dpf =

TheParticipantFactoryWithArgs(argc, argv);

DDS::DomainParticipant_var participant =

dpf->create_participant(42, // Domain ID

PARTICIPANT_QOS_DEFAULT,

0, // No listener required

OpenDDS::DCPS::DEFAULT_STATUS_MASK);

if (!participant) {

std::cerr << "create_participant failed." << std::endl;

return 1 ;

}

2.1.4.2 注册数据类型与创建主题

    接下来, 我们初始化消息类型和主题。请注意, 如果主题已经在该域中初始化, 具有相同的数据类型和兼容的 qos, create_topic ()

调用返回与现有主题相对应的引用。如果类型或 qos在我们的 create_topic () 调用中指定不匹配现有主题的调用失败。还有一个 find_topic () 操作, 我们的订户可以使用简单

检索现有主题。

Messenger::MessageTypeSupport_var mts =

new Messenger::MessageTypeSupportImpl();

if (DDS::RETCODE_OK != mts->register_type(participant, "")) {

std::cerr << "Failed to register the MessageTypeSupport." << std::endl;

return 1;

}

CORBA::String_var type_name = mts->get_type_name ();

DDS::Topic_var topic =

participant->create_topic("Movie Discussion List",

type_name,

TOPIC_QOS_DEFAULT,

0, // No listener required

OpenDDS::DCPS::DEFAULT_STATUS_MASK);

if (!topic) {

std::cerr << "Failed to create_topic." << std::endl;

return 1;

}

2.1.4.3 创建一个订阅

接下来, 我们创建具有默认 qos 的订阅者

// Create the subscriber

DDS::Subscriber_var sub =

participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT,

0, // No listener required

OpenDDS::DCPS::DEFAULT_STATUS_MASK);

if (!sub) {

std::cerr << "Failed to create_subscriber." << std::endl;

return 1;

}

2.1.4.4 创建数据读取者和监听

    我们需要将一个侦听器对象与我们创建的数据读取者相关联, 这样我们就可以使用它来检测数据何时可用。下面的代码构造侦听器对象。DataReaderListenerImpl 类显示在下一小节中。

DDS::DataReaderListener_var listener(new DataReaderListenerImpl);

    侦听器在堆上分配并分配给一个 DataReaderListener_var 对象。这类型提供引用计数行为, 以便当侦听器最后一个对它的引用被删除。此用法在 opendds 的堆分配中是典型的应用程序代码并释放应用程序开发人员, 使其不必主动管理已分配对象的寿命。

    现在, 我们可以创建数据读取器, 并将它与我们的主题, 默认 qos属性和我们刚创建的侦听器对象。

// Create the Datareader

DDS::DataReader_var dr =

sub->create_datareader(topic,

DATAREADER_QOS_DEFAULT,

listener,

OpenDDS::DCPS::DEFAULT_STATUS_MASK);

if (!dr) {

std::cerr << "create_datareader failed." << std::endl;

return 1;

}

    此线程现在可以自由执行其他应用程序工作。我们的侦听器对象将被调用当示例可用时, 在 OpenDDS 线程上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DDS 数据分发