因项目需要,最近在学习和使用开源软件OpenDDS,在这里把自己的所学,所用,所想做个记录,以备查看。因个人当前理解的限制,所写内容不一定全部正确,但所有内容是
我操作验证过的。使用环境Debian 4.9.210 x86_64/Linux
摘要
1、获取学习资料
2、环境搭建
3、为我所用
4、打包DDS库文件
5、求助渠道
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
a. 网上搜索中文资料有很多介绍,先对OpenDDS有了个大概的认知。它是个开源的数据分发
中间件,有三层:TAO+ACE+DDS,
其中TAO负责封装数据,让OpenDDS支持跨平台;
ACE负责数据通信;
DDS负责数据的分发交互。
b. 在OpenDDS官网OpenDDS 下载OpenDDS软件包和开发者指南。网站里也有一些对其的
介绍,看不懂没关系,多看几遍。软件包解压后里面有一些README和md文件也看下,
还有DOC目录下文档也看下。最重要的是开发者指南文件,里面比较详细的介绍了OpenDDS
的使用和配置,需要多看几遍,尤其是第二章介绍软件包里的用例,以及第七章OpenDDS的
common,discovery, transfort配置,对理解OpenDDS如何使用很有帮助。
本人使用的是linux系统,内核版本是4.9-12,windows环境方法类似,网上也可以搜到很多介绍。
需要材料:
Perl软件包(主要用于跑OpenDDS的用例和一些环境配置) 地址:Perl Download - www.perl.org
OpenDDS软件包OpenDDS-3.15.tar.gz 地址:https://github.com/objectcomputing/OpenDDS/releases/download/DDS-3.15/OpenDDS-3.15.tar.gz
ACE+TAO软件包ACE+TAO-2.2a 地址:http://download.ociweb.com/TAO-2.2a/ACE+TAO-2.2a_with_latest_patches.tar.gz
首先,安装Perl, (安装方法在软件包的install.mid里有写)
然后,解压OpenDDS-3.15.tar.gz软件包,得到文件夹OpenDDS-3.15
最后,解压ACE+TAO软件包,得到文件夹ACE_wrappers,然后将此文件夹移入动到上一步得到
的文件夹OpenDDS-3.15中
编译OpenDDS
进入解压后的OpenDDS目录,然后运行配置文件,这里会配置编译的环境变量和一些准备工作,其中包括下载ACE+TAO的软件包,由于下载很慢常会失败,因此我们上面手工下载然后解压ACE+TAO到OpenDDS目录。 PS: --prefix=/home/test 是为后面安装OpenDDS指定安装路径的,如果这里不配置,后面安装会报错找不到安装路径。
实际我们编译后就可以使用OpenDDS,安装只是把相关的头文件和库文件打包到指定目录,方便我们打包生成OpenDDS的运行环境。
$ cd OpenDDS-3.15
$ ./configure --prefix=/home/test
$ make
安装OpenDDS
执行安装命令后,OpenDDS的文件会安装到上一步骤中通过 --prefix指定的 /home/test目录下。
$ make install
测试OpenDDS
进入目录OpenDDS-3.15/DevGuideExamples/DCPS/Messenger目录,使用perl测试开发者指南里介绍的用例。
如果用例报找不到OpenDDS的库文件,需要手工添加环境变量:
export $LD_LIBRARY_PATH=***/OpenDDS-3.15/lib:***/OpenDDS-3.15/ACE/lib
$ perl run_test.pl
测试通过的化,说明基本的OpenDDS运行环境就搭建好了。但这只是在单机运行了样例,大概率我们需要在两台机器之间通信,下面说下怎样在两台linux计算机之间跑Messenger用例。
两台linux计算机OpenDDS通信
1、首先需要在两台linunx计算机上分别测试通过部署好的OpenDDS用例
2、配置两台计算机的 /etc/hosts 文件,让其内容保持一致,例如:其中10.10.10.10是计算机A的IP地址,Debian10是其hostname; 10.10.10.20是计算机B的IP地址,Debian20是其hostname
PS: 配置后重启下计算机使其生效。如果不配置,publisher发布者DataWriter在与subcriber订阅者的DataReader建链时报文带的ip地址可能是默认的127.0.0.1,最终无法建立连接。不知道为啥 OpenDDS要读这个文件,而且还会把ip地址map到hostname,然后报文里带的时hostname:port.
10.10.10.10 Debian10
10.10.10.20 Debian20
3、OpenDDS的发布者和订阅者通信前需要先发现对方,这里主要有两种发现方式,一是使用信息仓库的集中发现,另一种是发布者和订阅者直接的对等发现。这里使用的是集中发现,感觉下来这种方式简单些,常用些。
在A计算机:
./DCPSInfoRepo -ORBDebugLevel 10 -DCPSTransportDebugLevel 5 -ORBLogFile DCPSInfoRepo.log -ORBListenEndpoints iiop://10.10.10.10:12345
./subscriber -ORBDebugLevel 10 -DCPSDebugLevel 10 -DCPSTransportDebugLevel 5 -ORBLogFile subscriber.log -DCPSInfoRepo 10.10.10.10:12345
在B计算机:
./publisher -ORBDebugLevel 10 -DCPSDebugLevel 10 -DCPSTransportDebugLevel 5 -ORBLogFile publisher.log -DCPSInfoRepo 10.10.10.10:12345
在A计算机运行集中发现服务DCPSInfoRepo程序和订阅服务,在B计算机运行发布服务。命令中最后带的IP地址都是DCPSInfoRepo服务所在计算机IP地址,命令中还带了打印日志的参数,帮助分析问题,也可以不带。 当然我们也可以把相关的参数配置在.ini文件中,然后执行程序时加载,例如 .\publisher -DCPSConfigFile configuration.ini 具体配置方法可以参考开发者指南的第七章。
可以通过修改OpenDDS-3.15/DevGuideExamples/DCPS/Messenger下的用例代码,发送和订阅我们需要的数据。修改源码前,可以参考开发者指南中关于这个用例代码的讲解。
修改Messenger.idl文件,定制我们需要发布订阅的数据
修改Publisher.cpp文件,控制发布数据的方式
修改DataReaderListenerImpl.cpp文件,控制订阅数据的方式
这里修改完可以直接在OpenDDS-3.15/DevGuideExamples/DCPS/Messenger目录下make编译生成新的publisher和subcriber文件。OpenDDS默认是用.mpc构建的,编译完会
在 Messenger目录下生成GNUmakefile, GNUmakefile.Messenger_Idl, GNUmakefile.Messenger_Publisher, GNUmakefile.Messenger_Subscriber四个makefile文件。如果需要
引入其它编程库,可以直接修改这些makefile文件,让引入的代码参与编译。
也可以通过CMake构建项目,可以参考文件夹下的README.md文件配置,这里需要cmake版本大于3.8,本人还没有尝试。
当开发完基于OpenDDS的应用程序,想要在其它linux环境运行时,就需要在环境上部署OpenDDS运行环境。可以通过把OpenDDS运行库打包成.deb文件的方式,安装到需要
使用的环境。分为下面几个步骤:
a. 构建你需要放置OpenDDS运行库的目录层次,例如需要安装在 /opt/test/ 目录
b. 把前面环境搭建章节中,安装的OpenDDS所有文件拷贝到 currentPat/opt/test/目录
c. 在 currentPath目录下,创建目录 DEBIAN, 然后在DEBIAN目录下touch文件control 和 postinst文件
d. 编写control文件和postinst文件,然后使用dpkg命令打包即可。control文件必须要有的,里面描述软件的基本情况,postinst文件是可选的,是个脚本,用来处理软件安装后
需要的操作。还有很多配置文件,可以网上搜索学习
e. 打包完成后的.deb,可以直接通过dpkg -i ***.deb安装,卸载的话直接 dekg -r ***.deb
$ cd /home/dds
$ mkdir -P opt/test
$ cp ***/opendds install files opt/test
$ mkdir DEBIAN
$ cd DEBIAN
$ touch control postinst
然后编辑control和postinst文件,这个可以直接网上搜索
$ cd /home/dds
$ dpkg -b ./ dds-test_1.0_amd64_deb
这里就可以生成deb安装包
在OpenDDS的官网的support网页列举了求助方法Support ,可以查看GitHub上的问题清单Issues · OpenDDS/OpenDDS · GitHub
翻看问题列表,可能有人和你遇到过同样的问题。或者你也可以提交问题,等待大佬的解答,我提过一个问题,大佬响应比较慢,最后还是我自己解决的。。。
当然我们还可以百度去碰碰运气 哈哈