int main(int argc, char *argv[]) { os_time delay_2ms = { 0, 2000000 }; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant char partition_name[] = "Listener example"; mgr->createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr->registerType(mt.in()); //create Topic char topic_name[] = "ListenerData_Msg"; mgr->createTopic(topic_name); //create Publisher mgr->createPublisher(); // create DataWriter mgr->createWriter(); // Publish Events DataWriter_ptr dwriter = mgr->getWriter(); MsgDataWriter_var listenerWriter = MsgDataWriter::_narrow(dwriter); Msg msgInstance; /* Example on Stack */ msgInstance.userID = 1; msgInstance.message = CORBA::string_dup("Hello World"); cout << "=== [ListenerDataPublisher] writing a message containing :" << endl; cout << " userID : " << msgInstance.userID << endl; cout << " Message : \"" << msgInstance.message << "\"" << endl; ReturnCode_t status = listenerWriter->write(msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_2ms); /* Remove the DataWriters */ mgr->deleteWriter(listenerWriter.in ()); /* Remove the Publisher. */ mgr->deletePublisher(); /* Remove the Topics. */ mgr->deleteTopic(); /* Remove Participant. */ mgr->deleteParticipant(); delete mgr; return 0; }
int main(int argc, char *argv[]) { os_time delay_100ms = { 0, 100000000 }; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant char partition_name[] = "ContentFilteredTopic example"; mgr->createParticipant(partition_name); StockTypeSupport_var st = new StockTypeSupport(); mgr->registerType(st.in()); //create Topic char topic_name[] = "StockTrackerExclusive"; mgr->createTopic(topic_name); //create Publisher mgr->createPublisher(); // create DataWriter mgr->createWriter(); DataWriter_ptr dWriter = mgr->getWriter(); StockDataWriter_var ContentFilteredTopicDataWriter = StockDataWriter::_narrow(dWriter); Stock geQuote; Stock msftQuote; geQuote.ticker = CORBA::string_dup("GE"); geQuote.price = 12.00f; msftQuote.ticker = CORBA::string_dup("MSFT"); msftQuote.price = 25.00f; InstanceHandle_t geHandle = ContentFilteredTopicDataWriter->register_instance(geQuote); InstanceHandle_t msftHandle = ContentFilteredTopicDataWriter->register_instance(msftQuote); // Publish Events ReturnCode_t status; // update ContentFilteredTopicData price every second for (int x = 0; x < 20; x++) { geQuote.price = geQuote.price + 0.5; msftQuote.price = msftQuote.price + 1.5; printf("=== [ContentFilteredTopicDataPublisher] sends 2 stockQuotes : (GE, %.1f) (MSFT, %.1f)\n", geQuote.price, msftQuote.price); status = ContentFilteredTopicDataWriter->write(geQuote, geHandle); checkStatus(status, "StockDataWriter::write"); status = ContentFilteredTopicDataWriter->write(msftQuote, msftHandle); checkStatus(status, "StockDataWriter::write"); os_nanoSleep(delay_100ms); } // signal to terminate geQuote.price = - 1; msftQuote.price = - 1; ContentFilteredTopicDataWriter->write(geQuote, geHandle); ContentFilteredTopicDataWriter->write(msftQuote, msftHandle); cout << "Market Closed" << endl; /* Unregister the instances */ ContentFilteredTopicDataWriter->unregister_instance(geQuote, geHandle); ContentFilteredTopicDataWriter->unregister_instance(msftQuote, msftHandle); /* Remove the DataWriters */ mgr->deleteWriter(ContentFilteredTopicDataWriter.in ()); /* Remove the Publisher. */ mgr->deletePublisher(); /* Remove the Topics. */ mgr->deleteTopic(); /* Remove Participant. */ mgr->deleteParticipant(); delete mgr; return 0; }
int OSPL_MAIN (int argc, char *argv[]) { bool automatic = true; ReturnCode_t status = - 1; os_time delay = { 20, 0 }; os_time delay_1s = { 1, 0 }; char buf[MAX_MSG_LEN]; if (argc < 4) { usage(); } if ((strcmp(argv[1], "transient") && strcmp(argv[1], "persistent")) || (strcmp(argv[2], "false") && strcmp(argv[2], "true"))) { usage(); } string durability_kind(argv[1]); bool autodispose_unregistered_instances = (strcmp(argv[2], "true") == 0); DDSEntityManager mgr (durability_kind, autodispose_unregistered_instances); automatic = (strcmp(argv[3], "true") == 0); // Wait for the Subscriber (case of transient = true && auto_dispose = true) os_nanoSleep(delay_1s); // create domain participant char partition_name[] = "Durability example"; mgr.createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr.registerType(mt.in()); //create Topic char topic_name[] = "DurabilityData_Msg"; mgr.createTopic(topic_name); //create Publisher mgr.createPublisher(); // create DataWriter mgr.createWriter(); // Publish Events DataWriter_var dwriter = mgr.getWriter(); MsgDataWriter_var DurabilityDataWriter = MsgDataWriter::_narrow(dwriter.in()); Msg *instances[10]; InstanceHandle_t userHandle[10]; for (int x = 0; x < 10; x++) { instances[x] = new Msg(); instances[x]->id = x; snprintf(buf, MAX_MSG_LEN, "%d", x); userHandle[x] = DurabilityDataWriter->register_instance(*instances[x]); instances[x]->content = DDS::string_dup(buf); cout << instances[x]->content << endl; DurabilityDataWriter->write(*instances[x], userHandle[x]); } if (! automatic) { char c = 0; cout << "Enter E to exit" << endl; while (c != 'E') { cin >> c; } }
int main(int argc, char *argv[]) { os_time delay_200ms = { 0, 200000000 }; os_time delay_500ms = { 0, 500000000 }; cout << "argc=" << argc << endl; if (argc < 3) { usage(); } if ((strcmp(argv[1], "false") != 0) && (strcmp(argv[1], "true") != 0) && (strcmp(argv[2], "dispose") != 0) && (strcmp(argv[2], "unregister") != 0) && (strcmp(argv[2], "stoppub") != 0)) { usage(); } bool autodispose_unregistered_instances = (strcmp(argv[1], "true") == 0); // create domain participant char partition_name[] = "Lifecycle example"; //------------------ Msg topic --------------------// DDSEntityManager *mgr = new DDSEntityManager (autodispose_unregistered_instances); // create domain participant mgr->createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr->registerType(mt.in()); //create Topic char topic_name[] = "Lifecycle_Msg"; mgr->createTopic(topic_name); //create Publisher mgr->createPublisher(); // create DataWriters mgr->createWriters(); DataWriter_ptr dwriter = mgr->getWriter(); MsgDataWriter_var LifecycleWriter = MsgDataWriter::_narrow(dwriter); DataWriter_ptr dwriter_stopper = mgr->getWriter_stopper(); MsgDataWriter_var LifecycleWriter_stopper = MsgDataWriter::_narrow(dwriter_stopper); os_nanoSleep(delay_500ms); ReturnCode_t status; if (strcmp(argv[2], "dispose") == 0) { Msg *msgInstance = new Msg(); msgInstance->userID = 1; msgInstance->message = CORBA::string_dup("Lifecycle_1"); msgInstance->writerStates = CORBA::string_dup("SAMPLE_SENT -> INSTANCE_DISPOSED -> DATAWRITER_DELETED"); cout << "=== [Publisher] :" << endl; cout << " userID : " << msgInstance->userID << endl; cout << " Message : \"" << msgInstance->message << "\"" << endl; cout << " writerStates : \"" << msgInstance->writerStates << "\"" << endl; status = LifecycleWriter->write(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_500ms); // cout << "=== [Publisher] : SAMPLE_SENT" << endl; // Dispose instance status = LifecycleWriter->dispose(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::dispose"); cout << "=== [Publisher] : INSTANCE_DISPOSED" << endl; /* Release the data-samples. */ delete msgInstance; // msg allocated on heap: explicit de-allocation required!! } else if (strcmp(argv[2], "unregister") == 0) { Msg *msgInstance = new Msg(); msgInstance->userID = 2; msgInstance->message = CORBA::string_dup("Lifecycle_2"); msgInstance->writerStates = CORBA::string_dup("SAMPLE_SENT -> INSTANCE_UNREGISTERED -> DATAWRITER_DELETED"); cout << "=== [Publisher] :" << endl; cout << " userID : " << msgInstance->userID << endl; cout << " Message : \"" << msgInstance->message << "\"" << endl; cout << " writerStates : \"" << msgInstance->writerStates << "\"" << endl; status = LifecycleWriter->write(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_500ms); // cout << "=== [Publisher] : SAMPLE_SENT" << endl; // Unregister instance : the auto_dispose_unregistered_instances flag // is currently ignored and the instance is never disposed automatically status = LifecycleWriter->unregister_instance(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::unregister_instance"); cout << "=== [Publisher] : INSTANCE_UNREGISTERED" << endl; /* Release the data-samples. */ delete msgInstance; // msg allocated on heap: explicit de-allocation required!! } else if (strcmp(argv[2], "stoppub") == 0) { Msg *msgInstance = new Msg(); msgInstance->userID = 3; msgInstance->message = CORBA::string_dup("Lifecycle_3"); msgInstance->writerStates = CORBA::string_dup("SAMPLE_SENT -> DATAWRITER_DELETED"); cout << "=== [Publisher] :" << endl; cout << " userID : " << msgInstance->userID << endl; cout << " Message : \"" << msgInstance->message << "\"" << endl; cout << " writerStates : \"" << msgInstance->writerStates << "\"" << endl; status = LifecycleWriter->write(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_500ms); // cout << "=== [Publisher] : SAMPLE_SENT" << endl; /* Release the data-samples. */ delete msgInstance; // msg allocated on heap: explicit de-allocation required!! } // let the subscriber treat the previous writer state !!!! cout << "=== [Publisher] waiting 500ms to let the subscriber treat the previous write state ..." << endl; os_nanoSleep(delay_500ms); /* Remove the DataWriters */ mgr->deleteWriter(LifecycleWriter.in ()); os_nanoSleep(delay_500ms); cout << "=== [Publisher] : DATAWRITER_DELETED" << endl; // Stop the subscriber Msg *msgInstance = new Msg(); msgInstance->userID = 4; msgInstance->message = CORBA::string_dup("Lifecycle_4"); msgInstance->writerStates = CORBA::string_dup("STOPPING_SUBSCRIBER"); cout << "=== [Publisher] :" << endl; cout << " userID : " << msgInstance->userID << endl; cout << " Message : \"" << msgInstance->message << "\"" << endl; cout << " writerStates : \"" << msgInstance->writerStates << "\"" << endl; status = LifecycleWriter_stopper->write(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_500ms); // //cout << "=== [Publisher] : SAMPLE_SENT" << endl; /* Release the data-samples. */ delete msgInstance; // msg allocated on heap: explicit de-allocation required!! /* Remove the DataWriter_stopper */ mgr->deleteWriter(LifecycleWriter_stopper.in ()); /* Remove the Publisher. */ mgr->deletePublisher(); /* Remove the Topics. */ mgr->deleteTopic(); mgr->deleteParticipant(); delete mgr; return 0; }
int NodeBtHandler (int argc, char *argv[]) { // DDS değişkenleri DDSEntityManager mgrBtPub; DDSEntityManager mgrReqSub; ReturnCode_t status; SampleInfoSeq_var infoSeq = new SampleInfoSeq(); BtSeq* btSeqInstance = new BtSeq(); ServerReqSeq serverReqSeq; // Zaman ile alakalı değişkenler long int messageIDCount = 0; Time_t tsBeforeTheScan = { 0, 0 }; Time_t tsAfterTheScan = { 0, 0 }; //Time_t tsWifiPub = { 0, 0 }; struct timeval tsConverter; DDS::Duration_t waitAckTime = { 0, 800000000 }; //800ms int refreshRate = 60; // Veri tutucular (data structures) vector<string> btMacHolder; vector<int> btRssiHolder; string btFileContenHolder; // Bluetooth tarama sonuçlarının yazdırıldığı dosyadan okuma yapacak // olan değişken boost::filesystem::ifstream fIn; // Bluetooth tarama sıklığı ayarlayan değişken int refreshRateCounter = -1; char hostName[1024]; gethostname(hostName, 1024); // !!! Bluetooth tarama mesajlarını Publish edecek Topic yaratılıyor // ve o Topic'e ait konfigürasyon ayarları yapılıyor. // Domain participant yaratılıyor mgrBtPub.createParticipant ("KonSens_BtSeq_Participant"); // BtSeq tipi yaratılıyor BtSeqTypeSupport_var btSeqTs = new BtSeqTypeSupport(); mgrBtPub.registerType(btSeqTs.in()); // Topic yaratılıyor char btPubTopicName[] = "KonSensData_BtSeq_Topic"; mgrBtPub.createTopic(btPubTopicName); // Publisher yaratılıyor mgrBtPub.createPublisher(); // DataWriter yaratılıyor bool autodispose_unregistered_instances = false; mgrBtPub.createWriter(autodispose_unregistered_instances, KEEP_ALL_HISTORY_QOS, BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS); // Yaratılan DataWriter, BtSeq tipi için özelleştiriliyor DataWriter_var dWriter = mgrBtPub.getWriter (); BtSeqDataWriter_var btSeqWriter = BtSeqDataWriter::_narrow(dWriter.in()); // Düğüm numarasını atanıyor btSeqInstance->userID = 13; // Publish edilecek olan mesajlara zaman etiketi takabilmek için // btSeqInstance değişkeni register ediliyor //userHandle = btSeqWriter->register_instance_w_timestamp(*btSeqInstance, // tsWifiPub); cout << "=== [Publisher of KonSensData_BtSeq_Topic] Ready ..." << endl; // !!! Sunucudan gelen komutlara Subscribe olacak olan Topic yaratılıyor // ve o Topic için gerekli konfigürasyon ayarları yapılıyor // Domain participant yaratılıyor mgrReqSub.createParticipant( "KonSensData_ServerReq_Participant_Server_to_Node"); // ServerReq tipi yaratılıyor. ServerReqTypeSupport_var mgrSubscriberTS = new ServerReqTypeSupport(); mgrReqSub.registerType(mgrSubscriberTS.in()); // Topic yaratılıyor char reqSubTopicName[] = "KonSensData_ServerReq_Topic_Server_to_Node"; mgrReqSub.createTopic(reqSubTopicName, RELIABLE_RELIABILITY_QOS, VOLATILE_DURABILITY_QOS); // Subscriber yaratılıyor mgrReqSub.createSubscriber(); // DataReader yaratılıyor mgrReqSub.createReader(KEEP_LAST_HISTORY_QOS, 1); // Yaratılan DataReader, ServerReq tipi için özelleştiriliyor. DataReader_var dReaderSub = mgrReqSub.getReader(); ServerReqDataReader_var serverReqReader = ServerReqDataReader::_narrow(dReaderSub.in()); checkHandle(serverReqReader.in(), "ServerReqDataReader::_narrow"); cout << "=== [Subscriber KonSensData_ServerReq_Topic_Server_to_Node]" " Ready ..." << endl; // Bluetooth aktif hale getiriliyor. system("sudo hciconfig -a hci0 up"); stringstream ssBtName; ssBtName << "sudo bt-adapter -a hci0 --set Name \"" << hostName << "\""; system(ssBtName.str().c_str()); system("sudo bt-adapter -a hci0 --set Discoverable 1"); // Yenileme sıklığını belirleyecek olan 'timelimit' değişkeni yaratılıyor. Timeout timelimit(std::chrono::milliseconds(refreshRate*1000)); while (true) { if (timelimit.isExpired() || refreshRateCounter == -1) { // BT mesajını Publish etmek için hazırlık yapılıyor. cout << "-----------------------------------" << endl; btSeqInstance->messageID = messageIDCount; // Tarama öncesi alınan zaman etiketi (timestamp[0]) gettimeofday(&tsConverter, NULL); tsBeforeTheScan.sec = tsConverter.tv_sec; tsBeforeTheScan.nanosec = (tsConverter.tv_usec * 1000); cout << " timestamp[0] (before the scan) = " << tsBeforeTheScan.sec << '.'; cout << setfill('0') << setw(9) << (tsBeforeTheScan.nanosec) << endl; // BT taraması yapılıyor ve ardından tarama sonuçları 'bt_rssi' // dosyasına yazdırılıyor. system("sudo hciconfig hci0 reset"); FakeDelay(); system("sudo bt-adapter -a hci0 -d >> bt_rssi.txt"); FakeDelay(); cout << "Bluetooth message is publishing..." << endl; try { // BT tarama dosyası okunuyor fIn.open ("bt_rssi.txt", ios::in); stringstream ssBt; ssBt << fIn.rdbuf(); btFileContenHolder = ssBt.str(); system("rm bt_rssi.txt"); // Okunan dosya boost kütüphane yardımıyla ayrıştırılıyor boost::regex expAd( "Address: ([0-9A-F:]{17})" ) ; boost::regex expBt( "RSSI:.*?([0-9]+)") ; boost::match_results<string::const_iterator> whatAd; string::const_iterator startAd = btFileContenHolder.begin(); string::const_iterator finishAd = btFileContenHolder.end(); while (boost::regex_search(startAd, finishAd, whatAd, expAd)) { btMacHolder.push_back(whatAd[1]); startAd = whatAd[0].second ; } boost::match_results<string::const_iterator> whatBt; startAd = btFileContenHolder.begin() ; finishAd = btFileContenHolder.end() ; while (boost::regex_search(startAd, finishAd, whatBt, expBt)) { string foundRssi(whatBt[1]); btRssiHolder.push_back(atoi(foundRssi.c_str())); startAd = whatBt[0].second ; } cout << "Number of BT connection that has been found: " << btRssiHolder.size() << endl; cout << "MessageID: " << btSeqInstance->messageID << endl; // Tarama sonrası alınan zaman etiketi (timestamp[1]) gettimeofday(&tsConverter, NULL); tsAfterTheScan.sec = tsConverter.tv_sec; tsAfterTheScan.nanosec =( tsConverter.tv_usec * 1000); cout << " timestamp[1] (after the scan) = " << tsAfterTheScan.sec << '.'; cout << setfill('0') << setw(9) << (tsAfterTheScan.nanosec) << endl; // Ayrıştırılan BT tarama dosyası ve alınan zaman etiketleri, // Publish edilecek olan mesaj değişkenlerine kaydediliyor. btSeqInstance->timestamp[0][0] = tsBeforeTheScan.nanosec; btSeqInstance->timestamp[0][1] = tsBeforeTheScan.sec; btSeqInstance->timestamp[1][0] = tsAfterTheScan.nanosec; btSeqInstance->timestamp[1][1] = tsAfterTheScan.sec; btSeqInstance->messages.length(btMacHolder.size()); for(int i = 0; i < btMacHolder.size(); i++) { Msg msg; msg.devID = DDS::string_dup(btMacHolder[i].c_str()); msg.hostName = DDS::string_dup(hostName); msg.dbm = -btRssiHolder[i]; btSeqInstance->messages[i] = msg; } // Publish edilmeden önce, bir önceki mesajın acknowlegde mesajı // bekleniyor btSeqWriter->wait_for_acknowledgments(waitAckTime); status = btSeqWriter->write(*btSeqInstance, DDS::HANDLE_NIL); checkStatus(status, "BtSeqDataWriter::write"); messageIDCount++; } catch ( boost::bad_expression & ex ) { std::cout << ex.what() ; break; } btMacHolder.clear(); btRssiHolder.clear(); fIn.close(); cout << "-----------------------------------" << endl; // Tarama sıklığını belirleyen değişken sıfırlanıyor timelimit.setTimerToZero(); refreshRateCounter = 0; cout << refreshRateCounter << endl; } // BT Publisher kısmının sonu // Sunucu tarafından gönderilen Matlab komutlarına Subscribe olunuyor else { status = serverReqReader->take(serverReqSeq, infoSeq, LENGTH_UNLIMITED, ANY_SAMPLE_STATE, ANY_VIEW_STATE, ANY_INSTANCE_STATE); checkStatus(status, "severReqDataReader::read"); for (DDS::ULong j = 0; j < serverReqSeq.length(); j++) { if(infoSeq[j].valid_data) { cout << "=== [Subscriber] message received :" << endl; cout << " Received Request Message : " << serverReqSeq[j].request << endl; cout << " Received RequestID : \"" << serverReqSeq[j].requestID << "\"" << endl; // Rapidjson yapılandırıcısı yaratılıyor Document d; if(d.Parse(serverReqSeq[j].request).HasParseError()) cout << " Parsing Error!" << endl; StringBuffer nodeIdBuffer; Writer<StringBuffer> nodeIdWriter(nodeIdBuffer); d["NodeID"].Accept(nodeIdWriter); string tempNodeId = nodeIdBuffer.GetString(); // Subscribe olunan mesajın düğüme ait olup olmadığı kontrol ediliyor if (tempNodeId == "\"SensDug13\"") { StringBuffer buffer; Value::ConstMemberIterator itr = d.FindMember("SetRefreshRate"); // Ref Rate komutunun gelip gelmediği kontrol ediliyor if(itr != d.MemberEnd()) { string refreshRateString; int refreshRateInt; // Document formatındaki JSON mesajı StrinBuffer'a dönüştürülüyor Writer<StringBuffer> writer(buffer); d["SetRefreshRate"].Accept(writer); refreshRateString = buffer.GetString(); // Gelen mesajda fazladan çift tırnak ile bulunuyor // Örneğin, ""15"" // Bu yüzden ilk son karakterler kırpılıyor refreshRateString = refreshRateString.substr(1, refreshRateString.size()-1); // Refresh rate değeri stringden integera çevriliyor refreshRateInt = atoi(refreshRateString.c_str()); refreshRate = refreshRateInt; timelimit.setMaxDuration(std::chrono::milliseconds (refreshRate*1000)); } } else cout << "Invalid NodeID!" << endl; } } status = serverReqReader->return_loan(serverReqSeq, infoSeq); checkStatus(status, "ServerReqDataReader::return_loan"); refreshRateCounter++; cout << refreshRateCounter << endl; } // Matlab komutuna Subscribe olma kısmının sonu // Terminalde akacak olan çıktıları dah gözle görülebilir bir şekilde // yazdırmak için koyulmuştur FakeDelay(); } // Hafıza temizle işlemleri gerçekleştiriliyor mgrBtPub.deleteWriter(); mgrBtPub.deletePublisher(); mgrBtPub.deleteTopic(); mgrBtPub.deleteParticipant(); mgrReqSub.deleteReader(); mgrReqSub.deleteSubscriber(); mgrReqSub.deleteTopic(); mgrReqSub.deleteParticipant(); return 0; }
int main(int argc, char *argv[]) { os_time delay_500ms = { 0, 500000000 }; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant // create domain participant char partition_name[] = "WaitSet example"; mgr->createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr->registerType(mt.in()); //create Topic char topic_name[] = "WaitSetData_Msg"; mgr->createTopic(topic_name); //create Publisher mgr->createPublisher(); // create DataWriter mgr->createWriter(); // Publish Events DataWriter_ptr dwriter = mgr->getWriter(); MsgDataWriter_var WaitSetDataWriter = MsgDataWriter::_narrow(dwriter); Msg msgInstance; /* Example on Stack */ msgInstance.userID = 1; msgInstance.message = CORBA::string_dup("First Hello"); cout << "=== [Publisher] writing a message containing :" << endl; cout << " userID : " << msgInstance.userID << endl; cout << " Message : \"" << msgInstance.message << "\"" << endl; ReturnCode_t status = WaitSetDataWriter->write(msgInstance, DDS::HANDLE_NIL); checkStatus(status, "MsgDataWriter::write1"); os_nanoSleep(delay_500ms); // Write a second message msgInstance.message = CORBA::string_dup("Hello again"); status = WaitSetDataWriter->write(msgInstance, DDS::HANDLE_NIL); checkStatus(status, "MsgDataWriter::write2"); cout << endl << "=== [Publisher] writing a message containing :" << endl; cout << " userID : " << msgInstance.userID << endl; cout << " Message : \"" << msgInstance.message << "\"" << endl; os_nanoSleep(delay_500ms); // clean up status = WaitSetDataWriter->dispose(msgInstance, DDS::HANDLE_NIL); checkStatus(status, "MsgDataWriter::dispose"); status = WaitSetDataWriter->unregister_instance(msgInstance, DDS::HANDLE_NIL); checkStatus(status, "MsgDataWriter::unregister_instance"); /* Remove the DataWriters */ mgr->deleteWriter(WaitSetDataWriter.in ()); /* Remove the Publisher. */ mgr->deletePublisher(); /* Remove the Topics. */ mgr->deleteTopic(); /* Remove Participant. */ mgr->deleteParticipant(); delete mgr; return 0; }
int NodeWifiHandler (int argc, char *argv[]) { // DDS değişkenleri ReturnCode_t status; InstanceHandle_t userHandle; DDSEntityManager mgrReqSub; DDSEntityManager mgrReqPub; DDSEntityManager mgrWifiPub; WifiSeq *wifiSeqInstance = new WifiSeq();; ServerReqSeq serverReqSeq; ServerReq *serverReq = new ServerReq(); SampleInfoSeq_var infoSeq = new SampleInfoSeq(); // Zaman ile alakalı değişkenler DDS::Duration_t waitAckTime = { 0, 800000000 }; //800ms int refreshRate = 60; long int messageIDCount = 0; Time_t tsBeforeTheScan = { 0, 0 }; Time_t tsAfterTheScan = { 0, 0 }; struct timeval tsConverter; // Veri tutucular (data structures) vector<string> modemIdHolder; vector<int> dbmHolder; string wifiFileContenHolder; string ifconfigFileContentHolder; // Wifi tarama sonuçlarının yazdırıldığı dosyadan okuma yapacak // olan değişken boost::filesystem::ifstream fInWifiScan, fInIfconfig; // Matlab komutları ayrıştırılmasında kullanılacak olan değişkenler string ip, subnet, gateway, dns, nodeName; char hostName[1024]; gethostname(hostName, 1024); // Bluetooth tarama sıklığı ayarlayan değişken int refreshRateCounter = -1; // !!! Wifi tarama mesajlarını Publish edecek Topic yaratılıyor // ve o Topic'e ait konfigürasyon ayarları yapılıyor // Domain participant yaratılıyor mgrWifiPub.createParticipant("KonSensData_WifiSeq_Participant"); // WifiSeq tipi yaratılıyor WifiSeqTypeSupport_var wifiSeqTS = new WifiSeqTypeSupport(); mgrWifiPub.registerType(wifiSeqTS.in()); // Topic yaratılıyor char wifiPubTopicName[] = "KonSensData_WifiSeq_Topic"; mgrWifiPub.createTopic(wifiPubTopicName); // Publisher yaratılıyor mgrWifiPub.createPublisher(); // DataWriter yaratılıyor bool autodisposeUnregisteredInstances = false; mgrWifiPub.createWriter(autodisposeUnregisteredInstances, KEEP_ALL_HISTORY_QOS, BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS); // Yaratılan DataWriter, WifiSeq tipi için özelleştiriliyor DataWriter_var dWriterWifPub = mgrWifiPub.getWriter(); WifiSeqDataWriter_var wifiSeqWriter = WifiSeqDataWriter::_narrow(dWriterWifPub.in()); // Düğüm numarası atanıyor wifiSeqInstance->userID = 13; cout << "=== [Publisher of KonSensData_WifiSeq_Topic] Ready ..." << endl; // !!! Sunucudan gelen komutlara Subscribe olacak olan Topic yaratılıyor // ve o Topic için gerekli konfigürasyon ayarları yapılıyor // Domain participant yaratılıyor mgrReqSub.createParticipant( "KonSensData_ServerReq_Participant_Server_to_Node"); // ServerReq tipi yaratılıyor. ServerReqTypeSupport_var mgrSubscriberTS = new ServerReqTypeSupport(); mgrReqSub.registerType(mgrSubscriberTS.in()); // Topic yaratılıyor char reqSubTopicName[] = "KonSensData_ServerReq_Topic_Server_to_Node"; mgrReqSub.createTopic(reqSubTopicName, RELIABLE_RELIABILITY_QOS, VOLATILE_DURABILITY_QOS); // Subscriber yaratılıyor mgrReqSub.createSubscriber(); // DataReader yaratılıyor mgrReqSub.createReader(KEEP_LAST_HISTORY_QOS, 1); // Yaratılan DataReader, ServerReq tipi için özelleştiriliyor. DataReader_var dReadeSub = mgrReqSub.getReader(); ServerReqDataReader_var serverReqReader = ServerReqDataReader::_narrow(dReadeSub.in()); checkHandle(serverReqReader.in(), "ServerReqDataReader::_narrow"); cout << "=== [Subscriber of KonSensData_ServerReq_Topic_Server_to_Node]" " Ready ..." << endl; // !!! Sunucudan gelen komutlar ayrıştırılıp işlendikten sonra Response // mesajını Publish edecek olan Topic yaratılıyor // Domain participant yaratılıyor mgrReqPub.createParticipant( "KonSensData_ServerReq_Participant_Node_to_Server"); // ServerReq tipi yaratılıyor. ServerReqTypeSupport_var mgrPublisherTS = new ServerReqTypeSupport(); mgrReqPub.registerType(mgrPublisherTS.in()); // Topic yaratılıyor char reqPubTopicName[] = "KonSensData_ServerReq_Topic_Node_to_Server"; mgrReqPub.createTopic(reqPubTopicName, RELIABLE_RELIABILITY_QOS, VOLATILE_DURABILITY_QOS); // Publisher yaratılıyor mgrReqPub.createPublisher(); // DataWriter yaratılıyor // Not: Kullanılan autodisposeUnregisteredInstances değişkeni // WifiSeqDataWriter yaratılırken ki kullananla aynıdır mgrReqPub.createWriter(autodisposeUnregisteredInstances, KEEP_LAST_HISTORY_QOS, 1); // Yaratılan DataReader, ServerReq tipi için özelleştiriliyor. DataWriter_var dWriterPub = mgrReqPub.getWriter(); ServerReqDataWriter_var serverReqWriter = ServerReqDataWriter::_narrow(dWriterPub.in()); cout << "=== [Publisher of KonSensData_ServerReq_Topic_Node_to_Server] " "Ready ..." << endl; // Yenileme sıklığını belirleyecek olan 'timelimit' değişkeni yaratılıyor. Timeout timeLimit(std::chrono::milliseconds(refreshRate*1000)); while(true) { if (timeLimit.isExpired() || refreshRateCounter == -1) { // Wifi mesajını Publish etmek için hazırlık yapılıyor. cout << "-----------------------------------" << endl; wifiSeqInstance->messageID = messageIDCount; // Tarama öncesi alınan zaman etiketi (timestamp[0]) gettimeofday(&tsConverter, NULL); tsBeforeTheScan.sec = tsConverter.tv_sec; tsBeforeTheScan.nanosec = (tsConverter.tv_usec * 1000); cout << " timestamp[0] (before the scan) = " << tsBeforeTheScan.sec << '.'; cout << setfill('0') << setw(9) << (tsBeforeTheScan.nanosec) << endl; // Wifi taraması yapılıyor ve ardından tarama sonuçları 'wifi_rssi' // dosyasına yazdırılıyor. system("sudo iwlist wlan0 scanning >> wifi_rssi.txt"); // Wifi bağlantısı kapatılıyor system("sudo ifconfig wlan0 down"); // Wifi tarama dosyası okunuyor fInWifiScan.open("wifi_rssi.txt",ios::in); stringstream ssWifi; ssWifi << fInWifiScan.rdbuf(); wifiFileContenHolder = ssWifi.str(); system("rm wifi_rssi.txt"); try { // Okunan dosya boost kütüphane yardımıyla ayrıştırılıyor boost::regex exp( "Signal level=.*?([0-9]+)") ; boost::regex expAd( "Address: ([0-9A-F:]{17})" ) ; boost::match_results<string::const_iterator> whatAd; string::const_iterator startAd = wifiFileContenHolder.begin() ; string::const_iterator finishAd = wifiFileContenHolder.end() ; while (boost::regex_search(startAd, finishAd, whatAd, expAd)) { modemIdHolder.push_back(whatAd[1]); startAd = whatAd[0].second ; } boost::match_results<string::const_iterator> what; string::const_iterator start = wifiFileContenHolder.begin(); string::const_iterator finish = wifiFileContenHolder.end(); while (boost::regex_search(start, finish, what, exp)) { string foundDbm(what[1]); dbmHolder.push_back(atoi(foundDbm.c_str())); start = what[0].second ; } cout << " Number of Wifi Network that has been founded: " << dbmHolder.size() << endl; // Tarama sonrası alınan zaman etiketi (timestamp[1]) gettimeofday(&tsConverter, NULL); tsAfterTheScan.sec = tsConverter.tv_sec; tsAfterTheScan.nanosec = (tsConverter.tv_usec * 1000); cout << " timestamp[1] (after the scan) = " << tsAfterTheScan.sec << '.'; cout << setfill('0') << setw(9) << (tsAfterTheScan.nanosec) << endl; // Ayrıştırılan Wifi tarama dosyası ve alınan zaman etiketleri, // Publish edilecek olan mesaj değişkenlerine kaydediliyor wifiSeqInstance->timestamp[0][0] = tsBeforeTheScan.nanosec; wifiSeqInstance->timestamp[0][1] = tsBeforeTheScan.sec; wifiSeqInstance->timestamp[1][0] = tsAfterTheScan.nanosec; wifiSeqInstance->timestamp[1][1] = tsAfterTheScan.sec; wifiSeqInstance->messages.length(modemIdHolder.size()); cout << " MessageID: " << wifiSeqInstance->messageID << endl; for(int i = 0; i < modemIdHolder.size(); i++) { Msg msg; msg.devID = DDS::string_dup(modemIdHolder[i].c_str()); msg.hostName = DDS::string_dup(hostName); msg.dbm = -dbmHolder[i]; wifiSeqInstance->messages[i] = msg; } // Publish edilmeden önce, bir önceki mesajın acknowlegde mesajı // bekleniyor wifiSeqWriter->wait_for_acknowledgments(waitAckTime); status = wifiSeqWriter->write(*wifiSeqInstance,DDS::HANDLE_NIL); checkStatus(status, "konsensSensDugWifiSeqTopic::" "WifiSeqDataWriter::write_w_timestamp"); // Wifi bağlantısı tekrar açılıyor system("sudo ifconfig wlan0 up"); messageIDCount++; } catch ( boost::bad_expression & ex ) { cout << ex.what() ; } modemIdHolder.clear(); dbmHolder.clear(); wifiFileContenHolder.clear(); fInWifiScan.close(); cout << "-----------------------------------" << endl; timeLimit.setTimerToZero(); // Tarama sıklığını belirleyen değişken sıfırlanıyor refreshRateCounter = 0; cout << refreshRateCounter << endl; } // Wifi Publisher kısmının sonu // Sunucu tarafından gönderilen Matlab komutlarına Subscribe olunuyor else { status = serverReqReader->take(serverReqSeq, infoSeq, LENGTH_UNLIMITED, ANY_SAMPLE_STATE, ANY_VIEW_STATE, ANY_INSTANCE_STATE); checkStatus(status, "severReqDataReader::take"); // isDataReceived değişkeni bir kontrol değişkeni olup, Matlab komut // bilgisini içeren mesaja Subscribe olunduysa true, olunmadıysa false // değerini tutar bool isDataReceived = false; for (DDS::ULong j = 0; j < serverReqSeq.length(); j++) { if(infoSeq[j].valid_data) { cout << "=== [Subscriber] message received :" << endl; cout << " Received Request Message : " << serverReqSeq[j].request << endl; cout << " Received RequestID : \"" << serverReqSeq[j].requestID << "\"" << endl; // Rapidjson yapılandırıcısı yaratılıyor Document d; if(d.Parse(serverReqSeq[j].request).HasParseError()) cout << " Parsing Error!" << endl; StringBuffer nodeIdBuffer; Writer<StringBuffer> nodeIdWriter(nodeIdBuffer); d["NodeID"].Accept(nodeIdWriter); string tempNodeId = nodeIdBuffer.GetString(); // Subscribe olunan mesajın düğüme ait olup olmadığı kontrol ediliyor if (tempNodeId == "\"SensDug13\"") { StringBuffer buffer; // Reset komutunun gelip gelmediği kontrol ediliyor. Value::ConstMemberIterator itr = d.FindMember("Reset"); if(itr != d.MemberEnd()) { // Resetin değeri falsedan trueya çevriliyor Value& s = d["Reset"]; s.SetBool(true); // Document formatındaki JSON mesajı StrinBuffer'a dönüştürülüyor Writer<StringBuffer> writer(buffer); d.Accept(writer); cout << " Request Message is modified to : " << buffer.GetString() << endl; // Publish edilecek Response mesajı hazırlanıyor string str = buffer.GetString(); str.append("\n"); serverReq->request = DDS::string_dup(str.c_str()); serverReq->requestID = serverReqSeq[j].requestID; if(!isDataReceived && status == DDS::RETCODE_OK) { // Response mesajı gönderiliyor ReturnCode_t tempStatus = serverReqWriter->write( *serverReq, DDS::HANDLE_NIL); checkStatus(tempStatus, "severReqDataReader::write"); isDataReceived = true; cout << " Response Request Message is sent : " << serverReq->request << endl; cout << " Response RequestID is sent : \"" << serverReq->requestID << "\"" << endl; } // Sistem yeniden başlatılıyor !!! cout << "reboot" << endl; system("sudo reboot"); } // GetRefreshRate ve SetRefreshRate komutundan herhangi birinin // gelip gelmediği kontrol ediliyor itr = d.FindMember("SetRefreshRate"); if(itr != d.MemberEnd()) { string refreshRateString; int refreshRateInt; // Status değeri falsedan trueya çevriliyor Value& s = d["Status"]; s.SetBool(true); // Document formatındaki JSON mesajı StrinBuffer'a dönüştürülüyor Writer<StringBuffer> writer(buffer); d["SetRefreshRate"].Accept(writer); refreshRateString = buffer.GetString(); // Gelen mesajda fazladan çift tırnak ile bulunuyor // Örneğin, ""15"" // Bu yüzden ilk son karakterler kırpılıyor refreshRateString = refreshRateString.substr(1, refreshRateString.size()-1); // Refresh rate değeri stringden integera çevriliyor refreshRateInt = atoi(refreshRateString.c_str()); // Refresh rate değişkeni güncelleniyor refreshRate = refreshRateInt; timeLimit.setMaxDuration(std::chrono::milliseconds (refreshRate*1000)); } itr = d.FindMember("GetRefreshRate"); if(itr != d.MemberEnd()) { // Status değeri falsedan trueya çevriliyor Value& s = d["Status"]; s.SetBool(true); Value& tempRefreshRate = d["GetRefreshRate"]; // Güncel refresh rate değişken bilgisi alınıyor string str = to_string(refreshRate); tempRefreshRate.SetString(str.c_str(), str.length()); } // GetAliveStatus komutunun gönderilip gönderilmediği kontrol // ediliyor. itr = d.FindMember("Alive"); if(itr != d.MemberEnd()) { // Alive değeri truedan false çevriliyor Value& s = d["Alive"]; s.SetBool(true); // Document formatındaki JSON mesajı StrinBuffer'a dönüştürülüyor Writer<StringBuffer> writer(buffer); d.Accept(writer); } // GetNetStatus komutunun gelip gelmediği kontrol ediliyor itr = d.FindMember("IP"); if(itr != d.MemberEnd()) { cout << "-----------------------------------" << endl; // Ağ durum bilgisi ifconfig.txt dosyasına yazdırılıyor system("cat /etc/network/interfaces >> ifconfig.txt"); system("cat /etc/resolv.conf >> ifconfig.txt"); system("echo -n hostname >> ifconfig.txt && hostname " ">> ifconfig.txt"); // ifconfig.txt dosyası açılıyor fInIfconfig.open("ifconfig.txt",ios::in); stringstream ssIfconfig; ssIfconfig << fInIfconfig.rdbuf(); ifconfigFileContentHolder = ssIfconfig.str(); system("rm ifconfig.txt"); // Dosya içeriği ayrıştırılıyor try { boost::regex expIp ("address (\\d{1,3}(\\.\\d{1,3}){3})"); boost::regex expSubnet ("netmask (\\d{1,3}(\\.\\d{1,3}){3})"); boost::regex expGateway ("gateway (\\d{1,3}(\\.\\d{1,3}){3})"); boost::regex expDns ("nameserver (\\d{1,3}(\\.\\d{1,3}){3})"); boost::regex expNoneName ("hostname.*"); string::const_iterator startAd = ifconfigFileContentHolder.begin() ; string::const_iterator finishAd = ifconfigFileContentHolder.end() ; boost::match_results<string::const_iterator> whatIp; if ( boost::regex_search(startAd, finishAd, whatIp, expIp) ) { ip = whatIp[0]; cout << ip << endl; string chopped_str = "address "; string::size_type i = ip.find(chopped_str); if (i != string::npos) ip.erase(i, chopped_str.length()); Value& tempIp = d["IP"]; tempIp.SetString(ip.c_str(), ip.length()); } startAd = ifconfigFileContentHolder.begin() ; finishAd = ifconfigFileContentHolder.end() ; boost::match_results<string::const_iterator> whatSubnet; if ( boost::regex_search(startAd, finishAd, whatSubnet, expSubnet) ) { subnet = whatSubnet[0]; cout << subnet << endl; string chopped_str = "netmask "; string::size_type i = subnet.find(chopped_str); if (i != string::npos) subnet.erase(i, chopped_str.length()); Value& tempSubnet = d["Subnet"]; tempSubnet.SetString(subnet.c_str(), subnet.length()); } startAd = ifconfigFileContentHolder.begin() ; finishAd = ifconfigFileContentHolder.end() ; boost::match_results<string::const_iterator> whatGateway; if ( boost::regex_search(startAd, finishAd, whatGateway, expGateway) ) { gateway = whatGateway[0]; cout << gateway << endl; string chopped_str = "gateway "; string::size_type i = gateway.find(chopped_str); if (i != string::npos) gateway.erase(i, chopped_str.length()); Value& tempGateway = d["Gateway"]; tempGateway.SetString(gateway.c_str(), gateway.length()); } startAd = ifconfigFileContentHolder.begin() ; finishAd = ifconfigFileContentHolder.end() ; boost::match_results<string::const_iterator> whatDns; if ( boost::regex_search(startAd, finishAd, whatDns, expDns) ) { dns = whatDns[0]; cout << dns << endl; string chopped_str = "nameserver "; string::size_type i = dns.find(chopped_str); if (i != string::npos) dns.erase(i, chopped_str.length()); Value& tempDns = d["DNS"]; tempDns.SetString(dns.c_str(), dns.length()); } startAd = ifconfigFileContentHolder.begin() ; finishAd = ifconfigFileContentHolder.end() ; boost::match_results<string::const_iterator> whatNodeName; if ( boost::regex_search(startAd, finishAd, whatNodeName, expNoneName) ) { nodeName = whatNodeName[0]; cout << nodeName << endl; string chopped_str = "hostname"; string::size_type i = nodeName.find(chopped_str); if (i != string::npos) nodeName.erase(i, chopped_str.length()); nodeName.erase(remove(nodeName.begin(), nodeName.end(), '\n'), nodeName.end()); Value& tempNodeName = d["Name"]; tempNodeName.SetString(nodeName.c_str(), nodeName.length()); } cout << ip << endl; cout << subnet << endl; cout << dns << endl; cout << nodeName << endl; } // Dosya ayrıştırma işlemi bitti catch ( boost::bad_expression & ex ) { cout << ex.what() ; } ifconfigFileContentHolder.clear(); fInIfconfig.close(); cout << "-----------------------------------" << endl; // GetNetStatus komutuna ait status değeri falsedan trueya // çevriliyor. Value& s = d["Status"]; s.SetBool(true); } // Matlab'dan gelen mesaj içeriğinin ayrıştırılıp düzenlenme işlemi // tamamlandı ve sunucuya Response mesajını Publish etmek için // aşağıdaki adımlar gerçekleştiriliyor // Document formatındaki JSON mesajı StrinBuffer'a dönüştürülüyor StringBuffer responseBuffer; Writer<StringBuffer> writer(responseBuffer); d.Accept(writer); cout << " Request Message is modified to : " << responseBuffer.GetString() << endl; // Response mesajı hazırlanıyor string str = responseBuffer.GetString(); str.append("\n"); serverReq->request = DDS::string_dup(str.c_str()); //serverReq->request = DDS::string_dup("Hello World\n"); serverReq->requestID = serverReqSeq[j].requestID; if(!isDataReceived && status == DDS::RETCODE_OK) { // Response mesajı Publish ediliyor ReturnCode_t tempStatus = serverReqWriter->write( *serverReq, DDS::HANDLE_NIL); checkStatus(tempStatus, "severReqDataReader::write"); isDataReceived = true; cout << " Response Request Message is sent : " << serverReq->request << endl; cout << " Response RequestID is sent : \"" << serverReq->requestID << "\"" << endl; } } else cout << "Invalid NodeID!" << endl; } } status = serverReqReader->return_loan(serverReqSeq, infoSeq); checkStatus(status, "MsgDataReader::return_loan"); refreshRateCounter++; cout << refreshRateCounter << endl; } // Matlab komutuna Subscribe olma kısmının sonu // Terminalde akacak olan çıktıları dah gözle görülebilir bir şekilde // yazdırmak için koyulmuştur fake_delay(); } // Hafıza temizle işlemleri gerçekleştiriliyor status = wifiSeqWriter->dispose(*wifiSeqInstance, userHandle); checkStatus(status, "WifiSeqDataWriter::dispose"); status = wifiSeqWriter->unregister_instance(*wifiSeqInstance, userHandle); checkStatus(status, "WifiSeqDataWriter::unregister_instance"); delete wifiSeqInstance; delete serverReq; mgrWifiPub.deleteWriter(); mgrWifiPub.deletePublisher(); mgrWifiPub.deleteTopic(); mgrWifiPub.deleteParticipant(); mgrReqSub.deleteReader(); mgrReqSub.deleteSubscriber(); mgrReqSub.deleteTopic(); mgrReqSub.deleteParticipant(); mgrReqPub.deletePublisher(); mgrReqPub.deleteWriter(); mgrReqPub.deleteTopic(); mgrReqPub.deleteParticipant(); return 0; }
int main(int argc, char *argv[]) { os_time delay_100ms = { 0, 100000000 }; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant char partition_name[] = "QueryCondition example"; mgr->createParticipant(partition_name); StockTypeSupport_var st = new StockTypeSupport(); mgr->registerType(st.in()); //create Topic char topic_name[] = "StockTrackerExclusive"; mgr->createTopic(topic_name); //create Publisher mgr->createPublisher(); // create DataWriter mgr->createWriter(); DataWriter_ptr dWriter = mgr->getWriter(); StockDataWriter_var QueryConditionDataWriter = StockDataWriter::_narrow(dWriter); Stock *geQuote = new Stock(); Stock *msftQuote = new Stock(); geQuote->ticker = CORBA::string_dup("GE"); geQuote->price = 12.00f; msftQuote->ticker = CORBA::string_dup("MSFT"); msftQuote->price = 25.00f; InstanceHandle_t geHandle = QueryConditionDataWriter->register_instance(*geQuote); InstanceHandle_t msftHandle = QueryConditionDataWriter->register_instance(*msftQuote); // Publish Events ReturnCode_t status; // update QueryConditionData price every second for (int x = 0; x < 20; x++) { geQuote->price = geQuote->price + 0.5; msftQuote->price = msftQuote->price + 1.5; status = QueryConditionDataWriter->write(*geQuote, geHandle); checkStatus(status, "StockDataWriter::write"); status = QueryConditionDataWriter->write(*msftQuote, msftHandle); checkStatus(status, "StockDataWriter::write"); os_nanoSleep(delay_100ms); printf("GE : %.1f MSFT : %.1f\n", geQuote->price, msftQuote->price); } // signal to terminate geQuote->price = - 1; msftQuote->price = - 1; QueryConditionDataWriter->write(*geQuote, geHandle); QueryConditionDataWriter->write(*msftQuote, msftHandle); cout << "Market Closed" << endl; // clean up status = QueryConditionDataWriter->dispose(*geQuote, geHandle); checkStatus(status, "dispose"); status = QueryConditionDataWriter->dispose(*msftQuote, msftHandle); checkStatus(status, "dispose"); status = QueryConditionDataWriter->unregister_instance(*geQuote, geHandle); checkStatus(status, "unregister_instance"); status = QueryConditionDataWriter->unregister_instance(*msftQuote, msftHandle); checkStatus(status, "unregister_instance"); /* Release the data-samples. */ delete geQuote; delete msftQuote; /* Remove the DataWriters */ mgr->deleteWriter(QueryConditionDataWriter.in ()); /* Remove the Publisher. */ mgr->deletePublisher(); /* Remove the Topics. */ mgr->deleteTopic(); /* Remove Participant. */ mgr->deleteParticipant(); delete mgr; return 0; }