DDS(DataDistribution Service数据分发服务)是对象管理组织OMG的有关分布
式实时系统中数据发布的一个较新的规范(2004年12月发布1.0版,2007年1月发
布1.2版)。全球已经有500多个项目和案例成功采用了RTI公司的DDS方案,网络 中间的市场占有率高达80%左右。包括航空、航天、船舶、国防、金融、通信、汽车等领域。
所需工具
OpenDDS虽然强大,但是安装使用起来却很让人头疼。这过程信息比较多,所以分成几个部分来分别介绍。
Microsoft visual C++
前面介绍了,OpenDDS是C++ 实现的订阅发布机制,要使用到VC++ 。、
Perl最近版本
OpenDDS是一种跨平台的开源软件,所以考虑到不同用户的平台和开发环境的需要,使用了跨平台语言Perl作为脚本语言。
Windows环境,使用ActivateState PerlACE以及TAO源代码
OpenDDS依赖ACE抽象层来提供不同平台的兼容性,同时也依赖于TAO(例如TAO的IDL编译器)。
下载最新版本的ACE+TAO.zip。网站下载有两种版本可供选择Full版和Sources Only版,Full指的是项目文件已经生成的版本(包括GNUMakefiles和VC项目文件),Sources Only版本仅仅包含源代码,需要自己使用MPC生成makefile。OpenDDS源代码
官网:http://opendds.org/
Github: https://github.com/objectcomputing/OpenDDS
安装
安装
visual studio
(2013及以上)以及ActivateState Perl
安装vs时需要安装的模块:
需要安装使用C++桌面开发
模块以及通用Windows平台开发
中的Windows 8.1 SDK
,否则会出现找不到 Windows SDK 版本8.1。请安装所需的版本的 Windows SDK 或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更 改SDK 版本
的错误。解压ACE+TAO放到OpenDDS的根目录下,设置环境变量:
ACE_ROOT=D:\OpenDDS\ACE_wrappers
。
TAO_ROOT=D:\OpenDDS\ACE_wrappers\TAO
。
PATH
添加%ACE_ROOT%\lib
和%ACE_ROOT%\bin
。- 于
%ACE_ROOT%/ace
下新建一个配置文件config.h
,内容为#include "ace/config-win32.h"
。 编译ACE+TAO。分别打开
%ACE_ROOT\%ACE.sln
和%TAO_ROOT\%TAO_ACE.sln
,依次进行编译,根据自己的vs版本选择相应的项目文件项目文件名 对应的vs版本 ace_vc12.sln vs2013 ace_vc14.sln vs2015 ace_vs2017.sln vs2017 或者使用vs提供的
开发人员命令提示符工具
进行编译。命令如下:
I.msbuild ACE_vs2017.sln /p:Configuration=Debug > build_ace_debug.log
结果如下:
II.
msbuild TAO_ACE_vs2017.sln /p:Configuration=Debug > build_tao_debug.log
结果如下:
编译OpenDDS。解压OpenDDS放到OpenDDS的根目录下,设置环境变量:
DDS_ROOT= D:\OpenDDS\OpenDDS-3.12
PATH
添加% DDS_ROOT %\lib
和% DDS_ROOT %\bin
。
切换目录到D:\OpenDDS\OpenDDS-3.12
使用vs的开发人员命令提示符
运行configure.cmd
,运行完成后会生成setenv.cmd
脚本,运行setenv.cmd
脚本也可设置好环境变量。结果如下:
如果运行configure.cmd时出现下面的错误:
需要我们手动在config
文件中对应的位置添加$opts{'compiler_version'} = "vs2017";
对生成的DDS.sln进行编译,文件名与编译器版本的对应关系与ACE相同,如果是正确运行
config.cmd
后生成的DDS.sln课直接编译,此时与vs的版本已经对应好。编译的命令:
msbuild DDS.sln /p:Configuration=Debug > build_dds_debug.log
检查。编译完成之后,可以运行测试脚本观察是否
OpenDDS
环境是否搭建成功。切换到D:\OpenDDS\OpenDDS-3.12\examples\DCPS\Messenger_Imr
目录,运行run_test.pl
,运行结果最后出现test PASSED
则编译成功。结果如下: