OpenDDS安装教程 Java开发

news2024/11/20 14:38:57

一、环境搭建

1、版本介绍

笔者使用以下版本(不同版本的openDDS对应ACE+TAO版本不同)

openDDS:3.14

ACE+TAO:6.5.12

perl:5.32.0.1-64bit

Visual Studio:Community 2019

jdk:jdk-8u111-windows-x64

2、软件下载

建议把Perl、ACE+TAO+CIAO、OpenDDS都装在同一文件夹下(最好不要有中文路径),如下图

在这里插入图片描述

  • openDDS

    下载地址:https://opendds.org/downloads.html

    官方文档:http://download.objectcomputing.com/OpenDDS/OpenDDS-latest.pdf

    注:选择对应的版本下载zip包或者tar包即可

  • ACE+TAO

    下载地址:最新版本:https://download.dre.vanderbilt.edu/;

    ​ 选择其他版本:https://download.dre.vanderbilt.edu/previous_versions/

在这里插入图片描述

  • perl

    下载地址:最新版本:https://strawberryperl.com/

    ​ 选择其他版本:https://strawberryperl.com/releases.html

    下载后点击安装,无脑安装即可

  • Visual Studio

    下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/

​ 我这里选择[Community]版本的下载,你也可以通过其他渠道下载.

注:下载的过程中要勾选以下几个地方,其他步骤无脑下一步即可(我也不知道不勾选会不会有问题,反正我是选上了)

img

把弹出窗口右边的滚动条下拉一下,下面还有需要注意的选项:

img

网盘打包下载地址:

链接:https://pan.baidu.com/s/1wNq96hw_kQ8G8cXHbCC2iw
提取码:6k8p

3、配置环境变量

  • Perl:不用配置,安装时会自动将环境变量配置在系统变量的Path中。检查即可

在这里插入图片描述

  • ACE+TAO、DDS:(注意填写你们自己的地址)

(1)ACE_ROOT, 值为解压路径:E:\Software\Work\OpenDDS\ACE_wrappers

img

(2)TAO_ROOT, 值为解压路径:E:\Software\Work\OpenDDS\ACE_wrappers\TAO

img

(3)DDS_ROOT, 值为解压路径:E:\Software\Work\OpenDDS\OpenDDS

在 Path 后添加%ACE_ROOT%\lib%ACE_ROOT%\bin%DDS_ROOT%\lib%DDS_ROOT%\bin

注意:这里添加Path路径时,按照下图分开写。尽量不要图省事把几个路径写在一起,因为我当初这样写编译一致出现问题!!!

在这里插入图片描述

  • 添加config.h文件

​ 在E:\Software\Work\OpenDDS\ACE_wrappers\ace 下新建一个空的配置文件 config.h

文件内容为:
#include "ace/config-win32.h"

img

至此:环境搭建完毕!!!

二、编译

注:最好按照以下顺序进行编译

1、编译ACE

步骤1:使用VS2019打开文件ACE_vs2019.sln

在这里插入图片描述

步骤2:选择项目—重定目标解决方案,等待执行完毕即可

在这里插入图片描述

步骤3:(两种方式任选其一,推荐第二种方式)需要花费半个小时左右,不必理会,等待即可

方式一:

1、为了兼容后期使用Java,这里选择64位,因为我开始选择32位的,到后面就报错了。

在这里插入图片描述

2、生成—生成解决方案,等待执行完毕即可

在这里插入图片描述

3、执行成功的效果

img

方式二: 使用命令编译

步骤一: 打开命令行界面

在这里插入图片描述

步骤二: 打开命令行界面cd到要编译的文件目录下,使用如下命令进行编译:(同样这里也选择了64位编译)

msbuild ACE_vs2019.sln /p:Configuration=Debug;Platform=x64 /m:2

在这里插入图片描述

2、编译ACE_TAO

步骤同上:只需要更换目录和名称即可,这里编译过程时间可能会比上面的长一些,耐心等待即可

在这里插入图片描述

3、编译OPENDDS

步骤一: 打开VS,使用命令行工具,cd到以下目录

在这里插入图片描述

步骤二: 执行命令

# 开启Java支持(前提是本机已经配置好Java环境)

.\configure --java

步骤三:检查opendds根目录中是否生成了DDS_no_tests.sln文件和setenv.cmd文件

在这里插入图片描述

步骤四:选择生成的DDS_no_tests.sln,右键使用VS打开,选择debug(64位)依次执行:重定目标解决方案—>生成解决方案

等待编译成功即可

至此:准备工作已经完毕!!!

三、demo测试

1、示例1:执行openDDS自带的程序

OpenDDS安装好之后,下一步就是利用OpenDDS来开发通信项目了。不过在项目中应用OpenDDS之前,先消化一下OpenDDS安装包中自带的示例项目messenger,通过阅读messenger的源代码来熟悉一下OpenDDS提供的用来开发Java项目的类。

(1)准备工作

在开始看OpenDDS的示例项目之前,需要安装好OpenDDS,并且在编译OpenDDS的时候要开启Java支持,这是前提条件。

第一步,在IDEA创建空的maven项目ddstest,用这个项目来看OpenDDS自带的messenger项目的示例代码。因为Idea无法直接打开messenger项目,所以才要创建一个ddstest新项目,把messenger的源码拷贝到ddstest中去边运行边看。

第二步,ddstest项目中引入4个必要的jar包。具体方法:File - Project Structure -Libraries - 点击"+"号 - Java ,然后定位到 %DDS_ROOT%\lib,选中3个jar包:i2jrt.jar、OpenDDS_DCPS.jar、tao_java.jar,定位到%DDS_ROOT%\java\tests\messenger下\messenger_idl下,选中messenger_idl_test.jar。
这样以来项目建好了,所需要的的4个jar包也都加入到项目的libraries中了。详情见下图:

img

然后去%DDS_ROOT%\java\tests\messenger下,将publisher和subscriber两个目录下的TestPublisher、TestSubscriber、DataReaderListenerImpl三个java文件复制到ddstest项目的src目录下。

img

(2)在IDEA中运行TestPublisher、TestSubscriber

1)首先配置虚拟机选项:

Run菜单 - Edit Configurations,在 vm options 一栏填写:

-ea -Dopendds.native.debug=true -Djava.library.path=E:\dds\OpenDDS-3.13/java/tests/messenger/messenger_idl;E:\OpenDDS-3.13\lib

请按照自己的实际情况修改路径。由于已经配置了jar包,所以不需要再写-cp选项。

-Djava.library.path是用来配置JNI库路径,不写的话会提示找不到dll

去除 -Xcheck:jni 是为了屏蔽掉过多的JNI Warning

2)然后配置主程序参数:

在同一个窗口的 Program arguments一栏填写:

-DCPSBit 0 -DCPSConfigFile E:\dds\OpenDDS-3.13/java/tests/messenger/tcp.ini

同样按照自己的实际情况修改路径。这一行如果写在vm options中,就会提示”ERROR: Domain Participant Factory not found“,因为参数传递给了虚拟机而不是程序,导致无法创建DomainParticipantFactory

在这里插入图片描述

3)运行实例

按照以上配置,分别配置TestPublisher的run configuration和TestSubscriber的run configuration,配置两个,因为运行的时候,它们两个会同时运行,各自使用自己的run configuration。

单独启动一个Visual Studio开发人员命令行,在其中运行:
%DDS_ROOT%/bin/DCPSInfoRepo -o repo.ior

或者进入指定目录,运行:DCPSInfoRepo -o repo.ior

接着修改tcp.ini,将common块DCPSInfoRepo项的值修改成repo.ior所在位置,不要去掉"file://"前缀

例如:DCPSInfoRepo=file://D:\Soft\OpenDDS\dds\OpenDDS\java\tests\messenger\userMessenger\repo.ior

然后按照先subscriber,后publisher的顺序启动程序即可。

4)上传jar包,为了方便后期项目的使用,我们可以使用maven命令将使用到的jar包上传到自己的maven仓库中:

mvn install:install-file -Dfile=D:/Soft/OpenDDS/dds/OpenDDS/lib/tao_java.jar -DgroupId=com.dds -DartifactId=tao_java.jar -Dversion=1.0.1 -Dpackaging=jar

// 格式说明    
<path-to-file>: 要安装的JAR的本地路径 ./libs/json-simple-1.1.1.jar
<group-id>:要安装的JAR的Group Id
<artifact-id>: 要安装的JAR的 Artificial Id
<version>: JAR 版本
<packaging>: 打包类型,例如JAR

2、示例2:自己编写调用OpenDDS的程序

(1)编写IDL文件

在以下目录下新建文件夹:userManager以及文件UserManager.idl,可以将示例1目录中的Messenger.idl复制过来,然后修改内容,其他文件都是在接下来的步骤中生成的。

在这里插入图片描述

UserManager.idl的文件内容为:

module UserManager {
 
#pragma DCPS_DATA_TYPE "UserManager::User"
#pragma DCPS_DATA_KEY "UserManager::User id"
 
  @topic
  struct User {
    long id;
    string name;
    boolean sexual;
    long age;
    double height;
  };
};

(2)将IDL编译为Java代码

在以上目录中,使用cmd打开窗口,执行以下命令:

generate_export_file.pl UserManager > UserManager_Export.h

执行命令之后会在该目录下生成UserManager_Export.h文件

(3)编写mpc文件以生成工程

在相同目录下新建文件UserManager.mpc,可以把%OPENDDS_HOME%\java\tests\messenger\messenger_idl目录下的messenger_idl_test.mpc拷出来改一下:

UserManager.mpc的文件内容为:

project: dcps_test_java {

  idlflags     += -Wb,stub_export_include=UserManager_Export.h \
                  -Wb,stub_export_macro=UserManager_Export
  dcps_ts_flags+= -Wb,export_macro=UserManager_Export
  idl2jniflags += -Wb,stub_export_include=UserManager_Export.h \
                  -Wb,stub_export_macro=UserManager_Export
  dynamicflags += USERMANAGER_BUILD_DLL

  specific {
    jarname     = UserManager
  }

  // Older versions of Visual Studio will create the intermediate directories
  // in all-lowercase, so we have to create them first to get the correct case.
  specific(vc71, vc8) {
    prebuild   += <%mkdir%> UserManager 2<%gt%> <%nul%> <%or%> <%cat%> <%nul%> <%gt%> <%nul%>
    prebuild   += <%mkdir%> classes<%slash%>UserManager 2<%gt%> <%nul%> <%or%> <%cat%> <%nul%> <%gt%> <%nul%>
  }

  TypeSupport_Files {
    UserManager.idl
  }

  verbatim(gnuace, bottom, 1) {
    idl_stubs: _UserTypeSupportTAOPeer.java
  }
}

(4)编译

在上面目录中,使用cmd打开窗口,执行以下命令:(vs2019要换成自己对应的版本)

mwc.pl -type vs2019 -features java=1

执行命令之后在该目录下会生成一些文件.

使用VS打开生成的文件userManager.sln,选择debug(64位),**依次执行:**重定目标解决方案—>生成解决方案;

此时,按照我们刚刚编写的mpc文件,就可以得到UserManager.jar UserManagerd.dll(因为是Debug模式下生成,如果是Release模式则不会有d),剩下的文件都可以删除了。

在编译过程中如果提示缺少 jni_md.h文件,该文件位于 %JAVA_HOME%\include\win32 目录下,复制到 %OPENDDS_HOME%\java\idl2jni\runtime 目录下即可。

或者: 按照以下方法

在这里插入图片描述

(5)使用UserManager替换Messenger

我们打开之前创建的ddstest项目稍作修改。

首先是移除对messenger_idl_test.jar的依赖,并添加UserManager.jar。此时三个java文件肯定都会报错标红,把这些地方都改掉就好。

对TestPublisher进行修改:

1处:
MessageTypeSupportImpl servant = new MessageTypeSupportImpl();
 
-> 修改为:
 
UserTypeSupportImpl servant=new UserTypeSupportImpl();2处:
MessageDataWriter mdw = MessageDataWriterHelper.narrow(dw);
Message msg = new Message();
msg.subject_id = 99;
int handle = mdw.register_instance(msg);
msg.from = "OpenDDS-Java";
msg.subject = "Review";
msg.text = "Worst. Movie. Ever.";
msg.count = 0;
int ret = RETCODE_TIMEOUT.value;
for (; msg.count < N_MSGS; ++msg.count) {
    while ((ret = mdw.write(msg, handle)) == RETCODE_TIMEOUT.value) {
    }
    if (ret != RETCODE_OK.value) {
        System.err.println("ERROR " + msg.count +
            " write() returned " + ret);
    }
    try {
        Thread.sleep(100);
    } catch(InterruptedException ie) {
    }
}
 
-> 修改为:
 
UserDataWriter writer=UserDataWriterHelper.narrow(dw);
User user=new User();
int handle=writer.register_instance(user);
user.name="zhangsan";
user.age=20;
user.sexual=true;
user.height=1.75;
user.id=1;
writer.write(user,handle);

对TestSubscriber进行修改:

MessageTypeSupportImpl servant = new MessageTypeSupportImpl();
 
-> 修改为:
 
UserTypeSupportImpl servant=new UserTypeSupportImpl();

对DataReaderListenerImpl进行修改:

先把Message全替换成User

if (mh.value.count < 0 || mh.value.count >= counts.size()) {
    invalid_count = true;
}
else {
    if (counts.get(mh.value.count) == false){
        counts.set(mh.value.count, true);
    }
    else {
        prefix = "ERROR: Repeat ";
    }
}
System.out.println(prefix + "Messenger.User: subject    = " + mh.value.subject);
System.out.println("         subject_id = "
   + mh.value.subject_id);
System.out.println("         from       = " + mh.value.from);
System.out.println("         count      = " + mh.value.count);
System.out.println("         text       = " + mh.value.text);
System.out.println("SampleInfo.sample_rank = "
   + sih.value.sample_rank);
 
-> 修改为:
 
System.out.println("User "+mh.value.id+":{name:"+mh.value.name+",age:"+mh.value.age+",sexual:"+(mh.value.sexual?"male":"female")+",height:"+mh.value.height+"}");

然后把VM option中的 -Djava.library.path 修改为: -Djava.library.path=<UserManager.jar所在路径>;E:\dds\OpenDDS-3.13\lib
因为-DCPSConfigFile选项没改,所以还是在messenger示例目录下运行DCPSInfoRepo,分别运行TestPublisher和TestSubscriber后,在订阅者一端打印了如下消息,说明替换成功:

在这里插入图片描述

四、说明

不同的版本对应的执行命令和方法可能略有不同,安装过程中也可能会有各种奇怪的错误,祝君好运!!!

参考教程:

https://blog.csdn.net/zhangzl4321/article/details/126351779

https://blog.csdn.net/zhangzl4321/article/details/126351804

https://blog.csdn.net/u010670411/article/details/86552739

https://blog.csdn.net/qq740874037/article/details/123804033

https://blog.csdn.net/qq740874037/article/details/125964357

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spark的standalone 分布式搭建

一、环境准备 集群环境hadoop11&#xff0c;hadoop12 &#xff0c;hadoop13 安装 zookeeper 和 HDFS 1、启动zookeeper -- 启动zookeeper(11,12,13都需要启动) xcall.sh zkServer.sh start -- 或者 zk.sh start -- xcall.sh 和zk.sh都是自己写的脚本-- 查看进程 jps -- 有…

【CTF-web】备份是个好习惯(查找备份文件、双写绕过、md5加密绕过)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/83.html 经过扫描可以找到index.php.bak备份文件&#xff0c;下载下来后打开发现是index.php的原代码&#xff0c;如下图所示。 由代码可知我们要绕过md5加密&#xff0c;两数如果满足科学计数法的形式的话&a…

centos7离线安装gdal3.6.3

本文档以纯离线环境为基础&#xff0c;所有的安装包都是提前下载好的。以gdal3.6.3为例&#xff08;其他版本安装步骤或方式可能不同&#xff09;&#xff0c;在centos7系统离线安装&#xff0c;并运行java项目&#xff0c;实现在java服务中调用gdal库解析地理数据。以下任意组…

python的 __all__ 用法

一、介绍 在Python中&#xff0c;__all__通常用于定义模块的公开接口。在使用from module import *语句时&#xff0c;此时被导入模块若定义了__all__属性&#xff0c;则只有__all__内指定的属性、方法、类可被导入&#xff1b;若没定义&#xff0c;则导入模块内的所有公有属性…

华为公开“倒装芯片封装”创新技术,改善散热性能,火龙秒变冰龙

根据华为技术有限公司公开的专利申请&#xff0c;他们提出了一项名为“具有改进的热性能的倒装芯片封装”的创新技术。这项技术旨在改善各种专利应用设备的散热性能&#xff0c;涉及的芯片类型包括CPU、GPU、FPGA和ASIC等。 这些设备可以是智能手机、平板电脑、可穿戴移动设备、…

CUDA计算超时(TDR)和阻塞界面问题的处理参考方法

本文提供一种解决单个英伟达独立显卡(终端用户常见的情形)上计算密集导致程序崩溃和电脑界面卡死的问题参考方法,采取降低效率和花费更多时间的思路来解决崩溃和卡顿的问题,即让CPU占有率不是一直100%,也不会因为被TDR机制打断。 如上图,在GPU-Z软件中看到“GPU Load”没…

实施统一待办:如何将“人找事变成事找人”

当企业信息化发展到一定程度&#xff0c;往往会呈现一种局面&#xff1a;专业的咖&#xff0c;管专业的事。如HRM管企业的人事信息、SRM管企业与供应商之间的合作关系、CRM管企业与客户之间的互动和沟通等。 然而当这些系统叠加在一起时&#xff0c;奇妙的化学反应产生了&#…

C#工程建立后修改工程文件名与命名空间

使用之前的项目做二次开发&#xff0c;项目快结束的时候&#xff0c;需要把主项目的名称修改成我们想要的。 之前从来没有这么干过&#xff0c;记录一下。 步骤如下&#xff1a; 1&#xff1a;打开vs2010项目解决方案&#xff0c;重命名&#xff0c;如下图所示&#xff1a; …

stack 、 queue的语法使用及底层实现以及deque的介绍【C++】

文章目录 stack的使用queue的使用适配器queue的模拟实现stack的模拟实现deque stack的使用 stack是一种容器适配器&#xff0c;具有后进先出&#xff0c;只能从容器的一端进行元素的插入与提取操作 #include <iostream> #include <vector> #include <stack&g…

猿人学刷题系列(第一届比赛)——第三题

题目&#xff1a;抓取下列5页商标的数据&#xff0c;并将出现频率最高的申请号填入答案中 地址&#xff1a;https://match.yuanrenxue.cn/match/3 本题主要考察请求逻辑&#xff0c;可以借助fiddler或Charles等抓包工具进行分析。首先通过浏览器来简单进行请求逻辑分析。 从抓…

Linux系统下消息中间件RocketMQ下载、安装、搭建、配置、控制台rocketmq-dashboard的安装保姆级教程 rocketmq ui

这里给出我使用的 RocketMQ 版本&#xff08;5.1.3&#xff09;、RocketMQ-Dashboard 版本的百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1HaKBBDGWZ0WKLGgVwIG9pw 提取码&#xff1a;1234 文章目录 一. 官网下载安装二、启动NameServer三、启动Broker四…

Linux学习之初识Linux

目录 一.Linux的发展历史及概念 1.什么是Linux UNIX发展的历史&#xff1a; Linux发展历史&#xff1a; 2. 开源 商业化发行版本 二. 如何搭建Linux环境 Linux 环境的搭建方式主要有三种&#xff1a; 1. 直接安装在物理机上 2. 使用虚拟机软件 3. 使用云服务器 三. …

4.SpringCloud

1.SpringCloud概述 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff0c;一次性令牌&#xff0c;全局锁&#xff0c;…

【游戏评测】河洛群侠传一周目玩后感

总游戏时长接近100小时&#xff0c;刚好一个月。 这两天费了点劲做了些成就&#xff0c;刷了等级&#xff0c;把最终决战做了。 总体感觉还是不错的。游戏是开放世界3D游戏&#xff0c;Unity引擎&#xff0c;瑕疵很多&#xff0c;但胜在剧情扎实&#xff0c;天赋系统、秘籍功法…

读书笔记 |【项目思维与管理】➾ 成功的项目需要有效的管理

读书笔记 |【项目思维与管理】➾ 成功的项目需要有效的管理 一、项目:一项难以完成的使命二、要管理项目先要理解"管理"三、项目管理成功的标准四、使项目利益相关者满意 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 如果你没有…

Activity启动模式中的生命周期

彻底明白Activity启动模式中的生命周期&#xff0c;从此不再成为面试难点。 参考&#xff1a; https://www.zhihu.com/tardis/zm/art/429845377?source_id1003 https://developer.aliyun.com/article/951609 https://cloud.tencent.com/developer/article/1763205 Activity…

2020年9月全国计算机等级考试真题(C语言二级)

2020年9月全国计算机等级考试真题&#xff08;C语言二级&#xff09; 第1题 有下列程序&#xff1a; #include<stdio.h> main() { FILE*fp;int k,n,a[6]{1,2,3,4,5,6}; fpfopen("d2.dat","w"); fprintf(fp,"%d%d%d\n",a[0],…

代码随想录章节目录—力扣算法题系列:数组.Java版(可点击文中超链接跳转到想看的题目)

版本说明 当前版本号[20230816]。 版本修改说明20230816初版 目录 文章目录 版本说明目录数组总结篇数组理论基础数组的经典题目二分法双指针法滑动窗口模拟行为 总结 数组总结篇 数组理论基础 数组是非常基础的数据结构&#xff0c;在面试中&#xff0c;考察数组的题目一…

B-树和B+树的区别

B-树和B树的区别 一、B-tree数据存储 在下图中 P 代表的是指针&#xff0c;指向的是下一个磁盘块。在第一个节点中的 16、24 就是代表我们的 key 值是什么。date 就是这个 key 值对应的这一行记录是什么。 假设寻找 key 为 33 的这条记录&#xff0c;33 在 16 和 34 中间&am…

Kubernetes入门 五、深入Pod:探针和生命周期

目录 探针探针类型LivenessProbeReadinessProbeStartupProbe&#xff1a; 探测方式ExecActionTCPSocketActionHTTPGetAction 参数配置操作示例 生命周期钩子函数生命周期 探针 所谓的探针就是容器内应用的监测机制&#xff0c;为了确保容器在部署后确实处在正常运行状态。 比…