Java程序调用OpenDDS

article/2025/10/4 5:30:20

一、前言

前面我们用三篇博客介绍了

  • OpenDDS在WIndows上的环境配置

    Windows下的OpenDDS编译(超详细)_山中野竹的博客-CSDN博客_opendds windows

  • 三种方式运行发布订阅示例程序

    OpenDDS运行示例(Messenger)程序_山中野竹的博客-CSDN博客

  • 创建自己的发布订阅程序

    OpenDDS 创建自己的发布订阅程序_山中野竹的博客-CSDN博客

但上述都是OpenDDS自己的一个操作,那么如何在Java里面调用OpenDDS呢?

接下来介绍一下,如何使用Java来调用OpenDDS程序,介绍其准备工作和实例。

  • 首先,你的OpenDDS配置环境要能支持Java,因此之前的环境配置则不能满足,需要重新配置

    有了上述配置环境的基础,配置Java支持的环境就简单很多了,直接参考下面这篇博客OpenDDS配置Java运行环境_山中野竹的博客-CSDN博客

  • 通过一个实例,在IDEA开发工具上,进行Java调用OpenDDS服务

二、实例演示

调用过程主要分为以下几步

  • 生成要调用的发布订阅的 java程序和jar包文件

  • 将 相应的jar包上传到本地maven仓库,并在Java项目中引用该Jar包

  • 将生成的 Java程序放在项目中,并调用程序实现发布订阅服务

1. 生成 要调用的java相关文件

这一步和前面介绍过 创建自己的发布订阅程序有点像,因此就简要介绍了。主要步骤为:

  • 创建一个 messenger文件夹,创建一个 UserMessenger.idl 文件

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

  • 在cmd命令行窗口,在messenger路径下执行命令生成 UserManager_Export.h 文件

generate_export_file.pl UserManager>UserManager_Export.h

  

  • 创建 UserManager.mpc 文件

project: dcps_test_java {idlflags     += -Wb,stub_export_include=UserManager_Export.h \-Wb,stub_export_macro=UserManager_Exportdcps_ts_flags+= -Wb,export_macro=UserManager_Exportidl2jniflags += -Wb,stub_export_include=UserManager_Export.h \-Wb,stub_export_macro=UserManager_Exportdynamicflags += USERMANAGER_BUILD_DLLspecific {jarname     = UserManager}TypeSupport_Files {UserManager.idl}
}
  • cmd命令窗口,在该路径下,使用mwc命令编译 mpc文件

perl E:\Software\Work\OpenDDS\ACE_wrappers\bin\mwc.pl -type vc10

  • 使用vc++ 编译 messenger.sln文件,先在vc++中打开文件,选择自己的运行环境(32位或者64位)然后生成解决方案即可

基本上配置完Java的环境都是64位的。

得到我们需要的 UserMessenger.jar包文件

生成成功后,检查生成Jar包文件是否完整,检查生成文件中“classes-UserManager”文件夹下是否有UserTypeSupportImpl.class,即类型支持实现类文件

如果没有该文件,后期Java调用Jar包会有问题,为防止此问题,再使用VS对 Messenger.sln编译一下即可。

第二步第三步参考了以下两篇博客,大家可以先学习一下

OpenDDS Java开发(一):理解Messenger示例_hbyangland的博客-CSDN博客_java opendds

OpenDDS Java开发(二):根据IDL进行代码生成_hbyangland的博客-CSDN博客_idl 代码生成

2. 上传 jar包文件到仓库,并在项目中引用

在项目创建libs文件夹,并添加jar包文件,前三个jar是在OpenDDS/lib文件夹中,第四个是第一步生成的,根据业务需要确定第四个

第一次执行示例时,第四个jar包请采用OpenDDS自带的项目Jar包,jar包为messenger_idl_test.jar,jar包位置在:\OpenDDS\java\tests\messenger\messenger_idl 

然后将jar包上传到maven仓库,使用cmd命令进行上传

// 上传格式
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
// 格式说明    
<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
// 上传案例
mvn install:install-file –Dfile=E:\Software\Work\OpenDDS\OpenDDS-3.10\java\tests\messenger\messenger_idl\messenger_idl_test.jar -DgroupId=com.dds.messenger -DartifactId=dds-messenger -Dversion=1.0 -Dpackaging=JAR

在maven仓库检查是否上传成功

仓库位置C:\Users\admin.m2\repository

上传成功后,在项目中设置pom文件,  

// 添加jar包依赖(第一个依赖根据自己需要jar包更换)<dependency><groupId>com.dds.messengerAll</groupId><artifactId>dds-messengerAll</artifactId><version>1.0</version><scope>system</scope><systemPath>${basedir}/src/libs/UserManager.jar</systemPath></dependency><dependency><groupId>com.dds.OpenDDS_DCPS</groupId><artifactId>dds-OpenDDS_DCPS</artifactId><version>1.0</version><scope>system</scope><systemPath>${basedir}/src/libs/OpenDDS_DCPS.jar</systemPath></dependency><dependency><groupId>com.dds.tao_java</groupId><artifactId>dds-tao_java</artifactId><version>1.0</version><scope>system</scope><systemPath>${basedir}/src/libs/tao_java.jar</systemPath></dependency><dependency><groupId>com.dds.i2jrt</groupId><artifactId>dds-i2jrt</artifactId><version>1.0</version><scope>system</scope><systemPath>${basedir}/src/libs/i2jrt.jar</systemPath></dependency>// 因为idea的默认配置文件都是放在src/main/resources目录下,如果想要编译src/libs目录下的jar包,要在pom的build里配置resource<resources><resource><!-- directory 表示取该目录下的文件 --><directory>src/libs</directory><!--targetPath 指定打包到哪个目录下  默认是放到class目录下--><targetPath>/BOOT-INF/lib/</targetPath><!-- 取符合格式的所有文件  *代表全部 --><includes><include>**/*.jar</include></includes></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory></resource></resources>// 准备工作完成

3.将生成的 Java程序放在项目中,并调用程序实现发布订阅服务

使用OpenDDS自带的java文件

\OpenDDS-3.10\java\tests\messenger\publisher下的TestPublisher.java

\OpenDDS-3.10\java\tests\messenger\subscriber下的TestSubscriber.java和DataReaderListenerImpl.java

将文件放进项目中,然后调用文件执行发布订阅

 平台执行发布订阅需要给定发布订阅启动参数

// 在发布订阅执行前,先定义字符串数组,后期要用 
String[] ARGS = {"-DCPSBit","0","-DCPSConfigFile","C:\\Users\\lwy\\Desktop\\ddsexample\\demo-java\\messenger\\rtps.ini"};// 注意最后一项是发布订阅的方式的配置文件路径,可以选用点对点方式,或者仓库方式
// 点对点方式,最后一项选择本地点对点配置文件,配置文件内容如下:  
// 文件格式为.ini
[common]
DCPSGlobalTransportConfig=$file
DCPSDefaultDiscovery=DEFAULT_RTPS[transport/the_rtps_transport]
transport_type=rtps_udp// 仓库方式,最后一项选择本地仓库配置文件,配置文件内容如下:
// 其中第一项是你的仓库repo文件路径,注意file://+路径
// 文件格式为.ini
[common]
DCPSInfoRepo=file://E:\Software\Work\OpenDDS\OpenDDS-3.10\java\tests\messenger\repo.ior
DCPSGlobalTransportConfig=$file[transport/1]
transport_type=tcp

然后分别调用发布和订阅函数(只写了业务逻辑,前后端如何调用大家自行编写)

先调用订阅

// 注入订阅类
@Resource
private TestSubscriber testSubscriber;// 订阅
testPublisher.publish(ARGS);

调用发布

// 注入发布类
@Resource
private TestPublisher testPublisher;// 发布
testSubscriber.subscribe(ARGS);

然后进行项目打包,通过项目中的maven-lifecycle-package,双击进行项目打包,

打包完成后,开始部署项目,测试发布订阅。在项目打包好的jar路径下执行命令行命令

运行命令如下:命令行中两个路径分别是opendds/lib路径和自己jar包位置路径

// 使用点对点方式,在项目jar文件路径下,使用命令行运行
java -ea -Dopendds.native.debug=true -Djava.library.path=E:\Software\Work\OpenDDS\OpenDDS-3.10\lib;C:\Users\lwy\Desktop\ddsexample\0830ceshi\Messenger -jar XXX.jar // 使用仓库方式
// 首先,在一个cmd窗口开启仓库,该窗口执行路径在对应的仓库配置文件和repo.ior文件路径下
DCPSInfoRepo -o
// 然后第二个窗口,项目jar文件路径下,执行如下命令
java -ea -Dopendds.native.debug=true -Djava.library.path=E:\Software\Work\OpenDDS\OpenDDS-3.10\lib;C:\Users\lwy\Desktop\ddsexample\0830ceshi\Messenger -jar XXX.jar   

!!!! 记录自己的一个小问题

在新电脑上集成DDS程序,集成好跑程序时,显示找不到自定义的jar包,此时自定义的jar包我拷贝到一个路径上了,却显示找不到,于是在新电脑上重新生成了该jar包(前面生成jar包的步骤,在新电脑上来了一遍!),之后就能跑通程序了。  也不知道是不是这个问题,衰

出了问题就是根据报错,去猜想,去试,去问,去查!   共勉!

自己的一点实践,内容较多,细节不易一一展示,希望能帮到大家!

点个赞吧


http://chatgpt.dhexx.cn/article/at5b9kUo.shtml

相关文章

OpenDDS运行实例

因为OpenDDS是分布式的部署&#xff0c;所以一般发布端和订阅端都不在同一台电脑上。 我在同一台电脑上进行测试&#xff0c;所以ip地址为&#xff1a;127.0.0.1 1.发布端 1.1 新建ior文件 在根目录先新建repo.ior文件&#xff1a; IOR:010000001e00000049444c3a4f70656e44…

Java调用OpenDDS(1)-编译安装openDDS-补上了所有网络上其他文章遗漏的细节

Java调用OpenDDS过程中踩了很多坑&#xff0c;记录一下。 提纲 1、DDS简介 2、DDS协议的实现产品 3、OpenDDS安装过程 1、DDS简介 DDS指的是Data Distribution Service&#xff0c;也即数据分发服务&#xff0c;是OMG&#xff08;Object Management Group&#xff0c;对象管理…

OpenDDS自学

前言 最近做毕设要做一个DDS系统和TISA系统的网关&#xff0c;完全没有基础&#xff0c;只好对着OpenDDS的Developers’ Guide和《分布式系统实时发布/订阅数据分发技术》这本书一点一点学(顺便吐槽这本书就是guide的翻译版&#xff0c;很多语句不通)。遇到很多问题&#xff0…

VS2015编译OpenDDS

最近需要研究下OpenDDS,因此需要搭建个环境&#xff0c;下面是一点经验&#xff0c;大家可以参考。 使用版本是OpenDDS-3.12、ACETAO-6.5.10和strawberry-perl&#xff0c;之所以使用ACETAO-6.5.10是因为往后的版本没有现成的2015对应的sln了。 一.资源下载 1.可以直接使用我…

Java调用OpenDDS(2)-理解OpenDDS自带的Messager示例

OpenDDS安装好之后&#xff0c;下一步就是利用OpenDDS来开发通信项目了。不过在项目中应用OpenDDS之前&#xff0c;先消化一下OpenDDS安装包中自带的示例项目messenger&#xff0c;通过阅读messenger的源代码来熟悉一下OpenDDS提供的用来开发Java项目的类。 提纲 1、准备工作 2…

OpenDDS

OpenDDS简介 Don Busch&#xff0c;首席软件工程师兼合作伙伴 Object Computing&#xff0c;Inc.&#xff08;OCI&#xff09; 介绍 分布式实时应用程序有时以数据为中心而不是以服务为中心&#xff0c;这意味着分布式系统中参与者的主要目标是分发应用程序数据&#xff0c;而…

OpenDDS系列(3) —— 第一个OpenDDS程序

文章目录 [toc]3.1 发送数据3.2 项目3.2.1 主题3.2.2 Publisher&#xff08;发布者&#xff09;3.2.3 Subscriber&#xff08;订阅者&#xff09; 3.3 在Windows上构建3.4 在Linux上构建3.4.1 运行 3.5 结论 3.1 发送数据 我们将创建一个主题&#xff0c;这是一个通过DDS交换数…

OpenDDS学习笔记(2):DDS概述

文章目录 一、DDS体系结构1.1 DLRL层1.2 DCPS层 二、DDS通信过程三、DDS通信特点四、DDS标准实现4.1 RTI DDS软件4.2 OpenSplice DDS软件4.3 OpenDDS软件 一、DDS体系结构 DDS采用DCPS通信机制&#xff0c;提供一个与平台无关的数据模型。它允许应用程序实时发布拥有的信息&am…

OpenDDS系列(1) —— OpenDDS 简介

1. OpenDDS简要介绍 1.1 简介 1.1.1 DDS是什么1.1.2 DDS通信的基本要素1.1.3 DDS架构的主要优点1.1.4 DDS产品种类1.1.5 OpenDDS 1.2 DDS的应用领域 美国海上战争中心(NSWC)高性能分布式计算系统&#xff08;HiPer-D&#xff09; 1.3 结论 1. OpenDDS简要介绍 1.1 简介 1.1.…

IDEA中查找与替换快捷键(项目全局替换、该文件下替换)

该文件下查找&#xff08;CtrlF&#xff09; 项目全局查找&#xff08;CtrlShiftF 或【Edit】——>【Find】——>【Find in Path…】&#xff09; 注意&#xff1a;本人电脑上的IDEA版本不支持该快捷键&#xff08;CtrlShiftF&#xff09;&#xff0c;有可能是快捷键冲突…

idea实现快捷批量修改替换

1. 在当前文件内容中替换 idea替换快捷键&#xff0c;批量处理对象 ctrl r: 当前文件内容替换&#xff0c;指的是在当前打开的文件中替换匹配的字符&#xff0c;只操作一个文件。 2. 在路径中替换(可替换不同文件夹中的内容) ctrl shift r: 在路径中替换&#xff0c;指的是…

idea 查找与替换

查找当前文件内容&#xff1a;ctrlF 如上图片 查找全局文件&#xff1a;ctrlshiftF 或double shift&#xff08;按两下&#xff09;或ctrlshiftN替换当前文件内容 &#xff1a;ctrlR 如上图片 你想通过编辑器快速的将所有的’29’&#xff0c;变为29&#xff0c;你可以 ctrl…

IDEA全局替换

在做项目时&#xff0c;有时会在整个项目里或指定文件夹下进行全局搜索和替换&#xff0c;这是一个很方便功能。使用方法如下&#xff1a; 一、全局搜索 1、使用快捷键CtrlShiftF打开搜索窗口&#xff0c;或者通过点击Edit–>Find–>Find in path打开搜索窗口&#xff0…

idea 替换

idea 替换功能说明 快捷键&#xff1a; ctrl R界面说明

idea全局查找和替换

原文 https://blog.csdn.net/fanrenxiang/article/details/80168215 全局查找 通过快捷键 CtrlShiftf 快速进入全局查找页面&#xff0c;或者通过 Edit 》Find 》Find In Path 1、你要检索的内容; 2、如何匹配内容&#xff0c;分别表示 区分大小写、单个单词、正则、过滤查找…

JDK更换IDEA如何修改

一、.打开idea设置。 1、点击file里面的settings... 二、取消默认javac编译 2、然后点开 Build, Execution, Deployment找到里面的compiler&#xff0c;再点开Java compiler 取消勾选。点击&#x1f197; 如图演示&#xff1a; 三、检查项目jdk配置 3、点击file里面的…

总结idea全局搜索和替换的快捷键

文章目录 1. 文章引言2. 按文本内容查找(替换)3. 按文件名称搜索文件4. 查看类的继承关系5. 查找类(方法)在哪使用6. 搜索任何东西7. 按名字搜索类 1. 文章引言 我们在使用idea做java开发时&#xff0c;通常会执行如下查找&#xff1a; 在页面内查找或替换 全局查找或替换 按…

IDEA代码替换

IDEA代码替换 快捷键 当前文件内容 C t r l R CtrlR CtrlR 全局替换 C t r l S h i f t R CtrlShiftR CtrlShiftR 使用 第一行输入栏&#xff1a;输入被替换内容 第二行输入栏&#xff1a;输入替换内容 详细使用 第一行输入栏后第一个图标&#xff1a;换行 第一行输…

IntelliJ IDEA中怎么全局搜索替换(整个项目)(Eclipse)

IntelliJ IDEA使用教程 &#xff08;总目录篇&#xff09; 我们用Eclipse或者IntelliJ IDEA编程&#xff0c;有时候需要将整个项目的某个字符串替换成其他的。 全局搜索我会&#xff0c;我还给调成ctrlg了呢&#xff0c;但是遇到要全局(整个项目)替换字符串。哎哟&#xff0c…

idea利用正则表达式快速替换

idea利用正则表达式快速替换 需求&#xff1a;要将link标签中的href属性替换成用thymeleaf表达的形式&#xff0c;让其资源寻址是从从项目名开始寻找的 如将<link rel"stylesheet" href"assets/css/bootstrap.min.css"> 换成<link rel"styl…