首先让我简要介绍一下:
我有一个场景,其中RSU将广播关于每个T RSU 秒的固定消息“ RSUmessage ”。我已经实现了以下用于RSU广播的代码(另外,这些固定消息的Psid = -100以区别于其他消息):
void TraCIDemoRSU11p::handleSelfMsg(cMessage* msg) {
if (WaveShortMessage* wsm = dynamic_cast<WaveShortMessage*>(msg)) {
if(wsm->getPsid()==-100){
sendDown(RSUmessage->dup());
scheduleAt(simTime() + trsu +uniform(0.02, 0.05), RSUmessage);
}
}
else {
BaseWaveApplLayer::handleSelfMsg(wsm);
}
}
汽车可以从其他汽车以及RSU接收这些消息。 RSU丢弃从汽车收到的消息。汽车将收到多个此类消息,进行一些比较并定期广播类似类型的消息:“ aggregatedMessage ”每个时间间隔T car 。 aggregatedMessage也有Psid = -100,因此可以轻松地将消息与其他消息区分开来。
我正在使用自我消息安排汽车事件。 (虽然它可以在handlePositionUpdate中完成,我相信)。汽车的handleSelfMsg如下:
void TraCIDemo11p::handleSelfMsg(cMessage* msg) {
if (WaveShortMessage* wsm = dynamic_cast<WaveShortMessage*>(msg)) {
wsm->setSerial(wsm->getSerial() +1);
if (wsm->getPsid() == -100) {
sendDown(aggregatedMessage->dup());
//sendDelayedDown(aggregatedMessage->dup(), simTime()+uniform(0.1,0.5));
scheduleAt(simTime()+tcar+uniform(0.01, 0.05), aggregatedMessage);
}
//send this message on the service channel until the counter is 3 or higher.
//this code only runs when channel switching is enabled
else if (wsm->getSerial() >= 3) {
//stop service advertisements
stopService();
delete(wsm);
}
else {
scheduleAt(simTime()+1, wsm);
}
}
else {
BaseWaveApplLayer::handleSelfMsg(msg);
}
}
问题:使用此设置,模拟速度非常慢。在OMNET GUI的Express模式下,我可以在5-6小时或更长时间内获得大约50个模拟秒。 (RSU数量:64,车辆数量:40,约1kmx1km地图)
另外,我指的是this帖子。 OP表示,在每个RSU收到消息后,通过删除消息发送,他获得了更快的速度。在我的情况下,我无法删除它,因为我需要在每个间隔后发送广播消息。
问题:我认为这种缓慢是因为每个节点都试图在每个模拟秒的开头发送消息。是否所有车辆和节点在OMNET减速的同时调度和发送消息? (有意义的是减慢速度,但程度如何)但是,模拟中总共只有大约100个节点。当然不能这么慢。
我尝试了什么:我尝试使用sendDelayedDown(wsm->dup(), simTime()+uniform(0.1,0.5));
在每个模拟秒的一半 st 中传播消息的发送。这似乎阻止了在每个模拟秒开始时堆积起来的消息,并加快了速度,但总体上并没有那么多。
如果这是正常行为或我是否做错了,请有人告诉我。
我也为长篇大论道歉。如果不给出背景,我无法解释我的问题。
答案 0 :(得分:3)
您的网络似乎充斥着消息:来自RSU的每条消息都会被收到此消息的每辆车重复并再次传输。因此,计算时间与网络中节点(消息发送方)的数量呈二次方增加(每个发送的消息必须由接收范围的每个节点处理)。每个消息的3个传输的限制似乎没有多大帮助,并且如代码中的注释所示,如果没有信道切换,则根本不使用。
因此,如果您无法改进/更改代码以简单地发送更少的消息,那么您必须忍受这一点。您以延迟方式发送消息的小调整只会在一秒钟内分发消息,但不能解决洪水问题。
但是,您仍然可以遵循一些提示来提高模拟效果:
make MODE=Release
中运行您的模拟:Cmdenv
答案 1 :(得分:0)
从 omnetpp.ini 文件中删除 simtime-resolution
参数可以解决问题。
当通道延迟与模拟时间分辨率不匹配时,模拟内核似乎有问题。
您可以通过克隆以下存储库来验证解决方案。请注意,您需要 OMNeT++ 框架的功能安装。具体来说,我在 OMNeT++ 5.6.2 中测试了这个修复。