2017-06-19 79 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