从已经存在的堆栈溢出讨论中,我知道传输范围与旧版本静脉中的功率、噪声和灵敏度有关。
在运行时更改一组特定车辆的传输信号强度
我的问题是 在最新版本的 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 模块)设置两个传输范围。
也许有一种">复杂"的方法可以通过定义两个参数来做到这一点(即:maxInterfDistNodes和maxInterfDistfor 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文件夹)
再一次:我的长篇写作只是为了给你我的想法和一些对我有用的技巧(只需对目标进行一些修改),我们总是通过经验提高我们的能力,就像你完美地用上面的代码解决这个问题一样。
祝你好运:)