OMNET ++ подключение обычного модуля беспроводного узла к WLAN - PullRequest
0 голосов
/ 13 июня 2018

Я относительно новичок в OMNET ++ и INET и хотел бы подключить созданный мною подмодуль для измерения беспроводного отпечатка пальца fingerPrinter к wlan gate, но я получаю следующую ошибку во время выполнения:

(omnetpp :: cGate) NetworkA.hostA.wlan [1] .upperLayerOut: connectTo (): шлюз уже подключен

Вот мой .ned файл:

import inet.node.inet.INetworkNode;
import inet.environment.common.PhysicalEnvironment;
import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.node.wireless.AccessPoint;
import inet.physicallayer.ieee80211.packetlevel.Ieee80211ScalarRadioMedium;
import inet.physicallayer.contract.packetlevel.IRadioMedium;
import inet.visualizer.contract.IIntegratedVisualizer;
import inet.node.inet.WirelessHost;
import inet.node.aodv.AODVRouter;
import inet.applications.udpapp.UDPBasicApp;
//import inet.physicallayer.common.bitlevel.SignalSampleModel;

simple FingerPrinter
{
    gates:
        input in;
        output out;
}

module WHost extends AODVRouter
{
    parameters:
        @networkNode;
        @labels(wireless-node);
    submodules:
        fingerPrinter: FingerPrinter {
            @display("p=429,125");
        }
    //        signal: SignalSampleModel;
    connections:
        //fingerPrinter.in <-- networkLayer.transportOut++;
        //fingerPrinter.out --> networkLayer.transportIn++;
        wlan[1].upperLayerOut --> fingerPrinter.in;
}


network NetworkA
{
    parameters:
        string hostType = default("AODVRouter");
        string mediumType = default("Ieee80211Radio");
        string pathLossType = default("TwoRayGroundReflection");
        @display("bgb=100,100;bgg=100,1,grey95");
    submodules:
        physicalEnvironment: PhysicalEnvironment {
            @display("p=110,0");
        }
        configurator: IPv4NetworkConfigurator {
            @display("p=110,33.33");
        }
        radioMedium: Ieee80211ScalarRadioMedium {
            @display("p=110,66.66");
        }
        visualizer: <default("IntegratedCanvasVisualizer")> like IIntegratedVisualizer if hasVisualizer() {
            @display("p=110,100");
        }
        AP1: AccessPoint {
            @display("p=0,0");
        }
        AP2: AccessPoint {
            @display("p=100,0");
        }
        AP3: AccessPoint {
            @display("p=0,100");
        }
        AP4: AccessPoint {
            @display("p=100,100");
        }
        hostA: WHost {
            @display("p=50,50");
        }

}

Может кто-нибудь, пожалуйста, помогите?

1 Ответ

0 голосов
/ 14 июня 2018

Это происходит потому, что ваш WHost наследуется от AODVRoouter, который наследуется от WirelessHost, который наследуется от StandardHost, который наследуется от NodeBase.В NodeBase.ned INET эти шлюзы уже подключены к networkLayer:

for i=0..sizeof(radioIn)-1 {
    radioIn[i] --> { @display("m=s"); } --> wlan[i].radioIn;
    wlan[i].upperLayerOut --> networkLayer.ifIn++;
    wlan[i].upperLayerIn <-- networkLayer.ifOut++;
}

, и вы не можете удалить соединение между модулями, когда используете наследование (если код не был специально написан для этой функции).

В зависимости от того, чего вы хотите достичь, у вас есть 3 варианта:

  • Модуль IP в INET имеет ловушки netfilter, то есть вы можете устанавливать фрагменты кода, которые уведомляются при получении чего-либоиз нижнего слоя.Вы можете делать разные вещи с этим.Это средство в основном используется протоколами маршрутизации для отслеживания трафика и соответствующей модификации таблицы маршрутизации.

  • Вы можете скопировать всю цепочку наследования, т.е. сделать копию NodeBase, StandardHostи т. д. с другим именем типа и поместите новый модуль в альтернативный код NodeBase между сетевым уровнем и картой WLAN.Это уродливо, и это то, что в основном происходит, когда вместо композиции используется наследование.

  • И рекомендуемый способ: INET был разработан таким образом, что сетевые интерфейсы должны быть заменяемыми.Вы можете создать составной модуль, который реализует IWirelessNic, поместить свой модуль и Ieee80211Nic внутрь, подключить их соответствующим образом и настроить этот тип интерфейса для использования вместо значения по умолчанию Ieee80211Nic.По сути это означает, что вы создали новую карту WiFi, которая содержит ваш собственный код, а затем вставили эту новую карту в ваш хост.

...