我目前正在从事有关 V2X 模拟的学校项目(目前使用 omnet++ v. 6.0.1 和 Veves v. 5.2)。 到目前为止,我创建了包含 1 个 RSU 和 3 辆车的简单示例。到目前为止的目标是实现发送特定消息。因此,我为车辆创建了 1 个应用程序,该应用程序定期检查特定条件,当满足条件时,消息将广播到所有其他节点(车辆和 RSU)。 发送工作正常,但接收有点缺乏。如果我理解正确的话,当使用
sendDown(wms)
方法广播消息时,接收此消息的所有其他节点都应该调用 onWSM()
方法。然而,由于某种原因,这种情况并没有发生。仅当车辆生成时才会调用它。
下面是我正在使用的代码。 车辆应用:
#include "hradeck17/application/CamTestApp.h"
#include "hradeck17/messages/CAM_m.h"
using namespace veins;
using namespace hradeck17;
Define_Module(hradeck17::CamTestApp);
void CamTestApp::initialize(int stage)
{
EV << "Initializing CamTestApp " << std::endl;
DemoBaseApplLayer::initialize(stage);
if (stage == 0) {
sentMessage = false;
lastDroveAt = simTime();
currentSubscribedServiceId = -1;
lastCamGeneratedAt = simTime().dbl() * 1000;
T_GenCamMin = 100;
T_GenCamMax = 1000;
T_CheckCamGen = T_GenCamMin;
T_GenCam_Dcc = T_GenCamMin;
T_GenCam = 1000;
N_GenCam = 3;
lastHeading = traciVehicle->getAngle();
lastPosition = mobility->getPositionAt(simTime());
lastSpeed = traciVehicle->getSpeed();
conseqCamGenerations = 0;
/* Schedule a self-message for checking the CAM generation condition */
scheduleAt(simTime(), new cMessage("checkCAMCondition"));
}
}
void CamTestApp::onWSA(DemoServiceAdvertisment* wsa)
{
}
void CamTestApp::onWSM(BaseFrame1609_4* frame)
{
CAM* wsm = check_and_cast<CAM*>(frame);
findHost()->getDisplayString().setTagArg("i",1,"green");
EV << "CAM RECEIVED BY CAR" << std::endl;
}
void CamTestApp::handleSelfMsg(cMessage* msg)
{
if(strcmp(msg->getName(), "checkCAMCondition") == 0){
double currentTime = simTime().dbl()*1000;
/* Check the current state of the vehicle */
currentHeading = traciVehicle->getAngle();
currentPosition = mobility->getPositionAt(simTime());
currentSpeed = traciVehicle->getSpeed();
// EV << traci->getLonLat(currentPosition).first << std::endl;
// EV << traci->getLonLat(currentPosition).second << std::endl;
/* Elapsed T_GenCam_Dcc ms from last CAM generation (condition 1) */
if(currentTime - lastCamGeneratedAt >= T_GenCam_Dcc){
/* Heading changed by more than 4 degrees */
/* Speed changed by more than 0.5 m/s */
/* Position changed by more than 4 m */
if(fabs((currentHeading - lastHeading)) * 180 / M_PI > 4 || fabs(currentSpeed - lastSpeed) > 0.5 || currentPosition.distance(lastPosition) > 4){
findHost()->getDisplayString().setTagArg("i", 1, "red");
CAM* wsm = new CAM();
populateWSM(wsm);
wsm->setSenderAddress(myId);
wsm->setPosition(currentPosition);
wsm->setHeading(currentHeading);
wsm->setSpeed(currentSpeed);
T_GenCam = currentTime - lastCamGeneratedAt;
sendDown(wsm);
lastCamGeneratedAt = currentTime;
}
}
/* Condition 2 */
else if(currentTime - lastCamGeneratedAt >= T_GenCam && currentTime - lastCamGeneratedAt >= T_GenCam_Dcc){
/* Trigger CAM generation */
CAM* wsm = new CAM();
populateWSM(wsm);
wsm->setSenderAddress(myId);
wsm->setPosition(currentPosition);
wsm->setHeading(currentHeading);
wsm->setSpeed(currentSpeed);
T_GenCam = T_GenCamMax;
sendDown(wsm);
lastCamGeneratedAt = currentTime;
}
/* Update state of the vehicle */
lastHeading = currentHeading;
lastPosition = currentPosition;
lastSpeed = currentSpeed;
/* Schedule next CAM check message */
scheduleAt(simTime() + ((double)T_CheckCamGen/1000), new cMessage("checkCAMCondition"));
}
else {
DemoBaseApplLayer::handleSelfMsg(msg);
}
}
void CamTestApp::handlePositionUpdate(cObject* obj)
{
DemoBaseApplLayer::handlePositionUpdate(obj);
}
留言:
import veins.base.utils.Coord;
import veins.modules.messages.BaseFrame1609_4;
import veins.base.utils.SimpleAddress;
namespace hradeck17;
//Cooperative awareness message (CAM)
//CAM is always broadcasted, max frequency is 10 Hz
packet CAM extends veins::BaseFrame1609_4 {
string demoData;
int ID;
veins::LAddress::L2Type senderAddress = -1;
int serial = 0;
veins::Coord position;
double heading;
double speed;
}
特别是我没有看到“汽车接收的摄像头”。如果您能提供更多帮助,我将不胜感激。
我发现,
DemoBaseApplLayer::handleLowerMsg(cMessage* msg)
方法没有被调用。
之所以没有调用
onWSM()
方法,主要原因是因为上面的实现利用了同时发送和接收消息的方法。由于 CSMA/CA “未实施”,因此用 sendDown(wsm)
替换 sendDelayedDown(wsm, delay)
可以完美完成工作(增加轻微延迟)。