如何确定Veins-5.0中RSU(1000m)和车辆(300m)的传输范围?

时间:2019-09-21 17:21:02

标签: omnet++ veins

从已经存在的堆栈溢出讨论中,我知道传输范围与旧版本静脉中的功率,噪声和灵敏度有关。

Change the transmission signal strength for a specific set of vehicles during the run-time

我的问题是 在最新版本的Veins 5.1中,RSU和Veins均考虑了全局传输范围。如何具体说明?就像我要为txPower1 = 20mW和

指定RSU到1000m的范围

txPower2 = 15.5mW的车辆可达300m

*。connectionManager.maxInterfDist = 1000m \为RSU添加 * .connectionManager.maxInterfDistNodes = 300m \为车辆添加

检查了连接manger.cc中的maxInterfDist。默认情况下,将RSU和车辆的maxInterfDist视为最大范围。

还在BaseConnectionManger.cc文件中,使用了maxInterfDist。

我是否需要为返回距离(maxInterDistfNodes)并因此在Omnet.ini文件中使用另一个参数定义功率和灵敏度的车辆添加另一种方法?如果是这样,请指导我在哪里进行更改以及如何进行更改?

.omnet.ini

*.connectionManager.maxInterfDist = 1000m
*.connectionManager.maxInterfDistNodes = 300m
*.**.nic.mac1609_4.txPower = 20mW

BaseConnection Manager.cc

'''BaseConnectionManager::isInRange(BaseConnectionManager::NicEntries::mapped_type pFromNic, BaseConnectionManager::NicEntries::mapped_type pToNic)
{
    double dDistance = 0.0;

    if(useTorus) 
    {
        dDistance = sqrTorusDist(pFromNic->pos, pToNic->pos, *playgroundSize);
    } 
    else 
    {
        dDistance = pFromNic->pos.sqrdist(pToNic->pos);
    }
    return (dDistance <= maxDistSquared);
}'''

connectionManager.cc

'''double ConnectionManager::calcInterfDist()
{
    if (hasPar("maxInterfDist")) 
    {
        double interfDistance = par("maxInterfDist").doubleValue();
        ccEV << "max interference distance:" << interfDistance << endl;
        return interfDistance;
    } 
   else
   {
        throw cRuntimeError("ConnectionManager: No value for maximum 
        interference distance (maxInterfDist) provided.");
   }
}'''

我按照上面的链接进行了添加,但是它显示了无法像这样定义mac的错误。

也许我的问题似乎很愚蠢,但我需要指导。请帮忙。

非常感谢

3 个答案:

答案 0 :(得分:1)

您似乎要根据节点的类型(RSU或Car模块)设置两个传输范围。

也许可以通过定义两个参数(分别是Car和RSU的 maxInterfDistNodes maxInterfDist )来实现“ 复杂”的方式),但我可能会考虑在 initialize()部分上执行此操作,即执行以下操作:

  • 在RSU和Car方案文件(traci文件夹文件)中实例化mac模块。
  • 在第一阶段(= 0),尝试不同地调整txPower(根据文件,如果它是RSU或汽车)。
  • 不要忘记在.ini文件中的connectionmanager模块中设置传输上限(由于RSU传输范围是最大,您也应该将其设置为connectionmanager)
  • 即使您看到车辆传输的数据超出了您在initialize()函数中定义的水平,这也不是问题,因为实际上,与您定义的数据相距甚远的模块不会接收到数据包(更多超过300m),只是图形。

如果有误解,请告诉我们。

最诚挚的问候,

答案 1 :(得分:1)

根据建议,这可能是正确的答案。请看看。

PhysicalControlMsg_m.h

class VEINS_API PhyControlMessage : public ::omnetpp::cMessage
{
protected:
double txPowerNodes_mW; //added
public:
virtual double getTxPowerNodes_mW() const;  //added
virtual void setTxPowerNodes_mW(double txPowerNodes_mW); //added
};

PhysicalControlMsg_m.cc

//added
double PhyControlMessage::getTxPowerNodes_mW() const
{
    return this->txPowerNodes_mW;
}
//added
void PhyControlMessage::setTxPowerNodes_mW(double txPowerNodes_mW)
{
    this->txPowerNodes_mW = txPowerNodes_mW;
}

Mac1609_4.h

void setTxPowerNodes(double txPowerNodes_mW); //added
double txPowerNodes;

Mac1609_4.cc

void Mac1609_4::initialize(int stage)
{
    BaseMacLayer::initialize(stage);
    if (stage == 0) {

        phy11p = FindModule<Mac80211pToPhy11pInterface*>::findSubModule(getParentModule());
        ASSERT(phy11p);

        // this is required to circumvent double precision issues with constants from CONST80211p.h
        ASSERT(simTime().getScaleExp() == -12);

        txPower = par("txPower").doubleValue();
        txPowerNodes = par("txPowerNodes").doubleValue(); //added

}
void Mac1609_4::handleSelfMsg(cMessage* msg)
{
  if (controlInfo) {
            // if MCS is not specified, just use the default one
            MCS explicitMcs = static_cast<MCS>(controlInfo->getMcs());
            if (explicitMcs != MCS::undefined) {
                usedMcs = explicitMcs;
            }
            // apply the same principle to tx power
            txPower_mW = controlInfo->getTxPower_mW();
            if (txPower_mW < 0) {
                txPower_mW = txPower;
            }  

   // apply the same principle to tx power nodes
        //added
                txPowerNodes_mW = controlInfo->getTxPowerNodes_mW();
                if (txPowerNodes_mW < 0) {
                    txPowerNodes_mW = txPowerNodes;
                }

            }
            else {
                txPowerNodes_mW = txPowerNodes;
                txPower_mW = txPower;
            }
}

Mac1609_4.ned

//tx power Nodes [mW]
        double txPowerNodes @unit(mW); //added

ConnectionManager.cc

double ConnectionManager::calcInterfDist()
{
    if (hasPar("maxInterfDist")) {
        double interfDistance = par("maxInterfDist").doubleValue();
        EV_INFO << "max interference distance:" << interfDistance << endl;
        return interfDistance;
    }
    if (hasPar("maxInterfDistNodes")){
        double interfDistanceNodes = par("maxInterfDistNodes").doubleValue();
                EV_INFO << "max interference distance between  Nodes:" << interfDistanceNodes << endl;
                return interfDistanceNodes;

    }
    else {
        throw cRuntimeError("ConnectionManager: No value for maximum interference distance (maxInterfDist) provided.");
    }
}  

omnet.ini

*.connectionManager.sendDirect = true
*.connectionManager.maxInterfDist = 1000m
*.connectionManager.maxInterfDistNodes = 300m
*.connectionManager.drawMaxIntfDist = false

*.**.nic.mac1609_4.useServiceChannel = false
*.**.nic.mac1609_4.txPower = 20mW
*.**.nic.mac1609_4.txPowerNodes = 15.5mW #added

它适合我的情况。我认为这是正确的方法。谢谢您的指导。这真的意味着很多。

答案 2 :(得分:0)

恭喜您进行编辑,您已习惯使用静脉和omnet ++的基础知识。 令人遗憾的是,由于无法在其他操作系统中设置仿真,因此我现在无法对其进行测试,但是我可以基于自己的适度经验进行讨论并提供一些意见:

  • 我看到您正在使用一个传输范围进行所有通信,对吗? (例如,RSU为1000m,汽车为300m),则此任务将变得更加容易,因为您需要为每个模块(节点/ rsu)创建一次来定义传输功率(我将在下面给出位置)。
  • 您正确使用了get和set方法,但我认为您只能在常规的(已经部署的)temPower_mW字段中工作。您可以稍后(并根据模块的类型= RSU / Car)将 txPower_mW 设置为初始化期间的一次。
  • 如您所知,即使有时看起来一切正常,我们有时还是会受到模拟的欺骗,但是可能会有一些技术错误(至于所使用的tx_power与覆盖范围的真正含义之间的匹配,有些还需要通过改变节点之间的距离进行测试(例如20mW和155mW)。
  • 我不知道为什么,但是我觉得修改connectionmanager模块不是那么明智。另外,从该模块的工作原理来看,您只能使用一个 interfDistance :用于计算接收数据包的机会,因为connectionmanager模块之间的传输之间没有区别发送者的类型,从而对它们进行平均评估。 (并且仍然尊重每个节点的tx_power)

我建议以下内容:(由于未经测试,它们可能包含错误)

  • 找到每个节点(RSU / Car)的相应 mac1609_4 。我不知道您正在使用什么文件,但对于汽车而言,等同于(TraCITestApp.cc + h),对于RSU而言,等同于(TraCIDemoRSU11p.cc + h)。当然,这是通过将其添加到适当文件的 initialize()中来完成的:

1-在Car + RSU文件的“ .h”中:

#include "veins/base/utils/FindModule.h"//added
#include "veins/modules/mac/ieee80211p/Mac1609_4.h"//added

        Mac1609_4* mac;//added

在Car + RSU文件的“ .cc”中的2-,在其“ initialize()”中,更确切地说在其“ if(stage == 0)”中,添加:

    mac = FindModule<Mac1609_4*>::findSubModule(getParentModule());//added

3-您现在必须在“ 2-”步骤之后添加以下内容:

    mac->setTxPower(/*what corresponds the needed transmission power for the node type*/);

而且我仍然建议不要更改其他文件,因为这在编码中是好习惯,尤其是在使用新语言/平台/等时。 (至少对我来说,因为我认为自己的年龄还不够大)。因此:您可以将connectionmanager返回到其初始状态(可以备份整个src文件夹,然后再继续工作)

再一次:我写了很长的文字只是为了给我我的想法和一些与我一起工作的技巧(对目标进行了少量修改),我们一直在以自己的经验来增强我们的能力,就像您完美地解决该问题时所做的那样您上面的代码。

祝你好运:)

相关问题