【问题标题】:handleMessage(* msg) doesn't work in OMNET++handleMessage(* msg) 在 OMNET++ 中不起作用
【发布时间】:2021-12-23 11:28:22
【问题描述】:

我有一个无线网络,由 7 个名为 node1 到 7 的传感器和一个网关组成。每个节点和网关都有一个由@directIo 标记的输入端口。数据流的方式是,网关选择其中一个节点作为簇头,并使用 sendDirect() 向节点发送包含所选簇头 ID 号的消息,问题是,节点的 handleMessage () 事件根本没有被调用。

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>


using namespace omnetpp;

class node : public cSimpleModule
{
private:
    float propagationDelay;
    float duration;
    double eLevel;
    float dist;
    int mCount;
    int clusterHead;
    cModule *target;
    cMessage *timerMessage;
    cMessage *pack;
    cMessage *weak;
    cMessage *msg;
    bool gReq;
  protected:
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(node);

void node::initialize()
{
    gReq=false;
    eLevel=par("energyLeve");
    mCount=0;
    dist=(rand()%3)+1;
    timerMessage = new cMessage("timer");
    /*if (par("sendMsgOnInit").boolValue() == true) {
       EV << getName()<<getIndex() << "------ distance: " << dist << "\n";
    }*/
}

void node::handleMessage(cMessage *msg)
{
    if (msg->getSenderModuleId()==2){
            clusterHead=atoi((char *) msg->getName());
            if (getId()!=clusterHead){
                pack= new cMessage("Hello");
                timerMessage =new cMessage("Timer");
                mCount=0;
                target = getSimulation()->getModule(clusterHead);
                sendDirect(pack, propagationDelay, duration, target, "radioIn");
                eLevel-=dist;
                if (eLevel<50 && gReq==false){
                    weak= new cMessage("w");
                    target = getSimulation()->getModule(2);
                    sendDirect(weak, propagationDelay, duration, target, "radioIn");
                    gReq=true;
                    EV << "node index: "<< getIndex() << "request sent!";
                }
                EV << getName()<<getIndex() << "------ eLevel: " << eLevel;
                scheduleAt(simTime()+0.1, timerMessage);
            }
        }

}

代码 2

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;


class gateway : public cSimpleModule
{
  public:
    int mCount;
    cMessage *clusterNodeSelecMess;
    cMessage *timerMessage;
    cMessage *msg;
    int round;
    int clusterHeadId;
    bool weakNodes[7];
    int inx;
  protected:
    int clusterHeadSelection(bool weakNodes[7]);
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};
Define_Module(gateway);

void gateway::initialize()
{
    msg= new cMessage("self");
    scheduleAt(0.0, msg);
    round =0;
    for (int i = 0; i < 7; ++i) {
            weakNodes[i]=false;
        }
}

void gateway::handleMessage(cMessage *msg)
{
    if(msg->getSenderModuleId()==2){
        round++;
        clusterHeadId=clusterHeadSelection(weakNodes);
        std::string s = std::to_string(clusterHeadId);
        EV << "Node number "<<clusterHeadId << " selected as CH\n";
        char const *pchar = s.c_str();
        clusterNodeSelecMess = new cMessage(pchar);
            for (cModule::SubmoduleIterator it(getModuleByPath("FTN")); !it.end(); ++it) {
                    cModule *temp = *it;
                    if (strcmp(temp->getName(),getName())!=0){
                        sendDirect(clusterNodeSelecMess->dup(), temp, "radioIn");
                    }
                }
    }
    else if(msg->getSenderModuleId()==clusterHeadId){
        clusterHeadId=clusterHeadSelection(weakNodes);
        std::string s = std::to_string(clusterHeadId);
        EV << "Node number "<<clusterHeadId << " selected as CH\n";
        char const *pchar = s.c_str();
        clusterNodeSelecMess = new cMessage(pchar);
        for (cModule::SubmoduleIterator it(getModuleByPath("FTN")); !it.end(); ++it) {
            cModule *temp = *it;
            sendDirect(clusterNodeSelecMess->dup(), temp, "radioIn");
         }
    }
    else{
        EV << "Received from node: "<< msg->getSenderGateId() - 1 << "\n";
    }
}

int clusterHeadSelection(bool weakNodes[7]){
        int i = 0;
        int clusterHeadId;
        while(weakNodes[clusterHeadId=(rand() % 12)-2]==true){
                    i++;
                    if (i>7){
                        return(NULL);
                    }
                }
        return(clusterHeadId);
}

【问题讨论】:

    标签: c++ omnet++


    【解决方案1】:

    handleMessage() 方法永远不会被模拟器调用,因为您永远不会向您的任何模块发送消息,因此没有任何东西可以传递。请注意,sendDirect() 调用仅存在于您的 handleMessage() 方法中,因此在调用其中一个方法之前,不会有消息要传递。模拟的工作方式是某些代码必须在 initialize() 方法中创建消息或事件(例如计时器),因为这是在模拟开始时调用的方法。

    node::initialize() 中,您创建了一个timerMessage,但从不安排它,因此它不会传送到handleMessage()。 (并不是说它会有所帮助,因为handleMessage() 代码会明确忽略它):

    gateway 模块创建并安排了一条 self 消息,该消息被传递给 gateway::handleMessage(),但它没有得到处理,并且很可能在最后落入 else 案例中,然后什么也不做。

    【讨论】:

    • 谢谢@Rudi,因为它是另一个项目的修订版,项目中有一些元素尚未使用。但是网关在gateway::initialize() 中有一个预定的消息,它成功地将消息发送到gateway::handleMessage() 中的每个节点,问题是node::handleMessage() 永远不会被调用,尽管它们每个人都从网关接收到一条消息,你可以在模拟。我怀疑要处理通过sendDirect() 方法发送的消息,我应该使用另一个事件,例如apply() ....
    • 问题解决了。
    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2020-09-09
    • 2016-06-24
    相关资源
    最近更新 更多