Пока я создал простой пример с 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 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(frame);
findHost()->getDisplayString().setTagArg("i",1,"green");
EV getAngle();
currentPosition = mobility->getPositionAt(simTime());
currentSpeed = traciVehicle->getSpeed();
// EV getLonLat(currentPosition).first 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) не вызывается.
Подробнее здесь: https://stackoverflow.com/questions/781 ... -sends-wsm
Мобильная версия