OPenDDS程序 的 实现+运行

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

标题DDS程序实现和运行

在这里插入图片描述

本文记录了Windows10环境下OpenDDS环境搭建,idl自定义,代码生成,代码编写的全过程。

一、环境搭建

1.详细情况请参考开发笔记:1. OpenDDS环境搭建-Windows 10.note
编译好后生成了两个文件夹“OpenDDS-3.14”,“ACE_wrappers”这两个文件夹就是本地的运行库了。
[图片]

2.部署两台计算机。
a)把上述的两目录文件拷贝过去,
b)确保两台电脑有同样的开发环境.和设置同样的环境变量.同样的路径.

设置环境变量

1)系统变量
ACE_ROOT F:\J18-ZaiJian\ACE_wrappers
MPC_ROOT F:\J18-ZaiJian\ACE_wrappers\MPC
TAO_ROOT %ACE_ROOT%\TAO
DDS_ROOT F:\J18-ZaiJian\OpenDDS-3.14

2)Path变量
在Path中添加:中添加:
%ACE_ROOT%\lib
%ACE_ROOT%\bin
%DDS_ROOT%\lib
%DDS_ROOT%\bin

二、生成相关代码

0.新建工程目录名称:ZJ-DDS-220301
目录地址:F:\J18-ZaiJian\ZJ-DDS-220301

[图片]

以下操作全部是在此工程路径下进行的,F:\J18-ZaiJian\ZJ-DDS-220301

1.右键点击新建txt文件,名称为Demo.idl。
[图片]

[图片]

编写Demo.idl内容如下:

module DemoIdlModule {@topicstruct DemoTopic1 {@key long id;long counter;string text;};
};

[图片]

2.右键点击新建txt文件,名称为Demo.mpc文件,
[图片]

将其与Demo.idl放置在一个文件夹,Demo.mpc文件内容如下:

project(*idl): dcps {TypeSupport_Files {Demo.idl}custom_only = 1
}project(*publisher) : dcpsexe_with_tcp {exename   = publisherafter    += *idlTypeSupport_Files {Demo.idl}Source_Files {Publisher.cpp}
}project(*subscriber) : dcpsexe_with_tcp {exename   = subscriberafter    += *publisherTypeSupport_Files {Demo.idl}Source_Files {Subscriber.cppDataReaderListener.cpp}
}

[图片]

3.右键点击新建txt文件,名称分别为:Publisher.cpp,Subscriber.cpp及DataReaderListener.h/DataReaderListener.cpp
[图片]

4.使用vs开发人员命令行工具,输入命令:
[图片]

1)切到Demo.idl及Demo.mpc文件所在目录;

cd F:\J18-ZaiJian\ZJ-DDS-220301
perl %ACE_ROOT%\MPC\mwc.pl -type vs2017

//曾经我用的是这个命令,效果一样:

perl %ACE_ROOT%\MPC\mwc.pl -type vs2017 -include %DDS_ROOT%\MPC\config 

[图片]

2)代码生成完毕后,文件如下图:
[图片]

3)双击ZJ_DDS_220301.sln,用vs2017打开如下:

[图片]

5.右键单击解决方案,选择“重新生成解决方案”,查看是否能编译通过。
[图片]

vs解决方案以及文件夹生成的文件如下:
[图片]

6.单独为工程编写一个配置文件config_Pub.ini和config_Sub.ini
[图片]

用于对OpenDDS的协议,功能进行配置,config_Pub.ini和config_Sub.ini,如下:

[common]
DCPSGlobalTransportConfig=$file
DCPSDefaultDiscovery=DEFAULT_RTPS
[transport/the_rtps_transport]
transport_type=rtps_udp

三、编写代码

● 发布端:从本地文件AAA.txt读取数据,作为DDS主题数据,发布出去。
● 订阅端:接收到主题数据后,将数据写入本地文件BBB.txt中。

1. Publisher.cpp

#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/PublisherImpl.h>
#include <dds/DCPS/transport/tcp/TcpInst.h>
#include "dds/DCPS/StaticIncludes.h"#include <ace/streams.h>#include "DemoTypeSupportImpl.h"
using namespace DemoIdlModule;int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) {try {// 初始化参与者argv[1] = "-DCPSConfigFile";argv[2] = "config_Pub.ini";argc = 3;
#if 1   //0. 文件 //将参数从文件读出,然后作为DDS传输的主题数据。FILE* fp;//char c[] = "The counter is: 5";char c[] = "2";char buffer[50] = { 0 };//    char* buffer = { 0 };//    int bufsize = 0;long _counter = 0; //用来交给6.公布数据的 message.counterchar fname[80] = "F:\\J18-ZaiJian\\AAA.txt";int charCount = 0;/** 保存文件的字符个数 **//* 打开文件用于读 */if ((fp = fopen(fname, "r")) == NULL) {printf("Open file failed!!\n");exit(1);}while (fgetc(fp) != EOF) /** 统计字符个数 **/charCount++;/* 查找文件的开头 */fseek(fp, 0, SEEK_SET);/* 读取并显示数据 *///  fread(buffer, strlen(buffer) + 1, 1, fp);fread(buffer, charCount+1, 1, fp);cout << buffer << endl;fclose(fp);/* 字符串转换long */_counter = strtol(buffer, NULL, 10);cout << "Begin!!! _counter: " << _counter << endl;
#endif  // 1. 初始化参与者DDS::DomainParticipantFactory_var dpf =TheParticipantFactoryWithArgs(argc, argv);DDS::DomainParticipant_var participant =dpf->create_participant(111,PARTICIPANT_QOS_DEFAULT,DDS::DomainParticipantListener::_nil(),::OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (CORBA::is_nil(participant.in())) {cerr << "create_participant failed." << endl;return 1;}// 2. 注册数据类型//这里是Topic而不是Topics,意义不同,体现在idl文件里。DemoTopic1TypeSupportImpl* servant = new  DemoTopic1TypeSupportImpl();//这句是要根据XXXXTypeSupportImpl中的前缀与idl文件中的Topic key名对应,在这里即"DemoTopic1"OpenDDS::DCPS::LocalObject_var safe_servant = servant;if (DDS::RETCODE_OK != servant->register_type(participant.in(), "")) {cerr << "register_type failed." << endl;exit(1);}// 3. 创建主题CORBA::String_var type_name = servant->get_type_name();DDS::TopicQos topic_qos;participant->get_default_topic_qos(topic_qos);DDS::Topic_var topic =participant->create_topic("Movie Discussion List",type_name.in(),topic_qos,DDS::TopicListener::_nil(),::OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (CORBA::is_nil(topic.in())) {cerr << "create_topic failed." << endl;exit(1);}// 4. 创建公布者DDS::Publisher_var pub =participant->create_publisher(PUBLISHER_QOS_DEFAULT,DDS::PublisherListener::_nil(),::OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (CORBA::is_nil(pub.in())) {cerr << "create_publisher failed." << endl;exit(1);}// 5. 创建数据写者DDS::DataWriterQos dw_qos;pub->get_default_datawriter_qos(dw_qos);DDS::DataWriter_var dw =pub->create_datawriter(topic.in(),dw_qos,DDS::DataWriterListener::_nil(),::OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (CORBA::is_nil(dw.in())) {cerr << "create_datawriter failed." << endl;exit(1);}DemoTopic1DataWriter_var message_dw //这句是要根据XXXXDataWriter_var,XXXXDataWriter中的前缀与idl文件中的Topic key名对应,在这里即"DemoTopic1"= DemoTopic1DataWriter::_narrow(dw.in());//// Get default Publisher QoS from a DomainParticipant:DDS::PublisherQos pub_qos;DDS::ReturnCode_t ret;ret = participant->get_default_publisher_qos(pub_qos);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default publisher QoS" << std::endl;}// Get default Subscriber QoS from a DomainParticipant:DDS::SubscriberQos sub_qos;ret = participant->get_default_subscriber_qos(sub_qos);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default subscriber QoS" << std::endl;}// Get default Topic QoS from a DomainParticipant:DDS::TopicQos topic_qos2;ret = participant->get_default_topic_qos(topic_qos2);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default topic QoS" << std::endl;}// Get default DomainParticipant QoS from a DomainParticipantFactory:DDS::DomainParticipantQos dp_qos;ret = dpf->get_default_participant_qos(dp_qos);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default participant QoS" << std::endl;}// Get default DataWriter QoS from a Publisher:DDS::DataWriterQos dw_qos2;ret = pub->get_default_datawriter_qos(dw_qos2);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default data writer QoS" << std::endl;}// 6. 公布数据DemoTopic1 message;//这句是要根据idl文件中的Topic key名对应,在这里即"DemoTopic1"message.id = 99;::DDS::InstanceHandle_t handle = message_dw->register_instance(message);//   message.counter = 0;
#if 1message.counter = _counter;cout << "			RETT-message!!!: " << message.counter << endl;
#endifchar tMsg[50] = { 0 };while (1){message.counter++;memset(tMsg, 0, 50);sprintf(tMsg, "RETT-Msg Counter : %d", message.counter);message.text =  ::TAO::String_Manager(tMsg);message_dw->write(message, handle);ACE_OS::sleep(1);cout << "RETT..." << endl;cout << "RETT-halo eyeryone!!!" << message.counter << endl;}// 7. 实体清理participant->delete_contained_entities();dpf->delete_participant(participant);TheServiceParticipant->shutdown();}catch (CORBA::Exception& e){cerr << "PUB: Exception caught in main.cpp:" << endl<< e << endl;exit(1);}return 0;
}

2. Subscriber.cpp
/* 1. 初始化参与者
2. 注册数据类型并创建主题
3. 创建订阅者
4. 创建监听者
5. 创建数据读者
6. 清理与OpenDDS相关联的资源*/

#include "DemoTypeSupportImpl.h"
#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/PublisherImpl.h>
#include <dds/DCPS/transport/tcp/TcpInst.h>#include "dds/DCPS/StaticIncludes.h"
#include <ace/streams.h>#include "DataReaderListener.h"using namespace DemoIdlModule;int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) {try{// 初始化参与者argv[1] = "-DCPSConfigFile";argv[2] = "config_Sub.ini";argc = 3;// 1. 初始化参与者DDS::DomainParticipantFactory_var dpf =TheParticipantFactoryWithArgs(argc, argv);DDS::DomainParticipant_var participant =dpf->create_participant(111,PARTICIPANT_QOS_DEFAULT,DDS::DomainParticipantListener::_nil(),::OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (CORBA::is_nil(participant.in())) {cerr << "create_participant failed." << endl;return 1;}// 2. 注册数据类型并创建主题DemoTopic1TypeSupportImpl* servant = new	DemoTopic1TypeSupportImpl();OpenDDS::DCPS::LocalObject_var safe_servant = servant;if (DDS::RETCODE_OK != servant->register_type(participant.in(), "")) {cerr << "register_type failed." << endl;exit(1);}CORBA::String_var type_name = servant->get_type_name();DDS::TopicQos topic_qos;participant->get_default_topic_qos(topic_qos);DDS::Topic_var topic =participant->create_topic("Movie Discussion List",type_name.in(),topic_qos,DDS::TopicListener::_nil(),::OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (CORBA::is_nil(topic.in())) {cerr << "create_topic failed." << endl;exit(1);}// 3. 创建订阅者DDS::Subscriber_var sub =participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT,DDS::SubscriberListener::_nil(),::OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (CORBA::is_nil(sub.in())) {cerr << "Failed to create_subscriber." << endl;exit(1);}// 4. 创建监听者DDS::DataReaderListener_var listener(new DataReaderListener);DataReaderListener* listener_servant =dynamic_cast<DataReaderListener*>(listener.in());if (CORBA::is_nil(listener.in())) {cerr << "listener is nil." << endl;exit(1);}if (!listener_servant) {ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT("%N:%l main()")ACE_TEXT(" ERROR: listener_servant is nil (dynamic_cast failed)!\n")), -1);}// 5. 创建数据读者DDS::DataReaderQos dr_qos;sub->get_default_datareader_qos(dr_qos);DDS::DataReader_var dr = sub->create_datareader(topic.in(),dr_qos,listener.in(),::OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (CORBA::is_nil(dr.in())) {cerr << "create_datareader failed." << endl;exit(1);}//// Get default Publisher QoS from a DomainParticipant:DDS::PublisherQos pub_qos;DDS::ReturnCode_t ret;ret = participant->get_default_publisher_qos(pub_qos);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default publisher QoS" << std::endl;}// Get default Subscriber QoS from a DomainParticipant:DDS::SubscriberQos sub_qos;ret = participant->get_default_subscriber_qos(sub_qos);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default subscriber QoS" << std::endl;}// Get default Topic QoS from a DomainParticipant:DDS::TopicQos topic_qos2;ret = participant->get_default_topic_qos(topic_qos2);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default topic QoS" << std::endl;}// Get default DomainParticipant QoS from a DomainParticipantFactory:DDS::DomainParticipantQos dp_qos;ret = dpf->get_default_participant_qos(dp_qos);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default participant QoS" << std::endl;}// Get default DataReader QoS from a Subscriber:DDS::DataReaderQos dr_qos2;ret = sub->get_default_datareader_qos(dr_qos2);if (DDS::RETCODE_OK != ret) {std::cerr << "Could not get default data reader QoS" << std::endl;}while (1) {ACE_OS::sleep(1);}// 6. 清理与OpenDDS相关联的资源participant->delete_contained_entities();dpf->delete_participant(participant);TheServiceParticipant->shutdown();}catch (CORBA::Exception& e){cerr << "PUB: Exception caught in main.cpp:" << endl<< e << endl;exit(1);}return 0;
}

3. DataReaderListener.h

// 数据读者监听者实现
#ifndef DATAREADER_LISTENER_IMPL
#define DATAREADER_LISTENER_IMPL#include <dds/DdsDcpsSubscriptionExtC.h>
#include <dds/DCPS/LocalObject.h>#if !defined (ACE_LACKS_PRAGMA_ONCE)
#pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */class DataReaderListener: public virtual OpenDDS::DCPS::LocalObject<OpenDDS::DCPS::DataReaderListener>
{
public:DataReaderListener();virtual ~DataReaderListener(void);virtual void on_requested_deadline_missed(DDS::DataReader_ptr reader,const DDS::RequestedDeadlineMissedStatus& status);virtual void on_requested_incompatible_qos(DDS::DataReader_ptr reader,const DDS::RequestedIncompatibleQosStatus& status);virtual void on_liveliness_changed(DDS::DataReader_ptr reader,const DDS::LivelinessChangedStatus& status);virtual void on_subscription_matched(DDS::DataReader_ptr reader,const DDS::SubscriptionMatchedStatus& status);virtual void on_sample_rejected(DDS::DataReader_ptr reader,const DDS::SampleRejectedStatus& status);virtual void on_data_available(DDS::DataReader_ptr reader);virtual void on_sample_lost(DDS::DataReader_ptr reader,const DDS::SampleLostStatus& status);virtual void on_subscription_disconnected(DDS::DataReader_ptr reader,const ::OpenDDS::DCPS::SubscriptionDisconnectedStatus& status);virtual void on_subscription_reconnected(DDS::DataReader_ptr reader,const ::OpenDDS::DCPS::SubscriptionReconnectedStatus& status);virtual void on_subscription_lost(DDS::DataReader_ptr reader,const ::OpenDDS::DCPS::SubscriptionLostStatus& status);virtual void on_budget_exceeded(DDS::DataReader_ptr reader,const ::OpenDDS::DCPS::BudgetExceededStatus& status);long num_reads() const {return num_reads_;}private:DDS::DataReader_var reader_;long                  num_reads_;
};#endif /* DATAREADER_LISTENER_IMPL  */

4. DataReaderListener.cpp

// -*- C++ -*-
//
#include "DataReaderListener.h"
#include "DemoTypeSupportC.h"
#include "DemoTypeSupportImpl.h"
#include <dds/DCPS/Service_Participant.h>
#include <ace/streams.h>using namespace DemoIdlModule;DataReaderListener::DataReaderListener(): num_reads_(0)
{
}DataReaderListener::~DataReaderListener()
{
}void DataReaderListener::on_data_available(DDS::DataReader_ptr reader)
{++num_reads_;//0. 文件FILE* fp;//char c[] = "The counter is: 5";char c[50] = "2";char buffer[50] = { 0 };long _counter = 0;/* 打开文件用于读写 */if (fp = fopen("F:\\J18-ZaiJian\\BBB.txt", "w+"))cout << "RETT-Open file success--- ";try {DemoTopic1DataReader_var message_dr = DemoTopic1DataReader::_narrow(reader);if (CORBA::is_nil(message_dr.in())) {cerr << "read: _narrow failed." << endl;exit(1);}DemoTopic1 message;DDS::SampleInfo si;DDS::ReturnCode_t status = message_dr->take_next_sample(message, si);if (status == DDS::RETCODE_OK) {cout << "PP-Message: id    = " << message.id << endl<< "         PP-DemoTopic1_Counter = " << message.counter << endl<< "         PP-DemoTopic1_Text = " << message.text << endl;cout << "SampleInfo.sample_rank = " << si.sample_rank << endl;_counter = message.counter;}else if (status == DDS::RETCODE_NO_DATA) {cerr << "ERROR: reader received DDS::RETCODE_NO_DATA!" << endl;}else {cerr << "ERROR: read Message: Error: " << status << endl;}}catch (CORBA::Exception& e) {cerr << "Exception caught in read:" << endl << e << endl;exit(1);}ltoa(_counter, c, 10);/* 写入数据到文件 */fwrite(c, strlen(c) + 1, 1, fp);/* 查找文件的开头 */fseek(fp, 0, SEEK_SET);/* 读取并显示数据 */fread(buffer, strlen(c) + 1, 1, fp);cout << buffer << endl;fclose(fp);
}void DataReaderListener::on_requested_deadline_missed(DDS::DataReader_ptr,const DDS::RequestedDeadlineMissedStatus&)
{cerr << "DataReaderListener::on_requested_deadline_missed" << endl;
}void DataReaderListener::on_requested_incompatible_qos(DDS::DataReader_ptr,const DDS::RequestedIncompatibleQosStatus&)
{cerr << "DataReaderListener::on_requested_incompatible_qos" << endl;
}void DataReaderListener::on_liveliness_changed(DDS::DataReader_ptr,const DDS::LivelinessChangedStatus&)
{cerr << "DataReaderListener::on_liveliness_changed" << endl;
}void DataReaderListener::on_subscription_matched(DDS::DataReader_ptr,const DDS::SubscriptionMatchedStatus&)
{cerr << "DataReaderListener::on_subscription_matched" << endl;
}void DataReaderListener::on_sample_rejected(DDS::DataReader_ptr,const DDS::SampleRejectedStatus&)
{cerr << "DataReaderListener::on_sample_rejected" << endl;
}void DataReaderListener::on_sample_lost(DDS::DataReader_ptr,const DDS::SampleLostStatus&)
{cerr << "DataReaderListener::on_sample_lost" << endl;
}void DataReaderListener::on_subscription_disconnected(DDS::DataReader_ptr,const ::OpenDDS::DCPS::SubscriptionDisconnectedStatus&)
{cerr << "DataReaderListener::on_subscription_disconnected" << endl;
}void DataReaderListener::on_subscription_reconnected(DDS::DataReader_ptr,const ::OpenDDS::DCPS::SubscriptionReconnectedStatus&)
{cerr << "DataReaderListener::on_subscription_reconnected" << endl;
}void DataReaderListener::on_subscription_lost(DDS::DataReader_ptr,const ::OpenDDS::DCPS::SubscriptionLostStatus&)
{cerr << "DataReaderListener::on_subscription_lost" << endl;
}void DataReaderListener::on_budget_exceeded(DDS::DataReader_ptr,const ::OpenDDS::DCPS::BudgetExceededStatus&)
{cerr << "DataReaderListener::on_budget_exceeded" << endl;
}

四、编译

0)点击“重新生成解决方案”,重新编译。
[图片]

1)编译完成后,生成exe文件如下:
[图片]

2)在路径下新建文件,名称为:AAA.txt,内容:123
[图片]

3)把编译好的程序目录拷贝到之前已搭建好同样开发环境的另一台电脑上。
[图片]

五、运行(1、对等发现方式;2、集中发现方式)

0.运行前准备
操作如下:用网线连接两台电脑。

	1)双方电脑安装DUKTO. 然后笔记本电脑将编译成功的工程目录F:\J18-ZaiJian\ZJ-DDS-220301全部拷贝到台式电脑中.路径地址都是F:\J18-ZaiJian\ZJ-DDS-2203012)设置IP地址,并确保防火墙全部关闭。必须先确保网络通信没有问题。3)确保台式电脑的开发环境\环境变量及路径与笔记本电脑的设置是一样的。配置环境变量和路径的具体步骤请参考文章《OpenDDS环境搭建-Windows 10.https://blog.csdn.net/babypphappy/article/details/123228108

1.采用对等发现的方式运行:
config_Pub.ini和config_Sub.ini配置文件内容基本一样为:

[common]
DCPSDefaultDiscovery=DEFAULT_RTPS
DCPSGlobalTransportConfig=$file[transport/the_rtps_transport]
transport_type=rtps_udp

1).如图:分别在两台电脑上,不分先后的运行一个Publisher或Subscriber实例,
a)一台电脑,执行命令如下:

publisher -DCPSConfigFile config_PubEq.ini
b)另一台电脑,执行命令如下:
subscriber -DCPSConfigFile config_SubEq.ini
c)会看到如下图的运行结果。订阅端会在F:\J18-ZaiJian下生成一个文件:BBB.txt

[图片]

[图片]

2). 当然,对等发现方式其实只需要执行./Publisher和./Subscriber,
默认就会去找config_Pub.ini和config_Sub.ini
[图片]

2. 另外,还有另一种方式,采用集中发现的方式运行:(请查看后面的笔记)
config_Pub.ini和config_Sub.ini配置文件内容基本一样为:

[common]
DCPSDebugLevel=5
DCPSInfoRepo=corbaloc::192.168.2.112:65123/DCPSInfoRepo
DCPSGlobalTransportConfig=config1[config/config1]
transports=tcp1[transport/tcp1]
transport_type=tcp

[图片]

六、具体的集中发现的方式运行(比较繁琐)

操作如下:用网线连接两台电脑。

1)双方电脑安装DUKTO. 然后笔记本电脑将编译成功的工程目录F:\J18-ZaiJian\ZJ-DDS-220301全部拷贝到台式电脑中.路径地址都是F:\J18-ZaiJian\ZJ-DDS-220301
2)设置IP地址,并确保防火墙全部关闭。必须先确保网络通信没有问题。
3)确保台式电脑的开发环境\环境变量及路径与笔记本电脑的设置是一样的。配置环境变量和路径的具体步骤请参考文章《OpenDDS环境搭建-Windows 10.https://blog.csdn.net/babypphappy/article/details/123228108

A端订阅—台式电脑的操作如下:(确保开发环境\环境变量及路径都设置完毕)

  1. 台式电脑的IP位:192.168.2.112
    ipconfig //查看本机IP地址,确保设置为192.168.2.112,

  2. 打开vs2017开发人员命令行提示符: 看能否ping通笔记本电脑.

ping 192.168.2.110
正在 Ping 192.168.2.110 具有 32 字节的数据:
来自 192.168.2.110 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.2.110 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.2.110 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.2.110 的回复: 字节=32 时间<1ms TTL=64
  1. 两台电脑互ping能通后,
    1)打开vs2017开发人员命令行提示符,先setenv.cmd
%DDS_ROOT%\setenv.cmd

然后开启DCPS服务

%DDS_ROOT%/bin/DCPSInfoRepo  -ORBListenEndpoints  iiop://192.168.2.112:65123

2)再打开vs2017开发人员命令行提示符,先setenv.cmd

%DDS_ROOT%\setenv.cmd

然后执行:订阅

subscriber  -DCPSInfoRepo  corbaloc::192.168.2.112:65123/DCPSInfoRepo	

B端发布—笔记本电脑的操作如下:(确保开发环境\环境变量及路径都设置完毕)

  1. 笔记本电脑的IP位:192.168.2.110
    ipconfig//查看笔记本电脑本机IP地址,确保设置为192.168.2.110

  2. 打开vs2017开发人员命令行提示符: 看能否ping通台式电脑ip

ping 192.168.2.112 
正在 Ping 192.168.2.112 具有 32 字节的数据:来自 192.168.2.112 的回复: 字节=32 时间<1ms TTL=64来自 192.168.2.112 的回复: 字节=32 时间<1ms TTL=64来自 192.168.2.112 的回复: 字节=32 时间<1ms TTL=64来自 192.168.2.112 的回复: 字节=32 时间<1ms TTL=64
  1. 两台电脑互ping能通成功后,打开vs2017开发人员命令行提示符。

     1)先setenv.cmd
    
%DDS_ROOT%\setenv.cmd
	2)然后执行:publisher(发布)
publisher  -DCPSInfoRepo  corbaloc::192.168.2.112:65123/DCPSInfoRepo

【总结】运行OPenDDS例程(采用集中发现的方式)

(F:\J18-ZaiJian\ZJ-DDS-220301)
两台电脑操作如下运行测试(开发人员命令行提示符:vs2017和vs2019自带的命令行)
☆☆.必须关闭双方所有的防火墙,且确认主机A和主机B能够ping通.☆☆
主机A:(台式电脑 IP:192.168.2.112)[记得提前setenv.cmd]

%DDS_ROOT%/bin/DCPSInfoRepo  -ORBListenEndpoints  iiop://192.168.2.112:65123
subscriber  -DCPSInfoRepo  corbaloc::192.168.2.112:65123/DCPSInfoRepo

主机B:(笔记本电脑 IP:192.168.2.110)[记得提前setenv.cmd]

publisher  -DCPSInfoRepo  corbaloc::192.168.2.112:65123/DCPSInfoRepo

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

相关文章

OpenDDS-1

转自&#xff1a;软件开发.OpenDDS 设计智能座舱时ECU之间通信及与TSP通信选择使用OpenDDS是可以的&#xff0c;因此不少人都认为OpenDDS是属于汽车以太网&#xff08;Aumotive Ethernet&#xff0c;AE&#xff09;&#xff0c;但事实上autosar AE中定义中有SomeIP、DoIP、AVB…

Java程序调用OpenDDS

一、前言 前面我们用三篇博客介绍了 OpenDDS在WIndows上的环境配置 Windows下的OpenDDS编译&#xff08;超详细&#xff09;_山中野竹的博客-CSDN博客_opendds windows 三种方式运行发布订阅示例程序 OpenDDS运行示例&#xff08;Messenger&#xff09;程序_山中野竹的博客-C…

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;换行 第一行输…