RTI-DDS代码分析使用介绍

DDS(Data Distribution Service数据分发服务)是对象管理组织OMG的有关分布式实时系统中数据发布的规范。

DDS规范采用了发布/订阅体系结构,但对实时性要求提供更好的支持。DDS是以数据为中心的发布/订阅通信模型。

以下工程基于rti_connext_dds-7.2.0

hello_world.idl定义的HelloWorld结构体如下

使用RTI Code Generator(rtiddsgen)生成对应工程。

生成的工程目录如下

用VS2017打开工程

重点关注 hello_world_publisher.cxx和 hello_world_subscriber.cxx两个文件

Publisher

publisher实现的是发布,subscriber实现的是订阅。

在hello_world_publisher.cxx中

c 复制代码
    // 创建一个HelloWorld类型以HelloWorld Topic命名的Topic
    dds::topic::Topic<HelloWorld> topic(participant, "HelloWorld Topic");

    dds::pub::Publisher publisher(participant);

    // DataWriter将要在"HelloWorld Topic"中写入数据
    dds::pub::DataWriter<HelloWorld> writer(publisher, topic);

定义HelloWorld类型的sample,sample.msg()定义sample输出的内容

通过write函数写入数据

c 复制代码
    HelloWorld sample;
    for (unsigned int count = 0;
         !shutdown_requested && count < sample_count;
         count++) {

		sample.msg("Hello world! " + std::to_string(count));

        std::cout << "Writing HelloWorld, count " << count << std::endl;

        writer.write(sample);

        rti::util::sleep(dds::core::Duration(4));
    }

Subscriber

类似的,定义Subscriber

c 复制代码
    // 创建一个HelloWorld类型以HelloWorld Topic命名的Topic
    dds::topic::Topic<HelloWorld> topic(participant, "HelloWorld Topic");

    dds::sub::Subscriber subscriber(participant);

    // DataReader将要读取topic数据
    dds::sub::DataReader<HelloWorld> reader(subscriber, topic);

创建状态条件,满足条件才读取数据

c 复制代码
    // 创建条件
    dds::core::cond::StatusCondition status_condition(reader);

    status_condition.enabled_statuses(
            dds::core::status::StatusMask::data_available());

    // 条件触发后关联句柄
    unsigned int samples_read = 0;
    status_condition.extensions().handler([&reader, &samples_read]() {
        samples_read += process_data(reader);
    });
c 复制代码
	dds::core::cond::WaitSet waitset;
    waitset += status_condition;

    while (!shutdown_requested && samples_read < sample_count) {
        // 条件激活
        std::cout << "HelloWorld subscriber sleeping for 4 sec..."
                  << std::endl;

        waitset.dispatch(dds::core::Duration(4));  // Wait up to 4s each time
    }
相关推荐
希忘auto17 小时前
详解Redis的常用命令
redis·1024程序员节
yaosheng_VALVE1 天前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king1 天前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
一个通信老学姐6 天前
专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
sheng12345678rui6 天前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
huipeng9267 天前
第十章 类和对象(二)
java·开发语言·学习·1024程序员节
earthzhang20217 天前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节
爱吃生蚝的于勒8 天前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
earthzhang20218 天前
《深入浅出HTTPS》读书笔记(20):口令和PEB算法
开发语言·网络协议·算法·https·1024程序员节
一个通信老学姐9 天前
专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节