VS2015开发OpenDDS实例(ACE_TAO_6.5.10+OpenDDS_3.12+ActivePerl-5.28)
1. 新建ild文件
新建一個txt文檔,命名為:MessageTopic.idl
 使用文本工具打開這個文件,輸入以下內容后保存
備注:
 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所在的目錄。
 輸入命令:
如果不能運行,則要查看ACE_ROOT、TAO_ROOT、DDS_ROOT的環境變量是否添加上,并且把ACE和DDS的bin和lib目錄添加到Path中。
 
 編譯完成之后,在對應的目錄下面會對應的出現幾個文件
 
 然后在使用openDDS編譯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的內容為:
 
 然后在運行命令行:
重新生成sln文件。打開sln文件編寫Publisher.cpp文件的內容;
 
 Publisher.cpp文件中的內容:
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的源碼
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【F-16资料库】AIFF和IFF控制面
- 下一篇: 多线程爬取百度关键字结果,并获取真实ur
