我的RSU如何以周期性的时间间隔在静脉中调用函数?

时间:2019-07-10 09:54:34

标签: c++ omnet++ veins

我目前正在研究Veins 4.7.1上的算法,其中许多车辆和RSU正在发送和接收消息。

我现在希望我的RSU执行定期计算,无论它是发送还是接收消息。问题是我不知道如何在RSU应用程序中以及在何处实施这些定期计算。

我的第一个尝试是使用BaseWaveApplLayer中提供的功能之一来实现计算。我虽然打算通过计时器将它们添加到handlePositionUpdate(cObject* obj)中,但是我显然不能在RSU应用程序中使用此功能。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用自我消息是在模块中执行定期任务的典型方法。但是,如果您需要执行多个任务,则可能会出现问题。您需要先创建所有消息,正确处理它们,并记住在析构函数中cancelAndDelete

使用称为TimerManager的Veins实用程序(在Veins 4.7中添加),可以用更少的代码获得相同的结果。您需要在模块中拥有TimerManager的成员,并在initialize中指定任务。这样做的好处是,如果您决定以后再添加新的定期任务,那么就像将它们添加到initialize中一样简单,并且TimerManager会处理其他所有事情。可能看起来像这样:

class TraCIDemoRSU11p : public DemoBaseApplLayer {
public:
    void initialize(int stage) override;
    // ...
protected:
    veins::TimerManager timerManager{this};  // define and instantiate the TimerManager
    // ...
};

还有initialize

void TraCIDemoRSU11p::initialize(int stage) {
    if (stage == 0) {       // Members and pointers initialization       
    }
    else if (stage == 1) {  // Members that require initialized other modules           
        // encode the reaction to the timer firing with a lambda
        auto recurringCallback = [this](){
            //Perform Calculations
        };
        // specify when and how ofthen a timer shall fire
        auto recurringTimerSpec = veins::TimerSpecification(recurringCallback).interval(1);
        // register the timer with the TimerManager instance
        timerManager.create(recurringTimerSpec, "recurring timer");
    }
}

在Github上的手册中了解更多信息:TimerManager manual。带有注释的代码是从那里获取的。

答案 1 :(得分:1)

由于Ventu的评论,我终于解决了我的问题。 我只是在BaseApplLayer.h中创建了wsm固有消息类型,并在TraCIDemoRSU11p.cc

中实现了以下代码
void TraCIDemoRSU11p::initialize(int stage) {
    MyBaseWaveApplLayer::initialize(stage);
    if (stage == 0) {       // Members and pointers initialization       
    }
    else if (stage == 1) {  // Members that require initialized other modules           
        // Message Scheduling
        scheduleAt(simTime(), sendSelfMsgEvt);
    }
}

void TraCIDemoRSU11p::handleSelfMsg(cMessage* msg) {
    switch (msg->getKind()) {
    case SELF_MSG_EVT: {
        std::cout << "RSU Self Message received at " << simTime().dbl() << std::endl;  
        // Perform Calculations
        // ...

        // Self Message sending:
        scheduleAt(simTime() + PERIOD, sendSelfMsgEvt);
        break;
    }
    default: {
        if (msg)
            DBG_APP << "APP: Error: Got Self Message of unknown kind! Name: "
                << msg->getName() << endl;
        break;
    }
    }
}