日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS2015开发OpenDDS实例(ACE_TAO_6.5.10+OpenDDS_3.12+ActivePerl-5.28)

發布時間:2024/3/26 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS2015开发OpenDDS实例(ACE_TAO_6.5.10+OpenDDS_3.12+ActivePerl-5.28) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 新建ild文件

新建一個txt文檔,命名為:MessageTopic.idl
使用文本工具打開這個文件,輸入以下內容后保存

module MessageTopic{#pragma DCPS_DATA_TYPE "MessageTopic::Msg"#pragma DCPS_DATA_KEY "MessageTopic::Msg uuid"struct Msg{string uuid;string msgInfo;}; };

備注:
MessageTopic::Msg:必須和模塊名字和結構體的名稱一致;
MessageTopic::Msg uuid:uuid必須是結構體中的成員,名字保持一致。
DCPS_DATA_TYPE:idl要求定義的數據類型,而且必須是一個結構體,結構體內部的數據類型可以根據需要自定義。在編譯的時候,會自動根據這個宏編譯。
DCPS_DATA_KEY:表明了DCPS_DATA_TYPE數據類型的一個鍵值。鍵值用來區分同一個主題內的不同實體。在上面的idl定義中:uuid是數據類型MessageTopic::Msg唯一的建,每次發布時都必須是唯一的uuid值,這樣可以區分不同的實例。

2. 編譯ild文件

通過開始菜單,打開【VS2015開發人員命令提示】

進入到MessageTopic.idl所在的目錄。
輸入命令:

tao_idl MessageTopic.idl

如果不能運行,則要查看ACE_ROOT、TAO_ROOT、DDS_ROOT的環境變量是否添加上,并且把ACE和DDS的bin和lib目錄添加到Path中。

編譯完成之后,在對應的目錄下面會對應的出現幾個文件

然后在使用openDDS編譯idl,同樣通過輸入命令編譯:

opendds_idl MessageTopic.idl


編譯完成之后,會多生成3個文件:

其中MessageTopicTypeSupport.idl包含了MsgTypeSupport、MsgDataWriter、MsgDataReader的定義。這個定義的接口數據類型會在稍后注冊數據類型、發布數據樣本和接收數據樣本中使用

3. 編輯mpc文件

新建MessageTopic.mpc文件,和idl文件在同一個目錄下,把以下內容拷到文件中:

project(*idl): dcps{TypeSupport_Files{ MessageTopic.idl}custom_only = 1 }

在輸入命令:

mwc.pl -type vc14


在目錄下面就會生成sln文件,使用VS2015打開.sln文件,編譯通過!

4. 編寫發布端

在原來的mpc文件中添加如下內容,并且在目錄下面新建一個Publisher.cpp的空文件。

project(*Publisher) : dcpsexe_with_tcp {exename = publisherafter += *idlTypeSupport_Files {MessageTopic.idl}Source_Files {Publisher.cpp} }

添加之后的mpc的內容為:

然后在運行命令行:

mwc.pl -type vc14

重新生成sln文件。打開sln文件編寫Publisher.cpp文件的內容;

Publisher.cpp文件中的內容:

#include "MessageTopicTypeSupportImpl.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 "ace/Get_Opt.h" #include "ace/OS_NS_unistd.h"int main(int argc, char *argv[]) {//1.為當前進程初始化一個OpenDDS參與者/*調用宏TheParticipantFactoryWithArgs使用命令行初始化參與者工廠,這個命令行參數用來初始化ORB服務*/DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv);/*在域參與者工廠中注冊一個域參與者,使用默認的QoS策略,指定域ID為42(域ID可以范圍0x0-0x7FFFFFFF之間的任意值)使用DDS默認的狀態掩碼,確保所有在中間件中的相關通信狀態改變都能傳遞到應用程序中返回值:域參與對象的引用,用來注冊待公布的數據類型*/DDS::DomainParticipant_var participant = dpf->create_participant(42, PARTICIPANT_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);//2.注冊數據類型并創建主題MessageTopic::MsgTypeSupport_var mts = new MessageTopic::MsgTypeSupportImpl();/*調用register_type注冊一個帶有類型名稱的類型下面代碼中:使用空類型名稱,DDS缺省會把MsgTypeSupport接口標識符作為該類型的名稱,當然也可以輸入“msg”這樣的特定類型的名稱*/if (DDS::RETCODE_OK != mts->register_type(participant, "")) {return -1;}/*從類型支持對象中獲得注冊類型名稱,調用create_topic來創建主題.下面創建一個名稱為“MsgInfo”的主題,默認主題類型和默認的QoS策略*/CORBA::String_var typeName = mts->get_type_name();DDS::Topic_var topic = participant->create_topic("MsgInfo", typeName,TOPIC_QOS_DEFAULT,0,OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (!topic){return -2;}//3.創建公布者/*創建一個默認公布者QoS策略的公布者*/DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT,0,OpenDDS::DCPS::DEFAULT_STATUS_MASK );if (!pub){return -3;}//4.創建數據寫入者/*有了公布者,在調用create_datawriter()創建一個數據寫入者使用已經創建好的主題,默認的QoS策略和空的監聽者*/DDS::DataWriter_var writer = pub->create_datawriter(topic,DATAWRITER_QOS_DEFAULT,0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (!writer){return -4;}/*將數據寫入者引用轉換為MsgDataWriter對象引用,方便使用戶數寫入者類已經定義好的接口*/MessageTopic::MsgDataWriter_var msgWriter = MessageTopic::MsgDataWriter::_narrow(writer);//5.發布數據/*對于每個循環,調用write將數據發送給所有注冊過改主題的訂閱者*/MessageTopic::Msg msg;msg.uuid = "1";msg.msgInfo = "qqqqwqefgdafd";DDS::ReturnCode_t error = msgWriter->write(msg, DDS::HANDLE_NIL);if (error != DDS::RETCODE_OK){return -5;}//6.等待接收/*由于DDS中的數據公布和數據訂閱是解耦的,數據發布出去之后,接受者不一定能接收到。如果發布者要求所有的發布的數據全部被交付,需要在發布端調用調用數據寫入者的wait_for_acknowledgements()操作,來使發布端的應用程序一直等待,處于阻塞狀態,直到訂閱端接收到所有發布的數據。要使wait_for_acknowledgements()操作有效,數據讀者必須使用QoS策略為RELIABILITY。QoS策略缺省值為RELIABLE.數據寫入者調用這個函數,并且綁定一個timeout值作為等待的超時時間。*/DDS::Duration_t shutdownDelay = { 15,0 };DDS::ReturnCode_t result = writer->wait_for_acknowledgments(shutdownDelay);if (result != DDS::RETCODE_OK){return -6;}//7.實體清理/*在公布完數據以后,需要清理與OpenDDS相關的資源*/participant->delete_contained_entities();dpf->delete_participant(participant);TheServiceParticipant->shutdown();return 0; }

6. 編寫訂閱端

同樣和發布端一樣,在mpc文件中,添加如下內容:

project(*Subscriber) : dcpsexe_with_tcp {exename = subscriberafter += *idlTypeSupport_Files {MessageTopic.idl}Source_Files {Subscriber.cppDataReaderListenerImpl.cpp} }

添加之后的mpc文件:

和編譯發布端一樣,同樣使用【VS2015開發者工具】命令窗口,輸入以下命令:
mwc.pl -type vc14
并且在目錄下面新建三個空文件:Subscriber.cpp、DataReaderListenerImpl.h、DataReaderListenerImpl.cpp,分別用來編寫訂閱端的邏輯代碼,并且把這三個文件添加到項目中。

Subscriber.cpp的源碼

#include "MessageTopicTypeSupportImpl.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 "ace/Get_Opt.h" #include "ace/OS_NS_unistd.h" #include "DataReaderListenerImpl.h"using namespace MessageTopic;int main(int argc, char *argv[]) {//1.初始化參與者DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv);DDS::DomainParticipant_var participant = dpf->create_participant(42//域ID,PARTICIPANT_QOS_DEFAULT,0,OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (!participant){return -1;}//2.注冊數據類型并創建主題MessageTopic::MsgTypeSupport_var mts = new MessageTopic::MsgTypeSupportImpl();if (DDS::RETCODE_OK != mts->register_type(participant, "")){return -20;}CORBA::String_var typeName = mts->get_type_name();DDS::Topic_var topic = participant->create_topic("MsgInfo",typeName,TOPIC_QOS_DEFAULT,0,OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (!topic){return -21;}//3.創建訂閱者/*調用create_subscriber()操作創建一個帶有默認QoS策略的訂閱者*/DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT,0,OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (!sub){return -3;}//4.創建數據讀者以及監聽者/*訂閱端需要給數據讀者關聯一個監聽者,用來接收數據的到達*/DDS::DataReaderListener_var listener(new DataReaderListenerImpl);/*采用默認的QoS策略創建讀者,并將它與主題、剛剛創建的監聽者對象相關聯起來創建完成之后,主線程就可以去處理其他工作了。當有數據到達時,OpenDDS會調用監聽者對象的回調接口通知,在DataReaderListenerImpl類的回調函數中接收需要的數據就可多了*/DDS::DataReader_var dr = sub->create_datareader(topic,DATAREADER_QOS_DEFAULT,listener,OpenDDS::DCPS::DEFAULT_STATUS_MASK);if (!dr){return -4;}while (1) {ACE_OS::sleep(1);}//5.清理實體/*在訂閱完數據以后,需要清理與OpenDDS相關聯的資源delete_contained_entities刪除所有該參與者創建的主題、訂閱者*/participant->delete_contained_entities();dpf->delete_participant(participant);TheServiceParticipant->shutdown();return 0; }

DataReaderListenerImpl.h

// -*- C++ -*- // #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 DataReaderListenerImpl: public virtual OpenDDS::DCPS::LocalObject<OpenDDS::DCPS::DataReaderListener> { public:DataReaderListenerImpl();virtual ~DataReaderListenerImpl(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_connection_deleted(::DDS::DataReader_ptr reader);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 */

DataReaderListenerImpl.cpp

// -*- C++ -*- // #include "DataReaderListenerImpl.h" #include "MessageTopicTypeSupportC.h" #include "MessageTopicTypeSupportImpl.h" #include <dds/DCPS/Service_Participant.h> #include <ace/streams.h>using namespace MessageTopic;DataReaderListenerImpl::DataReaderListenerImpl(): num_reads_(0) { }DataReaderListenerImpl::~DataReaderListenerImpl() { }void DataReaderListenerImpl::on_data_available(DDS::DataReader_ptr reader) {++num_reads_;try {MessageTopic::MsgDataReader_var message_dr = MessageTopic::MsgDataReader::_narrow(reader);if (CORBA::is_nil(message_dr.in())) {cerr << "read: _narrow failed." << endl;exit(1);}MessageTopic::Msg message;DDS::SampleInfo si;DDS::ReturnCode_t status = message_dr->take_next_sample(message, si);if (status == DDS::RETCODE_OK) {cout << "Message: is = " << message.uuid << endl<< " msgInfo = " << message.msgInfo << endl;cout << "SampleInfo.sample_rank = " << si.sample_rank << endl;} 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);} }void DataReaderListenerImpl::on_requested_deadline_missed(DDS::DataReader_ptr,const DDS::RequestedDeadlineMissedStatus &) {cerr << "DataReaderListenerImpl::on_requested_deadline_missed" << endl; }void DataReaderListenerImpl::on_requested_incompatible_qos(DDS::DataReader_ptr,const DDS::RequestedIncompatibleQosStatus &) {cerr << "DataReaderListenerImpl::on_requested_incompatible_qos" << endl; }void DataReaderListenerImpl::on_liveliness_changed(DDS::DataReader_ptr,const DDS::LivelinessChangedStatus &) {cerr << "DataReaderListenerImpl::on_liveliness_changed" << endl; }void DataReaderListenerImpl::on_subscription_matched(DDS::DataReader_ptr,const DDS::SubscriptionMatchedStatus &) {cerr << "DataReaderListenerImpl::on_subscription_matched" << endl; }void DataReaderListenerImpl::on_sample_rejected(DDS::DataReader_ptr,const DDS::SampleRejectedStatus&) {cerr << "DataReaderListenerImpl::on_sample_rejected" << endl; }void DataReaderListenerImpl::on_sample_lost(DDS::DataReader_ptr,const DDS::SampleLostStatus&) {cerr << "DataReaderListenerImpl::on_sample_lost" << endl; }void DataReaderListenerImpl::on_subscription_disconnected(DDS::DataReader_ptr,const ::OpenDDS::DCPS::SubscriptionDisconnectedStatus &) {cerr << "DataReaderListenerImpl::on_subscription_disconnected" << endl; }void DataReaderListenerImpl::on_subscription_reconnected(DDS::DataReader_ptr,const ::OpenDDS::DCPS::SubscriptionReconnectedStatus &) {cerr << "DataReaderListenerImpl::on_subscription_reconnected" << endl; }void DataReaderListenerImpl::on_subscription_lost(DDS::DataReader_ptr,const ::OpenDDS::DCPS::SubscriptionLostStatus &) {cerr << "DataReaderListenerImpl::on_subscription_lost" << endl; }void DataReaderListenerImpl::on_budget_exceeded(DDS::DataReader_ptr,const ::OpenDDS::DCPS::BudgetExceededStatus&) {cerr << "DataReaderListenerImpl::on_budget_exceeded" << endl; }void DataReaderListenerImpl::on_connection_deleted(::DDS::DataReader_ptr reader) {}

7. 生成exe

編譯整個項目,在根目錄下生成exe

aaa

總結

以上是生活随笔為你收集整理的VS2015开发OpenDDS实例(ACE_TAO_6.5.10+OpenDDS_3.12+ActivePerl-5.28)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。