当另一个节点发送WSM时,不会调用Veins的handleLower

问题描述 投票:0回答:1

我目前正在从事有关 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)
方法没有被调用。

c++ omnet++ veins
1个回答
0
投票

之所以没有调用

onWSM()
方法,主要原因是因为上面的实现利用了同时发送和接收消息的方法。由于 CSMA/CA “未实施”,因此用
sendDown(wsm)
替换
sendDelayedDown(wsm, delay)
可以完美完成工作(增加轻微延迟)。

© www.soinside.com 2019 - 2024. All rights reserved.