OpenDDS开发环境搭建(Windows 10+Visual Studio 2019)

Win 10

OpenDDS所支持的Windows平台
以上是OpenDDS目前所支持的Windows平台,这篇文章的开发环境也主要围绕Win10来讲述。

Visual Studio 2019

Visual Studio 2019的安装,网上教程有很多,这里不再详述。

OpenDDS的下载

  • 下载地址:https://opendds.org/downloads.html
  • 也可以选择直接从https://github.com/OpenDDS/OpenDDS进行clone或下载(我选择的此方式)

Perl

Strawberry Perl


官网建议在Windows环境下安装Strawberry Perl。
Strawberry Perl下载地址:https://strawberryperl.com/

安装成功查看方法

win + r
cmd
perl -v


安装成功就如上图所示。

ACE+TAO的下载与编译

ACE+TAO下载地址:https://download.dre.vanderbilt.edu/

Full版本和Sources only版本的区别
ACE+TAO为用户提供了两个版本:Source only版本和Full版本。Source only版本仅包含源代码,而Full版本则包含预编译的库和工具,Source only版本相对于Full版本更加灵活,可以进行更细粒度的定制。Full版本中的HTTP和FTP则是应用于不同的传输协议,前者主要用于数据传输,后者主要用于文件传输,Full版本提供了用于开发HTTP服务器和客户端以及FTP客户端和服务器的库和工具。
这里我们选择HTTP版本,zip format是ACE+TAO适用于Windows操作系统的版本

编译ACE+TAO

上述内容下载完成之后,要对ACE+TAO进行编译。
ACE+TAO,OpenDDS的编译有顺序之分。

ACE->TAO->OpenDDS

设置系统环境变量

在用户变量中添加新变量
	1、添加环境变量名为ACE_ROOT
	2、添加环境变量名为TAO_ROOT
	3、添加环境变量名为DDS_ROOT



在系统变量的Path中添加变量
D:\DDS\ACE_wrappers\bin
D:\DDS\ACE_wrappers\lib #此文件夹是在编译完成后生成的
D:\DDS\OpenDDS\bin
D:\DDS\OpenDDS\lib

开始编译前,需要在ACE的源码中添加config.h文件
进入ACE的源码目录(ACE_wrappers),在ace文件夹下新建config.h文件。

//config.h
#include "ace/config-win32.h"

并保存。(对于Windows平台,在ACE库的根目录的ace文件夹下有一个名为config-win32.h的默认配置文件,该文件定义了一些Windows平台下的宏定义和编译选项。在进行ACE的编译时,需要在ace的文件夹下创建一个config.h文件,并包含config-win32.h文件,其主要目的是为了使ACE库能够正确地识别Windows平台下的宏定义和编译选项,从而生成适用于Windows平台的ACE库)

进入ACE的源码目录,目录下有一个名为ACE_vs2019.sln的文件,打开它(默认使用vs2019),选择生成->生成解决方案,等待生成解决方案成功。

编译完成之后,接下来对TAO进行编译。

与编译ACE的方式一致,进入ACE源码目录下的TAO文件夹,打开TAO_vs2019.sln,选择生成->生成解决方案,等待生成解决方案成功。

生成解决方案成功以后,ACE似乎是730个,TAO是2200多个(具体的数量我忘了)

生成成功的示例图就类似于上面这个,这个是ACE的,另一个我忘记截图了。(管它多少个,全部成功就算OK,下一步就好)

OpenDDS的编译

更新并初始化Git仓库中包含的子模块

进入OpenDDS的源码目录,打开git命令行执行如下命令:

git submodule update --init --recursive

更新完成后,打开vs2019的命令行模式(

  • vs内部打开或

  • 开始菜单直接打开

打开后,需将目录cd到OpenDDS的源码目录下,执行.\configure

执行完成之后,程序会生成DDS_no_tests.sln文件和setenv.cmd文件。执行setenv.cmd文件。

然后打开DDS_no_tests.sln,选择生成->生成解决方案,等待生成解决方案成功。(似乎是成功33个,只要全成功了就没有问题,继续下一步即可

开发环境的测试

使用vs2019的命令行模式,cd到OpenDDS源码目录下的

.\OpenDDS\DevGuideExamples\DCPS\Messenger

文件夹,直接run_test.pl即可。

出现test PASSED即环境搭建成功。

考虑到大多数环境搭建教程中选择了.\OpenDDS\examples\DCPS\Messenger_Imr这个示例进行了开发环境搭建成功与否的测试,但就我前期的多次尝试,在该示例下run_test.pl均未能成功。事后查询了很多资料,以我的理解:DevGuideExamples是用于帮助开发人员理解 OpenDDS 的基础概念和编程的范例。而examples中包含了更全面、更复杂的OpenDDS示例,这些示例可以作为OpenDDS应用的起点,供开发人员进行二次开发和定制(我的猜测是内容并不完整,也是初次接触OpenDDS)

测试结果分析

// DDS InfoRepo的命令行启动命令和进程ID。
// DCPSInfoRepo.EXE是OpenDDS 分布式通信框架的一部分,用于管理 DDS 实体(如域、主题、数据读写者等)之间的交互。在该命令中,通过参数 -ORBDebugLevel 和 -ORBLogFile 分别设置了 ORB 的调试级别和日志文件路径,参数 -o 设置了输出文件 repo.ior 的路径,参数 -DCPSPendingTimeout 设置了等待发布者和订阅者注册的超时时间为 3 秒。
D:\DDS\OpenDDS\bin\.\DCPSInfoRepo.EXE -ORBDebugLevel 1 -ORBLogFile DCPSInfoRepo.log -o repo.ior -DCPSPendingTimeout 3
InfoRepo PID: 17648

// 两个客户端程序:subscriber.exe和publisher.exe的启动命令和进程ID。
// 订阅者,用于从 DDS 中订阅消息,发布者,用于向 DDS 中发布消息。在该命令中,通过参数 -ORBDebugLevel、-DCPSDebugLevel、-ORBVerboseLogging 和 -DCPSTransportDebugLevel 分别设置了 ORB、DCPS 和传输的调试级别,参数 -ORBLogFile 设置了日志文件路径,参数 -DCPSPendingTimeout 设置了等待发布者和订阅者注册的超时时间为 3 秒。
.\.\subscriber.EXE  -ORBDebugLevel 1 -DCPSDebugLevel 4 -ORBVerboseLogging 1 -DCPSTransportDebugLevel 2 -ORBLogFile subscriber.log -DCPSPendingTimeout 3
subscriber PID: 15280 started at 2023-04-17 19:38:45
.\.\publisher.EXE  -ORBDebugLevel 1 -DCPSDebugLevel 4 -ORBVerboseLogging 1 -DCPSTransportDebugLevel 2 -ORBLogFile publisher.log -DCPSPendingTimeout 3
publisher PID: 19980 started at 2023-04-17 19:38:45

// 每个订阅者(subscriber)接收到的消息。每条消息都包括主题(subject)、主题ID(subject_id)、发送者(from)、计数(count)和文本内容(text)。
// 多行样本信息(SampleInfo),包括样本排名(sample_rank)和实例状态(instance_state)。
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 99
         from       = Comic Book Guy
         count      = 0
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 100
         from       = Comic Book Guy
         count      = 1
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 101
         from       = Comic Book Guy
         count      = 2
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 102
         from       = Comic Book Guy
         count      = 3
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 103
         from       = Comic Book Guy
         count      = 4
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 104
         from       = Comic Book Guy
         count      = 5
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 105
         from       = Comic Book Guy
         count      = 6
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 106
         from       = Comic Book Guy
         count      = 7
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 107
         from       = Comic Book Guy
         count      = 8
         text       = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
SampleInfo.instance_state = ALIVE_INSTANCE_STATE
Message: subject    = Review
         subject_id = 108
         from       = Comic Book Guy
         count      = 9
         text       = Worst. Movie. Ever.

// NOT_ALIVE_DISPOSED_INSTANCE_STATE,即该实例已经被销毁。这通常发生在发布者(publisher)停止发布相关数据时,该数据的实例就会被销毁。
// NOT_ALIVE_NO_WRITERS_INSTANCE_STATE,DDS数据读取器收到了一个通知,指示与该实例关联的数据写入器已变为非活动状态,不再写入数据。
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_DISPOSED_INSTANCE_STATE
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_DISPOSED_INSTANCE_STATE
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_DISPOSED_INSTANCE_STATE
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_NO_WRITERS_INSTANCE_STATE
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_DISPOSED_INSTANCE_STATE
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_NO_WRITERS_INSTANCE_STATE
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_DISPOSED_INSTANCE_STATE
SampleInfo.sample_rank = 0
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_NO_WRITERS_INSTANCE_STATE
SampleInfo.instance_state = NOT_ALIVE_DISPOSED_INSTANCE_STATE
SampleInfo.sample_rank = 0
SampleInfo.instance_state = NOT_ALIVE_NO_WRITERS_INSTANCE_STATE

// DCPSInfoRepo 程序已被杀死,测试成功
INFO: D:\DDS\OpenDDS\bin\DCPSInfoRepo being killed.
test PASSED.

DCPSInfoRepo.exe是OpenDDS中的一个可执行文件,是DDS实现中的信息库(InfoRepo)进程,用于存储DDS中的各种实体信息,如域、主题、订阅者、发布者等,以便各个DDS进程之间进行协调和通信。在OpenDDS中,DDS进程需要连接到InfoRepo才能相互通信。InfoRepo还可以提供一些其他功能,如历史消息查询、QoS解析等。

SampleInfo.sample_rank
SampleInfo.sample_rank是DDS中SampleInfo结构体的一个成员,表示该数据样本的优先级。在DDS中,数据发布者可以通过指定样本的优先级来控制其传输顺序,从而实现一些高级应用场景。当样本的优先级相同时,它们将按照时间戳的先后顺序进行传输。

ALIVE_INSTANCE_STATE
ALIVE_INSTANCE_STATE 表示实例状态为“活跃”状态,即表示该实例已经创建,并且可以向它发送数据。相对地,还有NOT_ALIVE_DISPOSED_INSTANCE_STATE 和 NOT_ALIVE_NO_WRITERS_INSTANCE_STATE 两个状态,分别表示该实例已被销毁和没有writer与之匹配。这些状态可以帮助DDS中的读者和写者相互协调。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值