2017-09-11 2 views
2

In meiner Übung mit OpenDDS möchte ich mehrere Themen aus einer einzigen IDL-Struktur erstellen, ist das möglich? Ansonsten lass es mich wissen, wie es geht.OpenDDS - Erstellen Sie mehrere Themen aus einzelnen IDL-Struktur

Ich mache es wie unten, bitte korrigieren Sie mich, wenn es nicht der richtige Weg ist, es zu tun. Die Probe I ist bei OpenDDS-3.12/examples/DCPS/IntroductionToOpenDDS verfügbar verwenden

Die IDL wird wie folgt,

StockQuoter.idl 
--------------- 
module StockQuoter 
{ 
#pragma DCPS_DATA_TYPE "StockQuoter::Quote" 
#pragma DCPS_DATA_KEY "StockQuoter::Quote ticker" 

    struct Quote { 
    string ticker; 
    string exchange; 
    string full_name; 
    double value; 
    string data; 
    TimeBase::TimeT timestamp; 
    }; 
} 

publisher.cpp


// Create TOPICS and TYPES Vector 
    std::stringstream ss; 
    for(unsigned int idx = 0; idx < 100; ++idx) 
    { 
     ss << (idx+1); 
     TOPICS.push_back("TOPIC" + std::string(ss.str())); 
     TYPES.push_back("TYPE" + std::string(ss.str())); 
     ss.clear(); 
     ss.str(std::string()); 
    } 

    // Register 
    for(unsigned int idx = 0; idx < 100; ++idx) 
    { 
     vec_quote_servent.push_back(new StockQuoter::QuoteTypeSupportImpl()); 
     if (DDS::RETCODE_OK != vec_quote_servent[idx]->register_type(participant.in(), TYPES[idx].c_str())) 
     { 
      cerr << "register_type for " << TYPES[idx] << " failed." << endl; 
      ACE_OS::exit(1); 
     } 
    } 

    // Create a topics 
    for(unsigned int idx = 0; idx < 100; ++idx) 
    { 
     vec_quote_topic.push_back( participant->create_topic (TOPICS[idx].c_str(), 
             TYPES[idx].c_str(), 
             default_topic_qos, 
             DDS::TopicListener::_nil(), 
             ::OpenDDS::DCPS::DEFAULT_STATUS_MASK)); 

     if (CORBA::is_nil (vec_quote_topic[idx].in())) { 
      cerr << "create_topic for " << TOPICS[idx] << " failed." << endl; 
      ACE_OS::exit(1); 
     } 
    } 

    // Create DataWriters 
    for(unsigned int idx = 0; idx < 100; ++idx) 
    { 
     vec_quote_base_dw.push_back(pub->create_datawriter(vec_quote_topic[idx].in(), 
             dw_default_qos, 
             DDS::DataWriterListener::_nil(), 
             ::OpenDDS::DCPS::DEFAULT_STATUS_MASK)); 

     if (CORBA::is_nil (vec_quote_base_dw[idx].in())) { 
      cerr << "create_datawriter for " << TOPICS[idx] << " failed." << endl; 
      ACE_OS::exit(1); 
     } 

     vec_quote_dw.push_back(StockQuoter::QuoteDataWriter::_narrow(vec_quote_base_dw[idx].in())); 
     if (CORBA::is_nil (vec_quote_dw[idx].in())) { 
      cerr << TOPICS[idx] << " could not be narrowed"<< endl; 
      ACE_OS::exit(1); 
     } 
    } 

    // Create handle 
    for(unsigned int idx = 0; idx < 100 ; ++idx) 
    { 
     { 
      StockQuoter::Quote topic2; 
      topic2.ticker = CORBA::string_dup(TOPICS[idx].c_str()); 
      vec_topic_handle.push_back(vec_quote_dw[idx]->register_instance(topic2)); 
     } 
    } 

     // Publish data 
     StockQuoter::Quote vec_quote; 
     vec_quote.exchange = STOCK_EXCHANGE_NAME; 
     vec_quote.ticker = CORBA::string_dup("VEC_TOPIC"); 
     vec_quote.full_name = CORBA::string_dup("TOPIC Receipts"); 
     vec_quote.value = 1600.0 + 10.0*i; 
     vec_quote.timestamp = get_timestamp(); 

     for(unsigned int idx = 0; idx < 100; ++idx) 
     { 
      vec_quote.value += idx + 10; 
      cout << "Publishing " << TOPICS[idx] << " : " << vec_quote.value <<endl; 
      ret = vec_quote_dw[idx]->write(vec_quote, vec_topic_handle[idx]); 
      if (ret != DDS::RETCODE_OK) { 
      ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: TOPIC2 write returned %d.\n"), ret)); 
      } 
     } 

Antwort

0

Sie so viele Themen erstellen können, wie man es von einem Wunsch einzelne IDL-Datei. Sie tun es bereits mit dieser Zeile:

participant->create_topic (TOPICS[idx].c_str(), 
          TYPES[idx].c_str(), 
          default_topic_qos, 
          DDS::TopicListener::_nil(), 
          ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); 

jedoch jedes Thema, das Sie hat den gleichen Typ erstellt. Sie können auch verschiedene Typen für Themen erstellen, wenn Sie müssen.

+0

Vielen Dank für die Beleuchtung. Ein Beispiel aus dem gleichen Code, um den Punkt "Sie können auch verschiedene Typen für Themen erstellen, wenn Sie müssen" zu zeigen, wäre sehr willkommen. – Panch

+0

Ich werde eine andere Antwort (weil ich mehr als die 560 Zeichen brauche) in Kürze veröffentlichen. – Pete

1

a, jetzt bekomme ich den Punkt, den Sie fragen wollten. Sie können verschiedene Thementypen entweder in einer Datei pro Thema oder in einer Datei definieren. Wenn Sie mehr als einen Thematyp in einer IDL-Datei definieren, geben Sie für jede Datei den Typ Unterstützung ein. Lassen Sie mich das genauer mit demselben Beispiel beschreiben, das Sie verwenden. Die IDL-Datei für das IntroductionToOpenDDS Beispiel sieht wie folgt aus:

#include "orbsvcs/TimeBase.idl" 

module StockQuoter 
{ 
#pragma DCPS_DATA_TYPE "StockQuoter::Quote" 
#pragma DCPS_DATA_KEY "StockQuoter::Quote ticker" 

struct Quote { 
    string ticker; 
    string exchange; 
    string full_name; 
    double value; 
    TimeBase::TimeT timestamp; 
}; 

#pragma DCPS_DATA_TYPE "StockQuoter::ExchangeEvent" 
#pragma DCPS_DATA_KEY "StockQuoter::ExchangeEvent exchange" 

enum ExchangeEventType { TRADING_OPENED, 
         TRADING_CLOSED, 
         TRADING_SUSPENDED, 
         TRADING_RESUMED }; 
struct ExchangeEvent { 
    string exchange; 
    ExchangeEventType event; 
    TimeBase::TimeT timestamp; 
}; 
}; 

Wie Sie sehen können, sind zwei Arten definiert: Quote und ExchangeEvent. Wenn diese IDL-Datei kompiliert wird, geben Sie die Unterstützung für Quote und ExchangeEvent ein. Sie verwendet bereits die Art Unterstützung für die Verwendung dieser Linie (QuoteTypeSupportImpl):

vec_quote_servent.push_back(new StockQuoter::QuoteTypeSupportImpl()); 

Die gleiche Unterstützung für ExchangeEvent erzeugt wird, finden Sie eine Art Unterstützung StockQuoter::ExchangeEvent mit einem StockQuoter::ExchangeEventTypeSupportImpl() Methode aufgerufen. Verwenden Sie dies einfach, um ein Thema vom Typ ExchangeEvent zu erstellen.

Ich hoffe, das hilft. Wenn mehr Details benötigt werden, zögern Sie nicht zu fragen.

+1

Das verstehe ich jetzt vollkommen und danke dafür, dass wir Licht auf dieses Licht werfen. – Panch

Verwandte Themen