OMNet使用消息表示事件的发生,每个事件有cMessage类或者他的子类的一个实例表示,OMNet中没有独立的事件类。消息被从一个模块发生到另外一个模块,意味着“事件发生的地方”就是消息的目的模块,事件发生时的模拟时间就是消息的到达时间
在OMnet中,事件就在简单模块内部发生,也就是说简单模块实现模型的具体行为。用户从cSimpleModule类派生子类来创建简单模块,cSimpleModule类是OMNet类库中的一个类。
一、简单模块的C++实现包括:
1、模块类的声明(派生于cSimpleModule类)
2、模块类型的注册(Define_Module())
3、模块类的实现
模块类的声明和注册语法如下:
class 模块名:public cSimpleModule{ //1
类成员...
};
Define_Module(模块名); //2
二、handleMessage()和activity()
handleMessage()是cSimpleModule的虚拟成员函数,缺省情况下它声明都不做,所以用户必须在自己的模块类下面中添加消息处理代码,改写该函数。
使用handleMessage()的模块不会自动激活,仿真核仅仅为activity()产生激活消息,也就是说,如果用户希望模块自己开始工作,二不是依靠接受其他模块的消息来启动,就必须在initialize()函数中调度自消息(也就是模块内部的事件消息,或者是初始消息),利用initialize()函数中的初始消息来激活对handleMessage()的调用,当然,如果模块仅仅是对来自其他模块的消息做出反应,就不用初始消息。
handleMessage()相比activity()而言,有几大优点:
1、消耗内存小
2、对于状态转换很少或者没有状态转换的模块,用handleMessage()更方便
3、对于状态很多而且是随机的状态转换模块,用handleMessage()比较容易实现
三、initialize()和finish()
首先,所有模块都有initialize()函数,用于模块的初始化,复合模块的Initialize()在其子模块的initialize()被调用之前调用
finish()则主要是仿真结束时记录统计数据,而且只有模块正常结束时菜调用,复合模块与其子模块的finish()调用顺序刚好与initialize()相反。
四、关于消息
自定义消息
自定义消息允许我们根据自己的需要设定具体的消息结构
例如:建立一个MyPacket.msg消息如下
message MyPacket
{
fields:
int srcAddress;
int destAddress;
int hops = 32;
};
使用消息子类编译器处理(dos下进入.msg所在文件夹,命令:opp_msgc + 文件名 即可编译)后可以生成两个文件
1、mypacket_m.h
2、Mypacke_m.cc
3、mypacket_m.h主要包括了mypacket类的声明,而此类中的成员函数等的实现则放在了mypacke_m.cc文件中
可以用opp_nmakemake命令来进行编译和链接