如何在静脉-5.0中固定RSU(1000m)和车辆(300m)的传输范围



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

在运行时更改一组特定车辆的传输信号强度

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

车辆至 300m 的 txPower2 =15.5mW

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

已检查连接 manger.cc 的最大中间功能。默认情况下,最大范围被认为是RSU和车辆的maxInterfIst。

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

我是否需要为返回距离的车辆添加另一种方法(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);
}'''

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的错误。

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

非常感谢

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

也许有一种">复杂"的方法可以通过定义两个参数来做到这一点(即:maxInterfDistNodesmaxInterfDistfor Cars和RSU),但我可能会考虑在initialize()部分这样做,即执行以下操作:

  • 在 RSU 和 Car 场景文件(traci 文件夹文件)中实例化 mac 模块。
  • 在第一阶段 (=0),尝试以不同的方式调整 txPower(根据文件,如果是 RSU 或汽车)。
  • 不要忘记在.ini文件中的连接管理器模块中设置传输上限(由于RSU传输范围是最大值,因此也应将其设置为连接管理器)
  • 即使您看到车辆传输的流量超过了您在 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.内德

//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.");
}
}  

天哪.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)如果是这种情况,那么任务将更容易,因为您需要为每个模块(节点/RSU)创建定义一次传输功率(我将在下面给出位置)。
  • 您正确使用了 get 和 set 方法,但我觉得您可以只处理传统的(已经部署的)txPower_mW字段。您可以稍后(根据模块的类型=RSU/Car)设置在初始化期间仅txPower_mW一次。
  • 如您所知,我们有时可能会被模拟所欺骗,即使一切看起来都正常工作,但也可能存在一些技术错误(至于使用tx_power与覆盖范围的真正含义之间的匹配,还需要通过改变节点之间的距离进行一些测试(20mW 和 155mW 就是一个例子)。
  • 我不知道为什么,但我觉得修改连接管理器模块不是那么明智。此外,从该模块的工作原理来看,您只能有一个interfDistance,即:用于计算接收数据包的机会,因为 connectionmanager 模块不会根据发送方的类型在传输之间产生差异,因此平等地评估它们。(并且仍然尊重每个节点的tx_power)

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

  • 找到每个节点的对应mac1609_4(RSU/Car)。我不知道你正在使用什么文件,但等同于(TraCITestApp.cc+h)用于汽车和(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*/);

我仍然建议让其他文件不被更改,因为这是溺爱的好习惯,尤其是使用新语言/平台/等。 (至少对我来说,因为我认为自己的年龄还不够大,有静脉)。因此:您可以将连接管理器返回到其初始状态(您可以在继续工作之前备份整个src文件夹)

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

祝你好运:)

最新更新