最近需要学习omnet这个软件,先从例程开始,记录一下自己的学习过程和一些疑惑的地方,如果有错误的地方,请大家批评指正。也欢迎大家给我解惑,谢谢!(好多对实例的理解是借助网上的帖子)
完整地运行一个OMNeT++仿真程序,需要有.ned、.cc、.ini三个文件,分别表示网络的拓扑结构、运行程序(C++)和网络的运行入口。
下面的部分以tictoc的18个简单实例学习为主。
Tictoc 1
实现了基本的tic和toc 互相发送消息的功能。包含了基本的消息发送方法。
打开tictoc1.ned、txc1.cc。在tictoc1.ned中,可以看到网络的拓扑结构,在点击左下角source后可以看到用NED语言编写的代码;
simple Txc1
{
gates:
input in;
output out;
}
代码中,simple定义了一个简单模块Txc1,该模块包括一个输入门in和一个输出门out。
network Tictoc1
{
@display("bgb=252,190");
submodules:
tic: Txc1;
toc: Txc1 {
@display("p=114,61");
}
connections:
tic.out --> { delay = 100ms; } --> toc.in;
tic.in <-- { delay = 100ms; } <-- toc.out;
}
定义了名为Tictoc1的网络,网络包括两个子模块tic与toc(继承自Txc1),connections定义了两个模块之间的连接:tic的out门连接到toc的in门,tic的in门连接到toc的out门;中间加了信道,传输延迟为100ms;
在txc1.cc中,定义了网络之间运行的信息传输以及消息处理方法,代码如下:
using namespace omnetpp;
//Txc1类继承cSimpleModule
class Txc1 : public cSimpleModule
{
protected:
// 重写初始化函数以及消息处理函数
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
// The module class needs to be registered with OMNeT++
//所有模块实现时,必须添加Define_Module(xxx)
Define_Module(Txc1);
void Txc1::initialize()
{
// Am I Tic or Toc?
//getName()是获取当前实例的名称,也就是NED中模块实例的名称
if (strcmp("tic", getName()) == 0) {
//定义消息,字符串tictocMsg为消息的名称
cMessage *msg = new cMessage("tictocMsg");
//发送消息,从out门发送
send(msg, "out");
}
}
void Txc1::handleMessage(cMessage *msg)
{
send(msg, "out"); // send out the message
}
using namespace是使用名字空间、strcmp是字符串比较函数,若两个字符串相等,则输出0。其中initialize和handleMessage两个函数分别是初始化和消息处理。Define_Module()是对类和节点进行注册,
右键Run as .ini文件进入仿真界面;点击run即可运行。若要单步运行,可以点击左侧的STEP;若要快速运行,可以点击FAST。结束仿真点击STOP;

Tictoc 2
实现的模块的显示@display
(其中,p:位置 b:形状大小 i:图形 is:图形大小 i2: 小图标 r:显示半径 t:显示文本 tt: 提示)
实现日志的打印输出
(omnet++自带的打印EV)
EV就相当于C++中的cout,在控制台输出,便于调试,例如可以打印某个变量值(如定时器等);注:也可以使用cout,用法如下std::cout << “test”<<std::endl,区别就是使用cout的输出是在工作台,EV输出在仿真界面;
EV << "Sending initial message\n";
EV << "Received message `" << msg->getName() << "', sending it out again\n";