【问题标题】:Timer-based sending of message基于定时器的消息发送
【发布时间】: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-&gt;isScheduled()) { cancelEvent(RstValueEvt); }
  • 在基于距离计算计时器后的 onWSM 函数中,我使用以下方法安排了自我消息; scheduleAt(simTime()+定时器, RstValueEvt); @JerzyD。
  • 我也在 onWSM 函数中添加了那行@JerzyD。

标签: omnet++ veins


【解决方案1】:

我建议通过以下方式来实现您的目标:

  • 在您的班级中声明一条消息,用于存储接收到的广播消息,例如

    cMessage * toBroadcastMsg;
    
  • 在构造函数集中

    toBroadcastMsg = nullptr;
    
  • 创建一个 selfmessage(计时器)的实例:

    MyApp::initialize() {
      // ...
      RstValueEvt = new cMessage("reset value evt");
      // ... }
    
  • 检查您的自我消息(计时器)是否过期:

    MyApp::handleSelfMsg(cMessage* msg) {
      // ...
      if (RstValueEvt == msg && toBroadcastMsg != nullptr) {
            // (2) send a message from toBroadcastMsg 
            // ...
            toBroadcastMsg = nullptr;
       }
    
  • 在收到广播消息后安排计时器并存储收到的广播消息的副本:

    MyApp::onWSM(BaseFrame1609_4* wsm) {
      if(wsm.getrecipient == myId) {
        if(RstValueEvt->isScheduled()) { 
           cancelEvent(RstValueEvt); 
        } else {
           scheduleAt(simTime() + timer, RstValueEvt);
           // (1) remember copy of the message for future use
           toBroadcastMsg = wsm->dup;
        }
      }
    

【讨论】:

  • 你能帮忙写下定时器到期时发送重播的代码吗@Jerzy D.
  • 您的问题不包含有关用于广播的消息类型以及发送时间和方式的任何信息。您能否提供用于发送和接收第一条广播消息的代码?
  • 我已经编辑了我的问题,以包含在 onWSM 函数中收到后需要广播的消息代码
  • 我在我的回答中添加了一个变量来存储收到的消息的副本。在 (2) 中,您应该添加一个用于发送广播消息的命令 - 您没有在代码中显示该命令,因此我不能将其包含在我的答案中。
猜你喜欢
  • 2021-04-28
  • 2022-11-24
  • 2021-07-12
  • 2012-05-15
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
相关资源
最近更新 更多