如何在 Veins-5.0 中修复 RSU(1000m)和 Vehicles(300m)的传输范围?

How to fix the transmission range of RSU (1000m) and Vehicles(300m) in Veins-5.0?

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

我的问题是 在最新版本的 Veins 5.1 中,RSU 和 Veins 都考虑了全局传输范围。我怎样才能使它具体?就像我想为 txPower1 =20mW 和

指定 RSU 到 1000m 的范围

txPower2 300m 的车辆 =15.5mW

*.connectionManager.maxInterfDist = 1000m \为 RSU 添加 *.connectionManager.maxInterfDist节点 = 300m \为车辆添加

检查了连接 manger.cc 中的 maxInterfDist。默认情况下,RSU 和车辆的 maxInterfDist 都会考虑最大范围。

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

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

.omnet.ini

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

基础连接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);
}'''

连接Manager.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.");
   }
}'''

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

可能是我的问题看起来很傻,但我需要指导。请帮忙。

非常感谢

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

也许有一种“复杂”的方法可以通过定义两个参数(即:maxInterfDistNodes maxInterfDist 分别用于汽车和 RSU),但我可能会考虑在 initialize() 部分执行此操作,即执行以下操作:

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

如有误会,请告诉我们。

此致,

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

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

它适用于我的情况。我认为这是正确的做法。感谢您的指导。这真的意义重大。

恭喜您完成编辑,您已经习惯使用 veins&omnet++ 的基础知识。 遗憾的是我现在不能测试它,因为我正在我的其他操作系统中设置模拟,但我可以根据我的经验讨论并给出一些评论:

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

我建议如下:(它们可能包含错误,因为它们未经测试)

  • 找到每个节点(RSU/Car)对应的mac1609_4。我不知道您使用的是什么文件,但等效于 (TraCITestApp.cc+h) 用于 Cars 和 (TraCIDemoRSU11p.cc+h) 用于 RSU。当然,这是通过将其添加到相应文件的 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

2- 在 Car+RSU 文件的“.cc”中,在它们的 "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*/);

而且我仍然建议不要更改其他文件,因为这是 良好的习惯,尤其是对于新的 languages/platforms/etc。 (至少对我来说是这样,因为我认为自己的血管还不够老)。因此:您可以 return 将 connectionmanager 恢复到其初始状态(您可以在继续工作之前备份整个 src 文件夹)

再一次:我的长篇文字只是为了给你我的想法和一些对我有用的技巧(对目标只做了一些修改)我们总是通过经验来提高我们的能力,就像你完美地解决这个问题一样您上面的代码有问题。

祝你好运:)