在学习OpenDDS过程中,发现网上的资料教程不全,同时很多大佬把一些步骤省略(虽然他们认为很简单,但是对于小白来说太南了),所以为了给广大小白提供便利,同时也给自己(小白)做个笔记,就把步骤记录下来,希望能与诸君共勉!
DDS(Data Distribution Service)是数据分发服务
的首字母缩略词。
DDS采用发布/订阅体系架构,强调以数据为中心,提供丰富的QoS服务质量策略,能保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。
根据OMG(对象管理组织,Object Management Group)定义的标准,它本质上是一个通过网络交换数据的协议。广泛应用于分布式应用,模拟器等。它基于 DCPS(Data-Centric Publish-Subscribe, 以数据为中心的发布订阅)模型。
DDS中以数据为中心的发布/订阅(DCPS)模型构建了一个共享的”全局数据空间
“的概念,所有的数据对象都存在于此空间中,分布式节点通过简单的读、写操作便可以访问这些数据对象。实际上,数据并非存在于所有计算机的地址空间中,它仅存在于那些对它感兴趣的应用程序的本地缓存中
,而这一点正是发布/订阅模型的关键所在。
DDS规范使用UML语言描述服务,提供了一个与平台无关
的数据模型(这个模型能够映射到各种具体的平台和编程语言),使得实时分布式系统中数据能够高效、可靠地发布,它主要应用在要求高性能
、可预见性
和对资源有效使用
的关键任务领域
。
DDS规范列举并正式定义了一整套全面的QoS(Quality of Service,服务质量)策略,能利用QoS进行系统控制。每一个DCPS实体都有自身的QoS策略,而且在每一对发布者和订阅者之间又都可以建立独立的QoS协定。这使得DDS可以很好地配置和利用系统资源,协调可预言性与执行效率间的平衡,并能支持复杂多变的数据流需求。
DDS经常被用于三种设计和应用环境,包括:
Linux:Centos 8.1.1911
Perl: 5.32
Make: GNU Make 4.2.1
gcc: 8.3.1
Perl下载地址:http://www.perl.org/get.html#unix_like
Perl安装包名为:perl-5.32.0.tar.gz
http://www.perl.org/get.html#unix_like
$ tar -xvzf perl-5.32.0.tar.gz
$ cd perl-5.32.0
$ ./Configure
$ make
$ sudo make install
$ make clean
ACE+TAO下载地址
http://download.dre.vanderbilt.edu/
OpenDDS下载地址
http://download.ociweb.com/OpenDDS/
将ACE+TAO与OpenDDS解压至/opt目录下
sudo tar -zxvf ACE+TAO-6.5.10.tar.gz -C /opt
sudo tar -zxvf OpenDDS-3.14.tar.gz -C /opt
解压完毕后,在/opt
目录下已存在ACE_wrappers
和OpenDDS-3.14
两个文件夹,修改其权限
(不修改权限会在编译时出现Permission denied的情况)
cd /opt
sudo chmod 777 -R ACE_wrappers/
sudo chmod 777 -R OpenDDS-3.14/
PS:
ACE+TAO 下载选择 FULL 版本,因为 FULL 版本包含所有 GNU make 预生成 makefile
的源代码,而Sources Only版本则仅包含源代码,您还必须使用MPC生成自己的 makefile。
$ cd ~
$ ls -al #会看到有.bashrc文件
$ gedit .bashrc
在.bashrc
末尾添加如下的环境变量:
# ACE+TAO+DDS Environment
export ACE_ROOT=/opt/ACE_wrappers
export TAO_ROOT=$ACE_ROOT/TAO
export DDS_ROOT=/opt/OpenDDS-3.14
export PATH=$ACE_ROOT/bin:$DDS_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$ACE_ROOT/lib:$DDS_ROOT/lib:$LD_LIBRARY_PATH
注意实际的安装目录与以上环境变量的关系,根据实际的安装路径上述设置可作适当调整。
$ source .bashrc
使环境变量生效
新建 $ACE_ROOT/ace/config.h
, 内容如下:
vi $ACE_ROOT/ace/config.h
#include "ace/config-linux.h"
新建$ACE_ROOT/include/makeinclude/platform_macros.GNU
, 内容如下:
vi $ACE_ROOT/include/makeinclude/platform_macros.GNU
include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU
配置完以上文件之后,可以进行编译:
编译次序为: ACE
-> TAO
-> OpenDDS
因为我这里是全部编译,所以make时间可能比较久,如只需安装所需要的,可以去看看其他人分享的资料。
$ cd $ACE_ROOT
$ make clean
$ make
$ cd $TAO_ROOT
$ make clean
$ make
$ cd $DDS_ROOT
$ ./configure
$ make clean
$ make
为了测试OpenDDS的环境搭建是否成功,OpenDDS为我们提供了一个自动测试脚本run_test.pl
。
$ cd $DDS_ROOT/examples/DCPS/Messenger_Imr
$ perl ./run_test.pl
>>> /opt/ACE_wrappers/TAO/orbsvcs/ImplRepo_Service/tao_imr_locator -o imr.ior -orbendpoint iiop://:10098
>>> /opt/ACE_wrappers/TAO/orbsvcs/ImplRepo_Service/tao_imr_activator -o activator.ior -ORBInitRef ImplRepoService=file://imr.ior -orbendpoint iiop://:10066
>>> /opt/OpenDDS-3.13.2/bin/DCPSInfoRepo -NOBITS -o repo.ior -ORBuseimr 1 -ORBInitRef ImplRepoService=file://imr.ior
>>> /opt/ACE_wrappers/bin/tao_imr -ORBInitRef ImplRepoService=file://imr.ior shutdown InfoRepo
Successfully shut down server <InfoRepo>
>>> /opt/ACE_wrappers/bin/tao_imr -ORBInitRef ImplRepoService=file://imr.ior update InfoRepo -l Fan-Lenovo -c "/opt/OpenDDS-3.13.2/bin/./DCPSInfoRepo -NOBITS -o repo.ior -ORBuseimr 1 -ORBInitRef ImplRepoService=file://imr.ior"
(486|140412808431424) ImR: Successfully registered <InfoRepo>
>>> /opt/ACE_wrappers/bin/tao_imr -ORBInitRef ImplRepoService=file://imr.ior list -v
Server <InfoRepo>
Activator: Fan-Lenovo
Command Line: /opt/OpenDDS-3.13.2/bin/./DCPSInfoRepo -NOBITS -o repo.ior -ORBuseimr 1 -ORBInitRef ImplRepoService=file://imr.ior
Working Directory:
Activation Mode: NORMAL
Number of retries: 0
Not currently running
/opt/OpenDDS-3.13.2/examples/DCPS/Messenger_Imr/publisher -DCPSConfigFile pub.ini -orbendpoint iiop://:10109
/opt/OpenDDS-3.13.2/examples/DCPS/Messenger_Imr/subscriber -DCPSConfigFile sub.ini
(488|139645218817856) Writer::start
(488|139645109663488) Writer::svc begins.
DataReaderListenerImpl::on_subscription_matched
(488|139645109663488) 14:52:25.926322 Writer::svc starting to write.
DataReaderListenerImpl::on_liveliness_changed
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 0
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 1
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 2
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 3
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 4
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 5
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 6
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 7
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 8
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
Message: subject = Review
subject_id = 99
from = Comic Book Guy
count = 9
text = Worst. Movie. Ever.
SampleInfo.sample_rank = 0
DataReaderListenerImpl::on_liveliness_changed
DataReaderListenerImpl::on_subscription_matched
(488|139645109663488) Writer::svc finished.
(488|139645218817856) Writer::end
>>> /opt/ACE_wrappers/bin/tao_imr -ORBInitRef ImplRepoService=file://imr.ior shutdown InfoRepo
Successfully shut down server <InfoRepo>
test PASSED.
显示 test PASSED
,测试成功,表示OpenDDS环境已经搭建成功。