2017-06-19 166 views
0

所以基本上,我用RandomwayPoint模型NS3和我喜歡這個節點的結果:如何跟蹤ns3中的節點移動時間?

/NodeList/5/$ns3::MobilityModel/CourseChange x = 10, y = 20 
/NodeList/6/$ns3::MobilityModel/CourseChange x = 30, y = 40 
/NodeList/7/$ns3::MobilityModel/CourseChange x = 50, y = 80 
/NodeList/5/$ns3::MobilityModel/CourseChange x = 10, y = 20 
/NodeList/6/$ns3::MobilityModel/CourseChange x = 30, y = 40 
/NodeList/7/$ns3::MobilityModel/CourseChange x = 50, y = 80 
/NodeList/5/$ns3::MobilityModel/CourseChange x = 10, y = 20 
/NodeList/6/$ns3::MobilityModel/CourseChange x = 30, y = 40 
/NodeList/7/$ns3::MobilityModel/CourseChange x = 50, y = 80 
At time 2s client sent 1024 bytes to 10.1.2.4 port 9 
At time 2.01596s server received 1024 bytes from 10.1.3.3 port 49153 
At time 2.01596s server sent 1024 bytes to 10.1.3.3 port 49153 
At time 2.02464s client received 1024 bytes from 10.1.2.4 port 9 
...... 

但如何記錄每個節點的運動的時間呢? 我覺得最相關的代碼是如何使用Simulator:: Now().GetSeconds() 這裏是我寫的代碼:

 std::ostringstream oss2(std::ostringstream::ate); 
    oss2.str("TimeStamp:"); 
    oss2 << Simulator::Now().GetSeconds(); 
    std::cout << oss2.str() << "\t"; 

但我得到的結果等於爲0。我對此感到困惑,如果有人能爲我提供更好的解決方案並幫助我弄清楚這一點,我將不勝感激。

ManyThanks。

回答

0

邏輯正確,Simulator::Now()提供時間。你可以打印一行,不需要四個!

std::cout << "TimeStamp:" << Simulator::Now().GetSeconds() << "\t"; 

事實上,你得到t = 0秒,可能是由於節點在此之後不「改變」的事實。 CourseChange回調僅在速度或速度(方向)發生變化時觸發。如果節點以恆定速度移動,則不會觸發。

繼您在之前的post中發表評論後,您曾說過使用過ListPositionAllocator。如果列表中只有一個條目,那麼它將不會從t = 0時的初始值(在輸出中看到的內容)改變。

+0

Thanks @ Konstantinos!這是真的,你知道我得到輸出後,我發現 輸出行像'客戶端發送數據包到xxx.xxx.xxx.xxx'節點的位置**不**完全改變(你可以觀察上面的代碼)只有在輸出行後,節點的位置開始改變。 但是在ListPositionAllocator中,我設置了3個條目(我理解你在這裏提到的條目是節點) 我想在這裏實現的是獲得每個節點位置變化後的時間,你有一些想法想辦法? –

+0

突然我有一個想法: 我可以改變RWP模型中的代碼,並且有一行'Time pause = Seconds(m_pause-> GetValue());'我打算在打印出來之後添加打印輸出行暫停時間並設置計時器記錄整個過程。因爲在每次暫停之後,方向將被改變,這意味着節點的位置將被改變。我對嗎? –

+0

不需要這樣做,因爲如果有變化,追蹤源將會觸發,您可以捕獲它。目前默認暫停時間爲2秒,速度在[0.3,0.7] m/s之間隨機選擇。可能需要幾秒鐘才能到達列表中的每個要點。例如要覆蓋100米的距離,您需要〜200秒。然後它會轉到下一個航點,那將激發追蹤源! – Konstantinos