Отправка сообщений и придорожного (R2R) сообщения в Венах - PullRequest
1 голос
/ 15 марта 2019

Я новичок в Омнет Вены.Я пытаюсь создать свое собственное приложение.Итак, прежде всего, я сделал это в существующих файлах TraciDemo11p (я просто сохранил имя файла и изменил код).На первом этапе я хочу, чтобы все узлы отправляли HelloMsg (новый пакет, который я создал .msg .h и .cc).

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

Это скриншот того, что у меня есть: введите описание изображения здесь

Я следил за передачей сообщения между слоями приложения, mac и phy.Я вижу, что сообщение успешно передается узлом 1 , например.Но означает ли сообщение на узле [0], что «пакет не был обнаружен картой. Мощность была ниже порога чувствительности» означает, что пакет не был получен узлом [0] ?.Если это так, как я могу это исправить?Кроме того, я не могу найти исходный файл этого сообщения (по-видимому, в PhyLayer80211p.cc или BasehyLayer.cc, но не могу его найти).

На втором шаге я хочу использовать два RSU.Узлы передают приветственное сообщение, и затем каждый RSU будет повторять полученный сигнал.Чтобы уточнить больше, это именно то, что я имею: в первую очередь.Я добавляю еще один RSU в пример вен следующим образом:

##########################################################
#                       RSU SETTINGS                     #
#                                                        #
#                                                        #
##########################################################
*.rsu[0].mobility.x = 6490
*.rsu[0].mobility.y = 1000
*.rsu[0].mobility.z = 3

*.rsu[1].mobility.x = 7491
*.rsu[1].mobility.y = 1000
*.rsu[1].mobility.z = 3

*.rsu[*].applType = "TraCIDemoRSU11p"
*.rsu[*].appl.headerLength = 80 bit
*.rsu[*].appl.sendBeacons = false
*.rsu[*].appl.dataOnSch = false
*.rsu[*].appl.beaconInterval = 1s
*.rsu[*].appl.beaconUserPriority = 7
*.rsu[*].appl.dataUserPriority = 5

Кроме того, я сделал два maxInterferenceDistance, один из узлов и другой для RSU:

##########################################################
#            11p specific parameters                     #
#                                                        #
#                    NIC-Settings                        #
##########################################################
*.connectionManager.sendDirect = true
*.connectionManager.maxInterfDist = 1000m  #2600m
*.connectionManager.drawMaxIntfDist = false #false
*.connectionManager.maxInterfDistNodes = 300m
*.connectionManager.drawMaxIntfDistNodes = false

*.**.nic.mac1609_4.useServiceChannel = false

*.**.nic.mac1609_4.txPower = 20mW
*.**.nic.mac1609_4.bitrate = 6Mbps
*.**.nic.phy80211p.sensitivity = -89dBm

*.**.nic.phy80211p.useThermalNoise = true
*.**.nic.phy80211p.thermalNoise = -110dBm

*.**.nic.phy80211p.decider = xmldoc("config.xml")
*.**.nic.phy80211p.analogueModels = xmldoc("config.xml")
*.**.nic.phy80211p.usePropagationDelay = true

*.**.nic.phy80211p.antenna = xmldoc("antenna.xml", "/root/Antenna[@id='monopole']")

Чтобы сделатьДальность передачи RSU отличается от таковой для узлов, я сделал это изменение в функции isInRange baseConnectionMannager:

bool BaseConnectionManager::isInRange(BaseConnectionManager::NicEntries::mapped_type pFromNic, BaseConnectionManager::NicEntries::mapped_type pToNic)
{
    double dDistance = 0.0;

    if ((pFromNic->hostId == 7) || (pFromNic->hostId == 8)) {
        EV<<"RSU In range from: "<<pFromNic->getName()<<" "<<pFromNic->hostId<<" to: "<<pToNic->getName()<<" "<<pToNic->hostId<<"\n";
    if(useTorus) {
        dDistance = sqrTorusDist(pFromNic->pos, pToNic->pos, *playgroundSize);
    } else {
        dDistance = pFromNic->pos.sqrdist(pToNic->pos);
    }
    return (dDistance <= maxDistSquared);
    } else {
        if(useTorus) {
                dDistance = sqrTorusDist(pFromNic->pos, pToNic->pos, *playgroundSize);
            } else {
                dDistance = pFromNic->pos.sqrdist(pToNic->pos);
            }
            return (dDistance <= maxDistSquaredNodes);
    }
}

Где идентификаторы узлов 7 и 8 - это RSU в сценарии, который я запускаю.

Кроме того, у меня есть TraciDemo11p (для узлов) и TraciDemoRSU11p (для RSU), модифицированные следующим образом: - В TraciDemo11p узлы, входящие в сеть, передают сообщение Hello всем своим соседям.Код:

void TraCIDemo11p::initialize(int stage) {

    BaseWaveApplLayer::initialize(stage);
    if (stage == 0) {
        HelloMsg *msg = createMsg();
        SendHello(msg);
    }
}

HelloMsg* TraCIDemo11p::createMsg() {
    int source_id = myId;
    double t0 = 0;
    int port = 0;

    char msgName[20];
    sprintf(msgName, "send Hello from %d at %f from gate %d",source_id, t0, port);

    HelloMsg* msg = new HelloMsg(msgName);
    populateWSM(msg);
    return msg;
}

void TraCIDemo11p::SendHello(HelloMsg* msg) {
    findHost()->getDisplayString().updateWith("r=16,green");
    msg->setSource_id(myId);
    cMessage* mm = dynamic_cast<cMessage*>(msg);
    scheduleAt(simTime() + 10 + uniform(0.01, 0.02), mm);
}

void TraCIDemo11p::handleSelfMsg(cMessage* msg) {

    if (dynamic_cast<HelloMsg*>(msg)) {
        HelloMsg* recv = dynamic_cast<HelloMsg*>(msg);
        ASSERT(recv);
        int sender = recv->getSource_id();
        if (sender == myId) {
            EV <<myId <<" broadcasting Hello Message \n";
            recv->setT0(SIMTIME_DBL(simTime()));
            sendDown(recv->dup());
        }
    }
    else {
        BaseWaveApplLayer::handleSelfMsg(msg);
    }
}

void TraCIDemo11p::onHelloMsg(HelloMsg* hmsg) {
    if ((hmsg->getSource_id() == 7) || (hmsg->getSource_id() == 8)) {
        EV <<"Node: "<<myId<<" receiving HelloMsg from rsu: "<<hmsg->getSource_id()<<"\n";
    } else {
    EV <<"Node: "<<myId<<" receiving HelloMsg "<<hmsg->getKind()<<" from node: "<<hmsg->getSource_id()<<"\n";
    NBneighbors++;
    neighbors.push_back(hmsg->getSource_id());
    EV <<"Node: "<<myId<<" neighbors list: ";
    list<int>::iterator it = neighbors.begin();
    while (it != neighbors.end()) {
        EV <<*it<<" ";
        it++;
    }
    }
}

void TraCIDemo11p::handlePositionUpdate(cObject* obj) {
    BaseWaveApplLayer::handlePositionUpdate(obj);
}

С другой стороны, RSU просто повторяют сообщение, которое они получили от узлов.Итак, у меня на TraciDemoRSU11p:

void TraCIDemoRSU11p::onHelloMsg(HelloMsg* hmsg) {

    if ((hmsg->getSource_id() != 7) && (hmsg->getSource_id() != 8))
    {
        EV <<"RSU: "<<myId<<" receiving HelloMsg "<<hmsg->getKind()<<" from node: "<<hmsg->getSource_id()<<" at: "<<SIMTIME_DBL(simTime())<<" \n";
        //HelloMsg *msg = createMsg();
        //SendHello(msg);
        hmsg->setSenderAddress(myId);
        hmsg->setSource_id(myId);
        sendDelayedDown(hmsg->dup(), 2 + uniform(0.01,0.2));
    }
    else {
        EV<<"Successful connection between RSUs \n";
        EV <<"RSU: "<<myId<<" receiving HelloMsg "<<hmsg->getKind()<<" from node: "<<hmsg->getSource_id()<<"\n";
    }
}

После выполнения этого кода я вижу:

  • несколько номеров автомобилей, получающих приветственное сообщение отих соседей.

  • также, только два сообщения были получены двумя RSU.

  • Каждый RSU повторяет сигнал, который он получает, но тамнет связи между двумя RSU, которые предполагаются при передаче друг другу.

  • И у меня всегда много этого сообщения "пакет не был обнаружен картой. Питание былопод порогом чувствительности "напечатано на моем экране.

Есть ли проблема в дальности передачи или речь идет о помехах?Также хотелось бы отметить, что в анализе нет потери пакетов.Заранее спасибо.Пожалуйста, помогите.

...