其他分享
首页 > 其他分享> > veins中实现rsu与车辆通信

veins中实现rsu与车辆通信

作者:互联网

受博客 https://blog.csdn.net/PERSEUS_/article/details/105647598
的启发,学习之后,自己试着实现一个小例子:rsu广播自己的id等信息,车辆收到后将rsu的id记录下来。

一、创建msg消息

1 在路径veins/modules/application/traci/创建BeaconRSU.msg

cplusplus{{
#import "veins/base/utils/Coord.h"
#import "veins/modules/utility/Consts80211p.h"
#include "veins/modules/messages/BaseFrame1609_4_m.h"
#include "veins/base/utils/SimpleAddress.h"

}};
 
namespace veins;
 
class noncobject Coord;
class BaseFrame1609_4;

packet BeaconRSU extends BaseFrame1609_4{
	//id of the originator
	int RSUId = 0;
	Coord position[100];
    double beaconrate[100]; 
    string myDemoData;
    Coord slotpos;
    simtime_t timestamp = 0;
}

2 build project后生成对应的.h和.cc文件

二、创建RSU的应用层实现类

在我的设定中,rsu用来发送消息,将原有的MyVeinsApp复制一份,重命名为MyVeinsAppRSU,在头文件中增加

cMessage* sendBeacon;

MyVeinsAppRSU.cc文件中,初始化函数中发送一个自消息

void MyVeinsAppRSU::initialize(int stage)
{
    DemoBaseApplLayer::initialize(stage);
    if (stage == 0) {
        sendBeacon = new cMessage("send Beacon");
        EV << "Initializing " << par("appName").stringValue() << std::endl;
    }
    else if (stage == 1) {
        if (sendBeacon->isScheduled()) {
              cancelEvent(sendBeacon);
       }
       scheduleAt(simTime()+5,sendBeacon);
    }
}

再重写一下handleSelfMsg函数

void MyVeinsAppRSU::handleSelfMsg(cMessage* msg)
{
    if (msg == sendBeacon) {

           BeaconRSU* rsuBeacon = new BeaconRSU();
           rsuBeacon->setRSUId(this->getParentModule()->getIndex());
           rsuBeacon->setMyDemoData("RSU message!!");
//          新建WSM,这是应用层和MAC层通信的消息
           BaseFrame1609_4* WSM = new BaseFrame1609_4();
           //把rsuBeacon封装在WSM中
           WSM->encapsulate(rsuBeacon);
           //设置WSM的基本信息
           populateWSM(WSM);
           send(WSM,lowerLayerOut);
           EV << "rsu send success" <<endl;
           if (simTime() < 2000) {
               scheduleAt(simTime()+1,sendBeacon);
           }
           return;
       }
}

这样,rsu就可以实现发送消息的功能了

三、创建车辆的应用层实现类

车辆用来接收rsu的消息,所以只用重写initialize和handleLowerMsg函数,继续将原有的MyVeinsApp复制一份,重命名为MyVeinsAppCar,头文件如下

#pragma once

#include "veins/veins.h"
#include "veins/modules/application/ieee80211p/DemoBaseApplLayer.h"
#include "veins/modules/application/traci/RSUBeacon_m.h"

using namespace omnetpp;

namespace veins {

class VEINS_API MyVeinsAppCar : public DemoBaseApplLayer {
public:
    void initialize(int stage) override;
    void finish() override;

protected:
    void onBSM(DemoSafetyMessage* bsm) override;
    void onWSM(BaseFrame1609_4* wsm) override;
    void onWSA(DemoServiceAdvertisment* wsa) override;
    void handleLowerMsg(cMessage* msg) override;
    void handleSelfMsg(cMessage* msg) override;
    void handlePositionUpdate(cObject* obj) override;

    cOutVector RSUIndex;
    int a;
};

} // namespace veins

在MyVeinsAppCar.cc中,initialize函数如下,其中RSUIndex用来记录收到消息的rsu的id

void MyVeinsAppCar::initialize(int stage)
{
    DemoBaseApplLayer::initialize(stage);
    if (stage == 0) {
        EV << "Initializing " << par("appName").stringValue() << std::endl;
        int a = INT_MIN;
    }
    else if (stage == 1) {
        RSUIndex.setName("test");
        int a = INT_MIN;
    }
}

handleLowerMsg函数如下:

void MyVeinsAppCar::handleLowerMsg(cMessage* msg) {
    EV << "receive message  !!!" << endl;
    //消息传换成WSM
    BaseFrame1609_4* WSM = check_and_cast<BaseFrame1609_4*>(msg);
    //从WSM中解封数据包
    cPacket* enc = WSM->getEncapsulatedPacket();
    //数据包转换成BeaconRSU
    BeaconRSU* bc = dynamic_cast<BeaconRSU*>(enc);

    if(a!=bc->getRSUId()){
       RSUIndex.record(bc->getRSUId());
       a=bc->getRSUId();
  }

  EV << "my message = " <<bc->getMyDemoData()<<endl;
  EV <<"send message RSU id:" <<bc->getRSUId() << "  Receive successfully !!!!!!!!!!!" << endl;
}

四、在ini文件中修改配置信息

在ini文件中,进行如下修改

*.rsu[*].applType = "MyVeinsAppRSU"
*.node[*].applType = "MyVeinsAppCar"

五、结果

运行之后,就可以观察到车辆收到消息,如下图所示

标签:void,WSM,通信,override,veins,rsu,msg
来源: https://blog.csdn.net/qq_42011039/article/details/110248543