OpenDDS系列(3) —— 第一个OpenDDS程序

article/2025/10/4 7:58:56

文章目录

    • @[toc]
    • 3.1 发送数据
    • 3.2 项目
      • 3.2.1 主题
      • 3.2.2 Publisher(发布者)
      • 3.2.3 Subscriber(订阅者)
    • 3.3 在Windows上构建
    • 3.4 在Linux上构建
      • 3.4.1 运行
    • 3.5 结论

3.1 发送数据

我们将创建一个主题,这是一个通过DDS交换数据的结构。然后,发布者将定期发送该主题,并且将由订阅者接收,并将接收它。

OpenDDS example schema

**OpenDDS示例模式**

3.2 项目

为了尽可能保持代码的跨平台性,使用CMake构建项目。该项目可以从GitHub页面下载。只需转到需要保存项目的文件夹并执行以下代码:

> git clone https://github.com/wteamit/opendds-sample-01.git

该项目有两个分支:订阅者和发布者。除此之外,它们之间共享一些代码,代表用于交换的消息(主题)。

3.2.1 主题

为了交换数据信息,我们需要一个主题。

主题是具有许多属性的结构体(通常在.idl文件中定义)。.idl文件由OpenDDS编译,同时也会创建出.h.cpp等支持文件。当一个程序包括这些文件时它就可以发送和接收主题。

这就是我们想要创建的主题:

Message topic

**消息主题**

它包含两个字段:

  • 一个消息字符串;
  • 一个整型计数器。

这是该项目的Topics.idl文件:

module TopicSample {
#pragma DCPS_DATA_TYPE "TopicSample::Message"
struct Message {string message;long counter;};
};

我们可以看到,主题必须插入模块中(类似命名空间)。我们以类似 C语言 的格式创建结构,然后我们预先使用 #pragma指定一些主题属性。稍后我们会更详细地看到它。

现在可以通过执行以下命令从这个idl创建源文件:

> opendds_idl.exe Topics.idl -o .
> tao_idl.exe Topics.idl -o .
> tao_idl.exe -Ipath\to\OpenDDSTopicsTypeSupport.idl -o .

为了使用这些命令,必须使用OpenDDS文件夹内的命令 setenv.cmd 设置环境变量。也许还有必要设置可执行文件的路径 %PATH%。或者如果需要,可以使用可执行文件的完整路径。

无论如何,这些命令将创建与以下主题相关的c++文件:

TopicsC.cpp
TopicsC.h
TopicsC.inl
TopicsS.cpp
TopicsS.h
TopicsTypeSupport.idl
TopicsTypeSupportC.cpp
TopicsTypeSupportC.h
TopicsTypeSupportC.inl
TopicsTypeSupportImpl.cpp
TopicsTypeSupportImpl.h
TopicsTypeSupportS.cpp
TopicsTypeSupportS.h

这些文件必须包含在项目中,其中包含了发布者和订阅者。将在以下的文章中介绍这些文件的确切含义以及如何从IDL文件创建他们。

3.2.2 Publisher(发布者)

Publisher classes

**发布者类**

现在我们将介绍如何通过这个主题发送数据。

该发布者项目是一个在DDS中使用主题发送随机消息的程序,它连接到DDS,每隔一秒发一次消息。

为了维护和组织代码,主要有两个类:

  • MessageCreator: 创建随机消息的类
  • Publisher: 这是包含OpenDDS发布者的类

程序首先创建发布者,并通过创建一些OpenDDS类来初始化它。然后,在一个循环中,通过使用MessageCreator每秒创建一条消息,然后使用Publisher将其发送出去。

3.2.3 Subscriber(订阅者)

Classes for subscriber

**订阅者类**

订阅者是发布者的双重身份。它主要包含两个类,其中一个用于创建OpenDDS订阅者,另外一个名为MessageDataReaderListenerImpl,通常由订阅者使用,主要目的是为了知道如何处理送达的主题。我们向这个类传递一个函数,当它收到之后将会打印主题。

3.3 在Windows上构建

该项目基于CMake,所以配置起来很简单。打开一个控制台,创建一个新文件夹,然后运行以下命令:

> cmake-DDDS_ROOT_DIR=path\to\your\dds\installation\ \path\to\this\sample

如果您想使用特定的编译器(例如更改体系结构),则需要添加-GCMake选项,如下所示:

> cmake -G"Visual Studio 14 2015 Win64" -DDDS_ROOT_DIR=path\to\your\dds\installation\ path\to\this\sample

当一切正常时,您可以使用以下命令构建项目:

> cmake --build

此时,在构建文件夹中可以看到一个文件夹bin\,输入它并找到可执行文件。

3.4 在Linux上构建

在Linux上构建的步骤是一样的,唯一的区别是使用setenv.sh而不是setenv.cmd.

3.4.1 运行

为了运行例子,我们需要三个控制台。

在第一个控制台上,我们必须启动InfoRepo。转到OpenDDS二进制目录,运行setenv脚本后,使用以下命令启动Inforepo

> ..\setenv.cmd> .\DCPSInfoRepo -ORBEndpoint iiop:**//**localhost:12345 -d domain_ids

此时,服务器开始运行。

DCPSInfoRepo started

**DCPSInfoRepo 开始执行**

之后,打开另一个控制台,并启动publisher。转到我们构建项目的文件夹,输入bin\文件夹,然后运行以下命令:

> .\publisher -DCPSConfigFile configuration.ini

输入以上命令后,publisher将会启动,并且在几秒钟之后,它将开始向控制台输出消息,这是通过DDS发送的消息。

The publisher is sending messages!

**Publisher正在发送消息**

最后,打开第三个控制台。转到publisher服务器所在的同一文件夹,然后使用以下命令启动subscriber 服务器:

> .\subscriber -DCPSConfigFile configuration.ini

输入以上命令后用户将启动,初始化后控制台将显示从DDS接收到的消息,这些消息与发布者发送的消息相同。此时我们建立了一个可用的OpenDDS连接。

用户打印收到的消息

**用户打印收到的消息**

3.5 结论

在这篇文章中,我们展示了一个OpenDDS通信的一个小例子。



http://chatgpt.dhexx.cn/article/G3flcJKp.shtml

相关文章

OpenDDS学习笔记(2):DDS概述

文章目录 一、DDS体系结构1.1 DLRL层1.2 DCPS层 二、DDS通信过程三、DDS通信特点四、DDS标准实现4.1 RTI DDS软件4.2 OpenSplice DDS软件4.3 OpenDDS软件 一、DDS体系结构 DDS采用DCPS通信机制,提供一个与平台无关的数据模型。它允许应用程序实时发布拥有的信息&am…

OpenDDS系列(1) —— OpenDDS 简介

1. OpenDDS简要介绍 1.1 简介 1.1.1 DDS是什么1.1.2 DDS通信的基本要素1.1.3 DDS架构的主要优点1.1.4 DDS产品种类1.1.5 OpenDDS 1.2 DDS的应用领域 美国海上战争中心(NSWC)高性能分布式计算系统(HiPer-D) 1.3 结论 1. OpenDDS简要介绍 1.1 简介 1.1.…

IDEA中查找与替换快捷键(项目全局替换、该文件下替换)

该文件下查找(CtrlF) 项目全局查找(CtrlShiftF 或【Edit】——>【Find】——>【Find in Path…】) 注意:本人电脑上的IDEA版本不支持该快捷键(CtrlShiftF),有可能是快捷键冲突…

idea实现快捷批量修改替换

1. 在当前文件内容中替换 idea替换快捷键,批量处理对象 ctrl r: 当前文件内容替换,指的是在当前打开的文件中替换匹配的字符,只操作一个文件。 2. 在路径中替换(可替换不同文件夹中的内容) ctrl shift r: 在路径中替换,指的是…

idea 查找与替换

查找当前文件内容:ctrlF 如上图片 查找全局文件:ctrlshiftF 或double shift(按两下)或ctrlshiftN替换当前文件内容 :ctrlR 如上图片 你想通过编辑器快速的将所有的’29’,变为29,你可以 ctrl…

IDEA全局替换

在做项目时,有时会在整个项目里或指定文件夹下进行全局搜索和替换,这是一个很方便功能。使用方法如下: 一、全局搜索 1、使用快捷键CtrlShiftF打开搜索窗口,或者通过点击Edit–>Find–>Find in path打开搜索窗口&#xff0…

idea 替换

idea 替换功能说明 快捷键: ctrl R界面说明

idea全局查找和替换

原文 https://blog.csdn.net/fanrenxiang/article/details/80168215 全局查找 通过快捷键 CtrlShiftf 快速进入全局查找页面,或者通过 Edit 》Find 》Find In Path 1、你要检索的内容; 2、如何匹配内容,分别表示 区分大小写、单个单词、正则、过滤查找…

JDK更换IDEA如何修改

一、.打开idea设置。 1、点击file里面的settings... 二、取消默认javac编译 2、然后点开 Build, Execution, Deployment找到里面的compiler,再点开Java compiler 取消勾选。点击🆗 如图演示: 三、检查项目jdk配置 3、点击file里面的…

总结idea全局搜索和替换的快捷键

文章目录 1. 文章引言2. 按文本内容查找(替换)3. 按文件名称搜索文件4. 查看类的继承关系5. 查找类(方法)在哪使用6. 搜索任何东西7. 按名字搜索类 1. 文章引言 我们在使用idea做java开发时,通常会执行如下查找: 在页面内查找或替换 全局查找或替换 按…

IDEA代码替换

IDEA代码替换 快捷键 当前文件内容 C t r l R CtrlR CtrlR 全局替换 C t r l S h i f t R CtrlShiftR CtrlShiftR 使用 第一行输入栏:输入被替换内容 第二行输入栏:输入替换内容 详细使用 第一行输入栏后第一个图标:换行 第一行输…

IntelliJ IDEA中怎么全局搜索替换(整个项目)(Eclipse)

IntelliJ IDEA使用教程 (总目录篇) 我们用Eclipse或者IntelliJ IDEA编程,有时候需要将整个项目的某个字符串替换成其他的。 全局搜索我会,我还给调成ctrlg了呢,但是遇到要全局(整个项目)替换字符串。哎哟&#xff0c…

idea利用正则表达式快速替换

idea利用正则表达式快速替换 需求&#xff1a;要将link标签中的href属性替换成用thymeleaf表达的形式&#xff0c;让其资源寻址是从从项目名开始寻找的 如将<link rel"stylesheet" href"assets/css/bootstrap.min.css"> 换成<link rel"styl…

intellij idea全局查找和替换

点击这里查看 <intellij idea使用教程汇总篇> 全局查找 通过快捷键 CtrlShiftf 快速进入全局查找页面&#xff0c;或者通过 Edit 》Find 》Find In Path 1、你要检索的内容; 2、如何匹配内容&#xff0c;分别表示 区分大小写、单个单词、正则、过滤查找文件; 3、查找…

IDEA全局替换快捷键

Intellij IDEA使用教程相关系列 目录 Intellij IDEA 强大的搜索能力 IDEA全局替换 通过快捷键 CtrlShiftr 或这点击 Edit 》Find 》Replace In Path 有些IDEA版本按了快捷键也没效果&#xff0c;经常遇到的原因如下&#xff1a; 1、与其他软件快捷键冲突了&#xff0c;特别是…

idea替换所有文件中的内容

通过快捷键CtrlShiftR打开窗口&#xff0c;或者通过点击Edit–>Find–>Replace in path打开窗口。如下图&#xff1a; 输入被替换和要替换的内容后&#xff0c;点击replace all即可替换全部。

IDEA 批量修改变量名、批量替换代码快捷键

平时学习过程中经常遇到一些变量名需要依照规范来修改的&#xff0c;这里记录Idea批量修改变量名&#xff0c;或者批量修改代码的快捷键&#xff0c;希望对大家有所帮助吧。1. 使用Shift F6批量修改变量名 选中要修改的变量名按ShiftF6&#xff0c;然后就可以直接编辑 编辑完…

idea的替换快捷键

替换&#xff1a;有全局替换 和 当前文件内容替换 全局&#xff1a;ctrl shift r: 在路径中替换,指的是在选定的目录下或者类包下,查找要被替换的字符。 当前文件内容&#xff1a;ctrl r: 当前文件内容替换,指的是在当前打开的文件中替换匹配的字符,只操作一个文件。 一、…

idea如何全局替换

idea如何全局替换 打开idea&#xff0c;点击CtrlShiftR&#xff0c;打开Replace in Files面板 在1里面输入想要被替换的单词&#xff0c;在2里面输入替换之后的单词 In project代表在整个项目中搜索替换 Module代表在模块中搜索替换 Directory代表在当前目录中搜索替换 Sc…

idea 中的查找与替换

⭕️前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(点击跳转到网站)⭕️ 1.查找当前文件内容&#xff1a;ctrlF 如上图片 2.查找全局文件&#xff1a;ctrlshiftF 或double shift&#xff08;按两下&#x…