从已经存在的堆栈溢出讨论中,我知道传输范围与旧版本静脉中的功率,噪声和灵敏度有关。
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的错误。
也许我的问题似乎很愚蠢,但我需要指导。请帮忙。
非常感谢
答案 0 :(得分:1)
您似乎要根据节点的类型(RSU或Car模块)设置两个传输范围。
也许可以通过定义两个参数(分别是Car和RSU的 maxInterfDistNodes 和 maxInterfDist )来实现“ 复杂”的方式),但我可能会考虑在 initialize()部分上执行此操作,即执行以下操作:
如果有误解,请告诉我们。
最诚挚的问候,
答案 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 ++的基础知识。 令人遗憾的是,由于无法在其他操作系统中设置仿真,因此我现在无法对其进行测试,但是我可以基于自己的适度经验进行讨论并提供一些意见:
我建议以下内容:(由于未经测试,它们可能包含错误)
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文件夹,然后再继续工作)
再一次:我写了很长的文字只是为了给我我的想法和一些与我一起工作的技巧(对目标进行了少量修改),我们一直在以自己的经验来增强我们的能力,就像您完美地解决该问题时所做的那样您上面的代码。
祝你好运:)