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 OSPL_MAIN (int argc, char *argv[]) { os_time delay_20ms = { 0, 20000000 }; os_time delay_200ms = { 0, 200000000 }; MsgSeq msgList; SampleInfoSeq infoSeq; // create domain participant char partition_name[] = "Lifecycle example"; //------------------ Msg topic --------------------// DDSEntityManager mgr; // 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 Subscriber mgr.createSubscriber(); // create DataReader mgr.createReader(); DataReader_var dreader = mgr.getReader(); MsgDataReader_var LifecycleReader = MsgDataReader::_narrow(dreader.in()); checkHandle(LifecycleReader.in(), "MsgDataReader::_narrow"); cout << "=== [Subscriber] Ready ..." << endl; bool closed = false; ReturnCode_t status; int nbIter = 1; int nbIterMax = 100; while ((closed == false) && (nbIter < nbIterMax)) { status = LifecycleReader->read(msgList, infoSeq, LENGTH_UNLIMITED, ANY_SAMPLE_STATE, ANY_VIEW_STATE, ANY_INSTANCE_STATE); checkStatus(status, "msgDataReader::read"); for (DDS::ULong j = 0; j < msgList.length(); j++) { cout << endl << " Message : " << msgList[j].message.in() << endl; cout << " writerStates : " << msgList[j].writerStates.in() << endl; cout << " valid_data : " << (int)infoSeq[j].valid_data << endl; cout << "sample_state:" << sSampleState[index(infoSeq[j].sample_state)] << "-view_state:" << sViewState[index(infoSeq[j].view_state)] << "-instance_state:" << sInstanceState[index(infoSeq[j].instance_state)] << endl; os_nanoSleep(delay_200ms); closed = (strcmp(msgList[j].writerStates.in(), "STOPPING_SUBSCRIBER") == 0); } status = LifecycleReader->return_loan(msgList, infoSeq); checkStatus(status, "MsgDataReader::return_loan"); os_nanoSleep(delay_20ms); nbIter++; } cout << "=== [Subscriber] stopping after "<< nbIter << " iterations - closed=" << closed << endl; if (nbIter == nbIterMax) cout << "*** Error : max " << nbIterMax << "iterations reached" << endl; //cleanup // Lifecycle topic mgr.deleteReader(LifecycleReader.in ()); mgr.deleteSubscriber(); mgr.deleteTopic(); mgr.deleteParticipant(); return 0; }
int main(int argc, char *argv[]) { // usage : ContentFilteredTopicDataSubscriber <subscription_string> const char *ContentFilteredTopicDataToSubscribe; os_time delay_200ms = { 0, 200000000 }; if (argc > 1) { ContentFilteredTopicDataToSubscribe = argv[1]; } else { cerr << "*** [ContentFilteredTopicDataSubscriber] Subscription string not specified" << endl; cerr << "*** usage : ContentFilteredTopicDataSubscriber <subscription_string>" << endl; return - 1; } StockSeq msgList; SampleInfoSeq infoSeq; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant char partition_name[] = "ContentFilteredTopic example"; mgr->createParticipant(partition_name); //create type StockTypeSupport_var st = new StockTypeSupport(); mgr->registerType(st.in()); //create Topic char topic_name[] = "StockTrackerExclusive"; mgr->createTopic(topic_name); //create Subscriber mgr->createSubscriber(); char sTopicName[] = "MyStockTopic"; // create subscription filter ostringstream buf; buf << "ticker = '" << ContentFilteredTopicDataToSubscribe << "'"; CORBA::String_var sFilter = CORBA::string_dup(buf.str().c_str()); // Filter expr StringSeq sSeqExpr; sSeqExpr.length(0); // create topic mgr->createContentFilteredTopic(sTopicName, sFilter.in(), sSeqExpr); // create Filtered DataReader cout << "=== [ContentFilteredTopicDataSubscriber] Subscription filter : " << sFilter << endl; mgr->createReader(true); DataReader_ptr dreader = mgr->getReader(); StockDataReader_var ContentFilteredTopicDataReader = StockDataReader::_narrow(dreader); checkHandle(ContentFilteredTopicDataReader, "StockDataReader::_narrow"); cout << "=== [ContentFilteredTopicDataSubscriber] Ready ..." << endl; bool closed = false; ReturnCode_t status = - 1; int count = 0; while (!closed && count < 1500) // We dont want the example to run indefinitely { status = ContentFilteredTopicDataReader->take(msgList, infoSeq, LENGTH_UNLIMITED, ANY_SAMPLE_STATE, ANY_VIEW_STATE, ANY_INSTANCE_STATE); checkStatus(status, "ContentFilteredTopicDataDataReader::take"); for (CORBA::ULong i = 0; i < msgList.length(); i++) { if(infoSeq[i].valid_data) { if (msgList[i].price == - 1.0f) { closed = true; break; } } cout << "=== [ContentFilteredTopicDataSubscriber] receives stockQuote : ("<< msgList[i].ticker << ", " << msgList[i].price << ')'<< endl; } status = ContentFilteredTopicDataReader->return_loan(msgList, infoSeq); checkStatus(status, "StockDataReader::return_loan"); os_nanoSleep(delay_200ms); ++count; } cout << "=== [ContentFilteredTopicDataSubscriber] Market Closed" << endl; //cleanup mgr->deleteReader(ContentFilteredTopicDataReader.in ()); mgr->deleteSubscriber(); mgr->deleteFilteredTopic(); mgr->deleteTopic(); mgr->deleteParticipant(); delete mgr; return 0; }
int OSPL_MAIN (int argc, char *argv[]) { MsgSeq msgList; SampleInfoSeq infoSeq; Duration_t timeout = { 0, 200000000 }; int count = 0; DDSEntityManager mgr; // create domain participant char partition_name[] = "Listener example"; mgr.createParticipant(partition_name); //create type MsgTypeSupport_var st = new MsgTypeSupport(); mgr.registerType(st.in()); //create Topic char topic_name[] = "ListenerData_Msg"; mgr.createTopic(topic_name); //create Subscriber mgr.createSubscriber(); // create DataReader mgr.createReader(); DataReader_var dreader = mgr.getReader(); ListenerDataListener *myListener = new ListenerDataListener(); myListener->m_MsgReader = MsgDataReader::_narrow(dreader.in()); checkHandle(myListener->m_MsgReader.in(), "MsgDataReader::_narrow"); cout << "=== [ListenerDataSubscriber] set_listener" << endl; DDS::StatusMask mask = DDS::DATA_AVAILABLE_STATUS | DDS::REQUESTED_DEADLINE_MISSED_STATUS; myListener->m_MsgReader->set_listener(myListener, mask); cout << "=== [ListenerDataSubscriber] Ready ..." << endl; myListener->m_closed = false; // waitset used to avoid spinning in the loop below DDS::WaitSet_var ws = new DDS::WaitSet(); ws->attach_condition(myListener->m_guardCond); DDS::ConditionSeq condSeq; while (!myListener->m_closed && count < 1500 ){ // To avoid spinning here. We can either use a sleep or better a WaitSet. ws->wait(condSeq, timeout); myListener->m_guardCond->set_trigger_value(false); ++count; } cout << "===[ListenerDataSubscriber] Market Closed" << endl; //cleanup mgr.deleteReader(myListener->m_MsgReader.in ()); mgr.deleteSubscriber(); mgr.deleteTopic(); mgr.deleteParticipant(); delete myListener; cout << "Completed Listener example." << endl; return 0; }
int main(int argc, char *argv[]) { os_time delay_2ms = { 0, 2000000 }; os_time delay_200ms = { 0, 200000000 }; StockSeq msgList; SampleInfoSeq infoSeq; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant char partition_name[] = "Ownership example"; mgr->createParticipant(partition_name); //create type StockTypeSupport_var st = new StockTypeSupport(); mgr->registerType(st.in()); //create Topic char topic_name[] = "StockTrackerExclusive"; mgr->createTopic(topic_name); //create Subscriber mgr->createSubscriber(); // create DataReader mgr->createReader(); DataReader_ptr dreader = mgr->getReader(); StockDataReader_var OwnershipDataReader = StockDataReader::_narrow(dreader); checkHandle(OwnershipDataReader, "StockDataReader::_narrow"); cout << "===[Subscriber] Ready ..." << endl; cout << " Ticker Price Publisher ownership strength" << endl; bool closed = false; ReturnCode_t status = - 1; int count = 0; while (!closed && count < 1500 ) { status = OwnershipDataReader->take(msgList, infoSeq, LENGTH_UNLIMITED, ANY_SAMPLE_STATE, ANY_VIEW_STATE, ANY_INSTANCE_STATE); checkStatus(status, "OwnershipDataDataReader::take"); if (msgList.length() > 0) { for (CORBA::ULong i = 0; i < msgList.length(); i++) { if (infoSeq[i].valid_data) { if (msgList[i].price < - 0.0f) { closed = true; break; } printf(" %s %8.1f %s %d\n", msgList[i].ticker.in(), msgList[i].price, msgList[i].publisher.in(), msgList[i].strength); } } status = OwnershipDataReader->return_loan(msgList, infoSeq); checkStatus(status, "StockDataReader::return_loan"); os_nanoSleep(delay_2ms); } ++count; os_nanoSleep(delay_200ms); } cout << "===[Subscriber] Market Closed" << endl; //cleanup mgr->deleteReader(OwnershipDataReader.in ()); mgr->deleteSubscriber(); mgr->deleteTopic(); 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[]) { // usage : QueryConditionDataQuerySubscriber <query_string> const char *QueryConditionDataToSubscribe; if (argc > 1) { QueryConditionDataToSubscribe = argv[1]; } else { cerr << "*** [QueryConditionDataQuerySubscriber] Query string not specified" << endl; cerr << "*** usage : QueryConditionDataQuerySubscriber <query_string>" << endl; return - 1; } StockSeq msgList; SampleInfoSeq infoSeq; os_time delay_200ms = { 0, 200000000 }; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant char partition_name[] = "QueryCondition example"; mgr->createParticipant(partition_name); //create type StockTypeSupport_var st = new StockTypeSupport(); mgr->registerType(st.in()); //create Topic char topic_name[] = "StockTrackerExclusive"; mgr->createTopic(topic_name); //create Subscriber mgr->createSubscriber(); mgr->createReader(false); DataReader_ptr dreader = mgr->getReader(); StockDataReader_var QueryConditionDataReader = StockDataReader::_narrow(dreader); checkHandle(QueryConditionDataReader, "StockDataReader::_narrow"); // create a query string StringSeq queryStr; queryStr.length(1); queryStr[0] = QueryConditionDataToSubscribe; // Create QueryCondition cout << "=== [QueryConditionDataQuerySubscriber] Query : ticker = " << QueryConditionDataToSubscribe << endl; QueryCondition_var queryCondition = QueryConditionDataReader->create_querycondition(ANY_SAMPLE_STATE, ANY_VIEW_STATE, ANY_INSTANCE_STATE, "ticker=%0", queryStr); checkHandle(queryCondition.in(), "create_querycondition"); cout << "=== [QueryConditionDataQuerySubscriber] Ready ..." << endl; bool closed = false; ReturnCode_t status = - 1; int count = 0; while (!closed && count < 1500 ) { status = QueryConditionDataReader->take_w_condition(msgList, infoSeq, LENGTH_UNLIMITED, queryCondition); checkStatus(status, "QueryConditionDataDataReader::take"); for (CORBA::ULong i = 0; i < msgList.length(); i++) { if (msgList[i].price == - 1.0f) { closed = true; break; } cout << msgList[i].ticker << ": " << msgList[i].price << endl; } status = QueryConditionDataReader->return_loan(msgList, infoSeq); checkStatus(status, "StockDataReader::return_loan"); os_nanoSleep(delay_200ms); ++count; } cout << "=== [QueryConditionDataQuerySubscriber] Market Closed" << endl; // cleanup // Delete the QueryCondition QueryConditionDataReader->delete_readcondition(queryCondition.in()); mgr->deleteReader(QueryConditionDataReader.in ()); mgr->deleteSubscriber(); mgr->deleteTopic(); mgr->deleteParticipant(); delete mgr; return 0; }