我对OMNET ++和INET相对较新,并且希望将我创建的子模块连接到wlan gate来测量名为fingerPrinter的无线指纹,但是我在运行时遇到以下错误:
(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");
}
}
有人可以帮忙吗?
答案 0 :(得分:0)
这种情况正在发生,因为您的WHost
继承自AODVRoouter
继承自WirelessHost
的{{1}},其继承自StandardHost
的{{1}}。在NodeBase.ned中,INET已将该门连接到networkLayer:
NodeBase
并且在使用继承时无法删除模块之间的连接(除非代码是专门为该函数编写的)。
根据您想要达到的目标,您有3个选项:
INET中的IP模块具有netfilter挂钩,即您可以安装从下层接收到任何内容时通知的代码片段。你可以做各种各样的事情。此工具主要用于路由协议以监控流量并相应地修改路由表。
您可以复制整个继承链,即使用不同的类型名复制for i=0..sizeof(radioIn)-1 {
radioIn[i] --> { @display("m=s"); } --> wlan[i].radioIn;
wlan[i].upperLayerOut --> networkLayer.ifIn++;
wlan[i].upperLayerIn <-- networkLayer.ifOut++;
}
,NodeBase
等,并将新模块放在网络层之间的备用NodeBase代码中和WLAN卡。这是丑陋的,而且当使用继承代替组合时,这种情况大多发生。
推荐的方式:INET的设计是一种网络接口应该可以替换的方式。您可以创建一个实现StandardHost
的复合模块,将模块和IWirelessNic
放在里面,相应地连接它们并配置要使用的接口类型而不是默认的Ieee80211Nic
。这实际上意味着您已经创建了一个新的WiFi卡,其中包含您自己的代码,然后将该新卡插入您的主机。