我的 RSU 如何在 Veins 中以周期性时间间隔调用函数?
How can my RSU call a function at periodic time intervals in Veins?
我目前正在研究 Veins 4.7.1 上的算法,其中许多车辆和 RSU 正在发送和接收消息。
我现在希望我的 RSU 执行定期计算,无论它是否发送或接收消息。问题是我不知道如何以及在何处在我的 RSU 应用程序中实施这些周期性计算。
我的第一次尝试是在 BaseWaveApplLayer
中提供的一个函数中实现计算。我想用计时器将它们添加到 handlePositionUpdate(cObject* obj)
中,但我显然不能在 RSU 应用程序中使用此功能。
任何帮助将不胜感激。
感谢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;
}
}
}
使用自我消息是在模块中执行周期性任务的典型方式。但是,如果您需要执行多项任务,则可能会出现问题。您需要首先创建所有消息,正确处理它们并记住在析构函数中 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。带注释的代码取自那里。
我目前正在研究 Veins 4.7.1 上的算法,其中许多车辆和 RSU 正在发送和接收消息。
我现在希望我的 RSU 执行定期计算,无论它是否发送或接收消息。问题是我不知道如何以及在何处在我的 RSU 应用程序中实施这些周期性计算。
我的第一次尝试是在 BaseWaveApplLayer
中提供的一个函数中实现计算。我想用计时器将它们添加到 handlePositionUpdate(cObject* obj)
中,但我显然不能在 RSU 应用程序中使用此功能。
任何帮助将不胜感激。
感谢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;
}
}
}
使用自我消息是在模块中执行周期性任务的典型方式。但是,如果您需要执行多项任务,则可能会出现问题。您需要首先创建所有消息,正确处理它们并记住在析构函数中 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。带注释的代码取自那里。