Как исправить дальность передачи RSU (1000 м) и транспортных средств (300 м) в Veins-5.0? - PullRequest
1 голос
/ 21 сентября 2019

Из уже существующего обсуждения переполнения стека я знал, что диапазон передачи связан с мощностью, шумом и чувствительностью в старой версии вен.

Изменение уровня сигнала передачи для определенного наборатранспортные средства во время работы

Мой вопрос: в последней версии Veins 5.1 рассматривается глобальная дальность передачи как для RSU, так и для вен.Как я могу сделать это конкретным?Как я хочу указать диапазон RSU до 1000 м для txPower1 = 20 мВт и

Транспортные средства до 300 м для txPower2 = 15,5 мВт

*. ConnectionManager.maxInterfDist = 1000 м \ добавлено для RSU * .connectionManager.maxInterfDistNodes = 300 м \ добавлено для транспортных средств

Проверено значение maxInterfDist в соединении manger.cc.По умолчанию максимальный диапазон рассматривается для maxInterfDist как для RSU, так и для транспортных средств.

Также в файле 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 ]

1 голос
/ 23 сентября 2019

Согласно предложению, это может быть правильный ответ.Пожалуйста, посмотрите.

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

Это работает для моегокейс.Я думаю, что это правильный способ сделать это.Спасибо за прекрасное руководство.Это действительно много значит.

1 голос
/ 22 сентября 2019

Похоже, вы собираетесь установить два диапазона передачи в зависимости от типа узла (RSU или автомобильный модуль).

Возможно, существует способ " сложный "определив два параметра (а именно: maxInterfDistNodes и maxInterfDist для автомобилей и RSU соответственно), но я могу подумать об этом в части initialize () , т.е., выполнив следующее:

  • Создание модуля mac в файлах сценариев RSU и Car (файлы папок traci).
  • На первом этапе (= 0) попытайтесь настроитьtxPower по-разному (в зависимости от файла, если это для RSU или автомобиля).
  • Не забудьте установить верхнюю границу передачи в модуле менеджера соединений в файле .ini (с момента передачи RSUдиапазон - это максимум, вы должны также установить его в диспетчере соединений)
  • Даже если вы видите, что транспортные средства передают больше, чем вы определили в их функции initialize (), это не проблемаКак и в действительности, пакеты не принимаются модулями, у которых намного больше, чем вы определили (более 300 м), это просто графическое изображение.

Если есть недоразумение, сообщите нам.

С уважением,

0 голосов
/ 24 сентября 2019

Поздравляем с редактированием, вы привыкаете использовать основы вен и омнет ++.Печально, что я не могу проверить это прямо сейчас, поскольку я устанавливаю симуляции в другой операционной системе, но я могу обсудить и дать несколько замечаний, основываясь на своем скромном опыте:

  • Я вижу, что выиспользуя один диапазон передачи для всех коммуникаций правильно?(т. е. 1000 м для RSU и 300 м для легковых автомобилей), если это так, то задача будет проще, поскольку вам нужно определить мощность передачи один раз для каждого создания модуля (узла / rsu) (я приведу расположение ниже).
  • Вы используете методы get и set правильно, но я чувствую, что вы можете работать только с обычным (уже развернутым) полем txPower_mW .Вы можете позднее (и в зависимости от типа модуля = RSU / Car) установить txPower_mW только один раз во время инициализации.
  • Как вы знаете, иногда мы можем быть обманутысимуляция, даже если все выглядит так, как будто работает правильно, но могут быть некоторые технические ошибки (что касается соответствия между используемой tx_power и тем, что действительно означает с точки зрения покрытия, также необходимы некоторые тесты с изменением расстояний между узлами (20 мВт иПримером является мощность 155 мВт).
  • Я не знаю почему, но я чувствую, что модифицировать модуль менеджера соединений не очень разумно. Кроме того, с точки зрения принципа работы этого модуля, вы можете иметь только один interfDistance , то есть: используется для расчета вероятности получения пакета, поскольку модуль менеджера соединений не различает передачи в зависимости от типа отправителя, таким образом оценивая их в равной степени (и все еще соблюдая tx_power каждого узла)

Я бы предложилследующее: (они могут содержать ошибки, поскольку они не проверены)

  • Найти соответствующий mac1609_4 каждого узла (RSU / Car).Я не знаю, какой файл вы используете, но эквивалентно (TraCITestApp.cc + h) для автомобилей и (TraCIDemoRSU11p.cc + h) для RSU.Это, конечно, делается путем добавления этого в initialize () соответствующего файла:

1- в ".h" файлов Car + RSU:

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

и

        Mac1609_4* mac;//added

2- в ".cc" файлов Car + RSU, в их "initialize ()", точнее в их "if (stage ==)0) "add:

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

3 - вам просто нужно добавить после инструкции" 2- "следующее:

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

И я все еще рекомендую разрешитьостальные файлы не изменены, так как это привычка при кодировании, особенно с новыми языками / платформами / и т. д.(по крайней мере для меня, поскольку я не считаю себя достаточно старым с венами).Таким образом: вы можете вернуть диспетчер соединений в его исходное состояние (вы можете сделать резервную копию всей вашей папки src, прежде чем продолжить, как она работала)

Еще раз: мой длинный текст написания просто для того, чтобы дать вам мойидеи и некоторые советы, которые работали со мной (всего лишь с несколькими изменениями цели), мы всегда расширяем наши возможности с опытом, как вы прекрасно справились с решением этой проблемы с помощью кода выше.

Всем удачи :)

...