C++ 如何将自定义模块与Omnet++INET的简单模块结合起来
由于所有简单模块(如80211 mac层)的行为都已在INET模块中定义。如果我想在mac层和网络层之间添加一个自定义层来处理网络编码。如何组合自定义模块和INET的简单模块?要在网络层和MAC层之间添加新模块,我建议在新项目中创建修改后的主机。对于OMNeT++4.6和INET 3.2.4,请执行以下操作: 使用src和simulation目录创建一个新的OMNeT++空项目。 在新项目中打开属性|项目引用并选择inet。 右键单击src并选择新建|简单模块。叫它DummyLayer.ned。 打开DummyLayer.ned并添加: 修改DummyLayer.h和DummyLayer.cc此模块只传递上下消息以及递增计数器:C++ 如何将自定义模块与Omnet++INET的简单模块结合起来,c++,omnet++,inet,C++,Omnet++,Inet,由于所有简单模块(如80211 mac层)的行为都已在INET模块中定义。如果我想在mac层和网络层之间添加一个自定义层来处理网络编码。如何组合自定义模块和INET的简单模块?要在网络层和MAC层之间添加新模块,我建议在新项目中创建修改后的主机。对于OMNeT++4.6和INET 3.2.4,请执行以下操作: 使用src和simulation目录创建一个新的OMNeT++空项目。 在新项目中打开属性|项目引用并选择inet。 右键单击src并选择新建|简单模块。叫它DummyLayer.ned。
// DummyLayer.h
#include <omnetpp.h>
namespace inet {
class DummyLayer: public cSimpleModule {
protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg);
private:
int upNumber;
int downNumber;
};
} //namespace
//----------------------------------------------
// DummyLayer.cc
#include "DummyLayer.h"
namespace inet {
Define_Module(DummyLayer);
void DummyLayer::initialize() {
upNumber = 0;
downNumber = 0;
}
void DummyLayer::handleMessage(cMessage *msg) {
if (msg->arrivedOn("upperLayerIn")) {
send(msg, "ifOut");
downNumber++;
} else if (msg->arrivedOn("ifIn")) {
send(msg, "upperLayerOut");
upNumber++;
} else {
error("Incorrect gate");
}
char buf[128];
sprintf(buf, "up: %d, down: %d", upNumber, downNumber);
getDisplayString().setTagArg("t", 0, buf);
}
} //namespace
需要自己的主机模块,因为INET中的StandardHost会自动在MAC层和网络层之间创建连接,并且不可能在这些层之间添加自己的模块
为测试创建网络:
import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.physicallayer.ieee80211.packetlevel.Ieee80211ScalarRadioMedium;
import inet.node.wireless.AccessPoint;
network WirelessNetwork {
submodules:
configurator: IPv4NetworkConfigurator {
@display("p=33,81");
}
radioMedium: Ieee80211ScalarRadioMedium {
@display("p=33,30");
}
node0: WirelessHostEx {
@display("p=128,121");
}
node1: WirelessHostEx {
@display("p=384,115");
}
ap: AccessPoint {
@display("p=273,54");
}
}
修改omnetpp.ini:
在开始模拟后,可以看到在每个主机dummyLayer中都会向前发送消息 非常感谢你,杰瑞。这对我帮助很大。看完代码后,我有一些问题。因为我不熟悉NED的语言,所以你能解释一下像wlan[numRadios]:像IWirelessNic这样的代码吗。和喜欢的含义是什么。有什么语言像奈德的语言吗?在DummyLayer.cc中,getDisplayString.setTagArgt,0,buf;,是什么意思?行wlan[numRadios]:与IWirelessNic的意思类似:创建wlan模块的numRadios实例,除非在omnetpp.ini中选择了其他类型,否则每一个都是IEEE801NIC NED类型。要选择另一种类型的wlan模块,应在omnetpp.ini中写入:*.wlan[*].typename=IdealWirelessNic,其中IdealWirelessNic是必须从IWirelessNic继承的复合模块的名称。typename单词是NED语法的一部分,请参见OMNeT++手册中的;只需在模块图标上方添加来自buf的文本。OMNeT++手册第8.1章详细介绍了显示字符串。一般来说,显示字符串允许向模块的图标添加任何文本,以及更改颜色、位置、添加工具提示等。因此,像IWirelessNic这样的代码意味着IEEE801NIC继承了IWirelessNic?正如您所说,linegetDisplayString.setTagArgt,0,buf;在模块图标上方添加一个文本表单buf,但我在哪里可以看到它?嗨,Jerzy。当我查看主机内部并开始模拟时,我发现传输仅基于mac层,而不通过虚拟层。此模型中使用的协议是什么?
import inet.common.lifecycle.NodeStatus;
import inet.linklayer.contract.IWiredNic;
import inet.linklayer.contract.IWirelessNic;
import inet.linklayer.loopback.LoopbackInterface;
import inet.mobility.contract.IMobility;
import inet.networklayer.contract.IRoutingTable;
import inet.networklayer.common.InterfaceTable;
import inet.networklayer.contract.INetworkLayer;
import inet.power.contract.IEnergyStorage;
import inet.power.contract.IEnergyGenerator;
import inet.applications.contract.IPingApp;
import inet.applications.contract.ISCTPApp;
import inet.applications.contract.ITCPApp;
import inet.applications.contract.IUDPApp;
import inet.transportlayer.contract.ISCTP;
import inet.transportlayer.contract.ITCP;
import inet.transportlayer.contract.IUDP;
import inet.node.inet.INetworkNode;
module WirelessHostEx like INetworkNode
{
parameters:
@networkNode;
@display("i=device/wifilaptop");
@labels(wireless-node);
bool hasStatus = default(false);
int numExtInterfaces = default(0);
int numRadios = 1;
int numTunInterfaces = default(0);
string mobilityType = default(numRadios > 0 ? "StationaryMobility" : "");
string networkLayerType = default("IPv4NetworkLayer");
string routingTableType = default("IPv4RoutingTable");
bool forwarding = default(true);
bool multicastForwarding = default(false);
string energyStorageType = default("");
string energyGeneratorType = default("");
routingTable.forwarding = forwarding;
routingTable.multicastForwarding = multicastForwarding;
*.interfaceTableModule = default(absPath(".interfaceTable"));
*.routingTableModule = default(routingTableType != "" ? absPath(".routingTable") : "");
*.energySourceModule = default(energyStorageType != "" ? absPath(".energyStorage") : "");
*.mobilityModule = default(mobilityType != "" ? absPath(".mobility") : "");
int numTcpApps = default(0);
int numUdpApps = default(0);
int numPingApps = default(0);
bool hasTcp = default(numTcpApps > 0);
bool hasUdp = default(numUdpApps > 0);
string tcpType = default(firstAvailableOrEmpty("TCP", "TCP_lwIP", "TCP_NSC")); // tcp implementation (e.g. ~TCP, ~TCP_lwIP, ~TCP_NSC) or ~TCPSpoof
string udpType = default(firstAvailableOrEmpty("UDP"));
forwarding = default(false); // disable routing by default
networkLayer.proxyARP = default(false);
gates:
input radioIn[numRadios] @directIn;
inout pppg[] @labels(PPPFrame-conn);
inout ethg[] @labels(EtherFrame-conn);
submodules:
status: NodeStatus if hasStatus {
@display("p=50,50");
}
energyStorage: <energyStorageType> like IEnergyStorage if energyStorageType != "" {
parameters:
@display("p=50,100;i=block/plug;is=s");
}
energyGenerator: <energyGeneratorType> like IEnergyGenerator if energyGeneratorType != "" {
parameters:
@display("p=50,150;i=block/plug;is=s");
}
mobility: <mobilityType> like IMobility if mobilityType != "" {
parameters:
@display("p=53,200");
}
networkLayer: <networkLayerType> like INetworkLayer {
parameters:
@display("p=329,287;q=queue");
}
routingTable: <routingTableType> like IRoutingTable if routingTableType != "" {
parameters:
@display("p=53,250;is=s");
}
interfaceTable: InterfaceTable {
parameters:
@display("p=53,300;is=s");
}
lo0: LoopbackInterface {
@display("p=78,406");
}
wlan[numRadios]: <default("Ieee80211Nic")> like IWirelessNic {
parameters:
@display("p=216,406,row,60;q=queue");
}
eth[sizeof(ethg)]: <default("EthernetInterface")> like IWiredNic {
parameters:
@display("p=368,406,row,60;q=txQueue");
}
ppp[sizeof(pppg)]: <default("PPPInterface")> like IWiredNic {
parameters:
@display("p=558,406,row,60;q=txQueue");
}
tcpApp[numTcpApps]: <> like ITCPApp {
parameters:
@display("p=147,54,row,60");
}
tcp: <tcpType> like ITCP if hasTcp {
parameters:
@display("p=147,141");
}
udpApp[numUdpApps]: <> like IUDPApp {
parameters:
@display("p=329,54,row,60");
}
udp: <udpType> like IUDP if hasUdp {
parameters:
@display("p=329,141");
}
pingApp[numPingApps]: <default("PingApp")> like IPingApp {
parameters:
@display("p=635,141,row,60");
}
dummy: DummyLayer {
@display("p=273,350");
}
connections allowunconnected:
radioIn[0] --> { @display("m=s"); } --> wlan[0].radioIn;
// the order of connections is important here
wlan[0].upperLayerOut --> dummy.ifIn;
dummy.upperLayerOut --> networkLayer.ifIn++;
wlan[0].upperLayerIn <-- dummy.ifOut;
dummy.upperLayerIn <-- networkLayer.ifOut++;
networkLayer.ifOut++ --> lo0.upperLayerIn;
lo0.upperLayerOut --> networkLayer.ifIn++;
for i=0..sizeof(ethg)-1 {
ethg[i] <--> { @display("m=s"); } <--> eth[i].phys;
eth[i].upperLayerOut --> networkLayer.ifIn++;
eth[i].upperLayerIn <-- networkLayer.ifOut++;
}
for i=0..sizeof(pppg)-1 {
pppg[i] <--> { @display("m=s"); } <--> ppp[i].phys;
ppp[i].upperLayerOut --> networkLayer.ifIn++;
ppp[i].upperLayerIn <-- networkLayer.ifOut++;
}
for i=0..numTcpApps-1 {
tcpApp[i].tcpOut --> tcp.appIn++;
tcpApp[i].tcpIn <-- tcp.appOut++;
}
tcp.ipOut --> networkLayer.transportIn++ if hasTcp;
tcp.ipIn <-- networkLayer.transportOut++ if hasTcp;
for i=0..numUdpApps-1 {
udpApp[i].udpOut --> udp.appIn++;
udpApp[i].udpIn <-- udp.appOut++;
}
udp.ipOut --> networkLayer.transportIn++ if hasUdp;
udp.ipIn <-- networkLayer.transportOut++ if hasUdp;
for i=0..numPingApps-1 {
networkLayer.pingOut++ --> pingApp[i].pingIn;
networkLayer.pingIn++ <-- pingApp[i].pingOut;
}
}
import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.physicallayer.ieee80211.packetlevel.Ieee80211ScalarRadioMedium;
import inet.node.wireless.AccessPoint;
network WirelessNetwork {
submodules:
configurator: IPv4NetworkConfigurator {
@display("p=33,81");
}
radioMedium: Ieee80211ScalarRadioMedium {
@display("p=33,30");
}
node0: WirelessHostEx {
@display("p=128,121");
}
node1: WirelessHostEx {
@display("p=384,115");
}
ap: AccessPoint {
@display("p=273,54");
}
}
[General]
network = WirelessNetwork
// node0 will send ping to node1
**.node0.numPingApps = 1
**.node0.pingApp[0].destAddr = "node1" // using IP address here is allowed too