Veins 4.4路由协议评估:无大量改码获取成功接收概率的方法问询
针对Veins 4.4获取成功接收概率的最小代码改动方案
首先,针对你的需求,我推荐两种改动极小的方案,完全不需要大规模修改Veins核心路由或MAC协议代码:
方案1:利用Omnet++信号监听(零核心代码修改)
Veins基于Omnet++构建,所有核心模块(Phy、Mac、App层)都会发射标准化的统计信号。你可以在自己的应用层模块中订阅这些信号,轻松统计发送/接收成功的帧数:
- 在你的App类头文件中,添加两个成员变量:
long totalSent;和long totalReceivedOk;,并在构造函数中初始化为0。 - 在
initialize()方法中,订阅以下信号:getParentModule()->getSubmodule("phy")->subscribe(packetReceivedOkSignal, this); getParentModule()->getSubmodule("mac")->subscribe(frameTransmittedSignal, this); - 重写
handleSignal()方法,处理信号事件:void YourApp::handleSignal(cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) { if (signalID == packetReceivedOkSignal) { totalReceivedOk++; } else if (signalID == frameTransmittedSignal) { totalSent++; } } - 仿真结束时,在
finish()方法中计算成功接收概率:double successRate = (totalSent > 0) ? (double)totalReceivedOk / totalSent : 0; recordScalar("Success Reception Rate", successRate);
这个方案完全不需要修改Veins的核心代码,只需要在你自己的应用模块中添加上述逻辑即可。
方案2:在应用层父类中添加极简计数(仅需修改几行代码)
如果你需要更精准的端到端统计(比如只统计你关心的特定消息类型),可以修改BaseWaveApplLayer(你的应用模块的父类):
- 在
BaseWaveApplLayer.h中添加两个protected成员变量:long m_totalSentWSM;和long m_totalReceivedWSM; - 在
BaseWaveApplLayer.cc的构造函数中初始化这两个变量为0。 - 修改
sendWSM(WaveShortMessage* wsm)方法,在发送前增加m_totalSentWSM++; - 修改
onWSM(WaveShortMessage* wsm)方法,在处理前增加m_totalReceivedWSM++; - 最后在
finish()方法中计算并记录概率:double successRate = (m_totalSentWSM > 0) ? (double)m_totalReceivedWSM / m_totalSentWSM : 0; recordScalar("WSM Success Reception Rate", successRate);
这个方案仅需修改Veins的BaseWaveApplLayer类的几行代码,改动极小,且所有继承该类的应用模块都能复用这个统计逻辑。
关于你提到的文献实现问题:
大部分公开研究中展示的成功接收概率,并非全部是完全自行实现复杂的追踪模块。很多研究人员会复用Veins/Omnet++的内置统计机制(比如上述信号监听方案),或者做类似方案2的极小改动来获取数据。只有少数特殊场景(比如需要自定义的链路质量度量)才会进行较多代码修改。
内容的提问来源于stack exchange,提问作者user629034
相关产品推荐
相关产品推荐

