Java程序调用OpenDDS

本文详细介绍了如何在Java环境中配置OpenDDS并进行调用,包括环境准备、生成Java程序及jar包、上传至本地Maven仓库以及在IDEA中运行示例程序的步骤,帮助开发者实现Java与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_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
  }
 
  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包的步骤,在新电脑上来了一遍!),之后就能跑通程序了。  也不知道是不是这个问题,衰

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

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

点个赞吧

以下是使用Java生成调用OpenAI接口的程序示例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; public class OpenAI { public static void main(String[] args) { try { // Replace with your API key String apiKey = "YOUR_API_KEY"; // Replace with your prompt String prompt = "In a shocking finding, scientists discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English."; // Encode the prompt String encodedPrompt = URLEncoder.encode(prompt, "UTF-8"); // Create the URL for the API call URL url = new URL("https://api.openai.com/v1/completions?prompt=" + encodedPrompt); // Create the HTTP connection HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // Set the request method and headers connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Authorization", "Bearer " + apiKey); // Read the response from the API BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder responseBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { responseBuilder.append(line); } reader.close(); // Print the response from the API System.out.println(responseBuilder.toString()); } catch (Exception e) { e.printStackTrace(); } } } ``` 这个程序使用Java中的`HttpURLConnection`类来创建HTTP连接并发送API请求。它需要一个OpenAI API密钥和一个提示来生成文本。程序将提示编码为URL编码格式,然后将其添加到API调用的URL中。它还设置了HTTP请求的请求方法和标头,并从API读取响应。最后,程序将API的响应打印到控制台上。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值