opendds使用方法
时间: 2023-11-29 07:06:42 浏览: 199
OpenDDS编译方法
OpenDDS是一个开源的分布式消息传递中间件,下面简单介绍一下它的使用方法。
1. 下载和安装
首先需要从OpenDDS官网下载对应平台的安装包,然后按照安装文档进行安装。安装完毕后,需要配置一些环境变量,例如将OpenDDS的bin目录加入到PATH环境变量中。
2. 创建IDL文件
在OpenDDS中,消息的格式是通过IDL文件来定义的。IDL是一种接口定义语言,用于描述接口、数据类型等。可以使用任何支持CORBA规范的IDL编译器来编译IDL文件,生成相应的代码。
3. 生成代码
在OpenDDS中,可以使用自带的IDL编译器DCPSInfoRepo来编译IDL文件。使用命令行来进行编译,例如:
```
$DDS_ROOT/bin/DCPSInfoRepo -ORBEndpoint iiop://localhost:12345 -d output_dir idl_file.idl
```
其中,-DDS_ROOT是OpenDDS的安装目录,-ORBEndpoint指定了DCPSInfoRepo的监听地址和端口,-d指定了生成的代码存放的目录,idl_file.idl是要编译的IDL文件。
4. 编写应用程序
使用生成的代码来编写应用程序。OpenDDS提供了多种语言的API,包括C++、Java、Python等。下面以C++为例,演示如何使用OpenDDS来发送和接收消息。
发送消息:
```c++
#include "idl_fileTypeSupportImpl.h"
#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/WaitSet.h>
int main(int argc, char** argv)
{
DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv);
DDS::DomainParticipant_var participant = dpf->create_participant(42, PARTICIPANT_QOS_DEFAULT, 0, 0);
idl_file::MessageTypeSupport_var ts = new idl_file::MessageTypeSupportImpl();
ts->register_type(participant, "");
DDS::Topic_var topic = participant->create_topic("MyTopic", ts->get_type_name(), TOPIC_QOS_DEFAULT, 0, 0);
DDS::Publisher_var publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, 0, 0);
DDS::DataWriter_var writer = publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, 0, 0);
idl_file::MessageDataWriter_var message_writer = idl_file::MessageDataWriter::_narrow(writer);
idl_file::Message message;
message.id = 1;
message.content = "Hello, world!";
message_writer->write(message, DDS::HANDLE_NIL);
participant->delete_contained_entities();
dpf->delete_participant(participant);
TheServiceParticipant->shutdown();
return 0;
}
```
接收消息:
```c++
#include "idl_fileTypeSupportImpl.h"
#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/WaitSet.h>
class MessageListener : public DDS::DataReaderListener
{
public:
virtual void on_data_available(DDS::DataReader_ptr reader)
{
idl_file::MessageDataReader_var message_reader = idl_file::MessageDataReader::_narrow(reader);
idl_file::Message message;
DDS::SampleInfo info;
while (true)
{
DDS::ReturnCode_t status = message_reader->take_next_sample(message, info);
if (status == DDS::RETCODE_OK)
{
if (info.valid_data)
{
std::cout << "Received message: " << message.content.in() << std::endl;
}
}
else if (status == DDS::RETCODE_NO_DATA)
{
break;
}
else
{
std::cerr << "Error reading message" << std::endl;
}
}
}
};
int main(int argc, char** argv)
{
DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv);
DDS::DomainParticipant_var participant = dpf->create_participant(42, PARTICIPANT_QOS_DEFAULT, 0, 0);
idl_file::MessageTypeSupport_var ts = new idl_file::MessageTypeSupportImpl();
ts->register_type(participant, "");
DDS::Topic_var topic = participant->create_topic("MyTopic", ts->get_type_name(), TOPIC_QOS_DEFAULT, 0, 0);
DDS::Subscriber_var subscriber = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, 0, 0);
DDS::DataReader_var reader = subscriber->create_datareader(topic, DATAREADER_QOS_DEFAULT, 0, 0);
MessageListener listener;
reader->set_listener(&listener, DDS::DATA_AVAILABLE_STATUS);
DDS::WaitSet_var ws = new DDS::WaitSet();
ws->attach_condition(reader->get_statuscondition(DDS::DATA_AVAILABLE_STATUS));
while (true)
{
DDS::ConditionSeq active_conditions;
DDS::Duration_t timeout = { 30, 0 };
ws->wait(active_conditions, timeout);
}
participant->delete_contained_entities();
dpf->delete_participant(participant);
TheServiceParticipant->shutdown();
return 0;
}
```
5. 运行应用程序
在启动应用程序之前,需要先启动DCPSInfoRepo。使用命令行来启动DCPSInfoRepo,例如:
```
$DDS_ROOT/bin/DCPSInfoRepo -ORBEndpoint iiop://localhost:12345
```
然后分别运行发送消息和接收消息的应用程序即可。
以上是OpenDDS的简单使用方法,更详细的内容可以参考官方文档。
阅读全文