【发布时间】:2022-11-18 18:26:52
【问题描述】:
我想在 VEINs/OMNeT++ 中实现基于计时器的消息方案。这是一个场景:一个节点向许多节点(假设 5 个节点)发送消息。每个节点在收到消息后设置其定时器,根据其与发送方节点的距离向网络中的其他节点广播消息,使得最远的节点设置最短的定时器。当一个节点在其计时器到期之前收到来自其他节点的消息时,它会取消计时器。但是,如果计时器到期并且它没有收到来自其他节点的任何消息,它就会广播该消息。
我尝试按照此链接中的说明进行操作 How to implement timers in Omnet++?
我在initialize()函数中声明了一个定时器消息
MyApp::Initialize(int stage)
{
RstValueEvt = new cMessage("reset value evt");
}
然后用于接收消息的 onWSM 函数检查是否再次收到消息,我检查定时器事件,如果它被安排我取消定时器使用:
MyApp::onWSM(BaseFrame1609* frame)
infoMsg* wsm = check _and_cast<infoMsg>(frame)
if(wsm.getrecipient==myId)
{
if(RstValueEvt->isScheduled())
{ cancelEvent(RstValueEvt); }
else{scheduleAt(simTime()+timer, RstValueEvt);
//creating copy of the message that I need to rebroadcast
cMessage* copyMessage = (cMessage *)infoMsg.dup;
}
}
我的问题是,当计时器到期时,如何使该节点将消息(infoMsg)的副本广播到网络中的所有节点,即如何在 handleselfmsg fcn 和 onWSM fcn 中处理此消息?
【问题讨论】:
-
你能edit问题并提供minimal reproducible example吗?
-
您在哪里安排自我消息?
-
您在哪里添加行:
if(RstValueEvt->isScheduled()) { cancelEvent(RstValueEvt); }? -
在基于距离计算计时器后的 onWSM 函数中,我使用以下方法安排了自我消息; scheduleAt(simTime()+定时器, RstValueEvt); @JerzyD。
-
我也在 onWSM 函数中添加了那行@JerzyD。