omnet++:cMessage、cSimpleModule、cGate
阅读原文时间:2023年07月10日阅读:7

cMessage

Message可以被调度(self-message)、取消、从一个Gate发送出去、直接发给另一个module;所有以上,都是通过cSimpleModule来实现的。

Message在创建时可以指定名字,其它信息包括消息类型、优先级、时间戳。控制信息字段允许我们使用模型模拟协议层间的通信。context pointer字段允许我们在同一时间是用多个计时器。一个Message中也存储了关于该消息的最后一次发送的信息,例如发送时间、到达时间、到达的module和gate。

isSelfMessage可以帮助我们区分self-message和来自其他节点的消息。

如果需要一些更多的字段,可以通过msg文件创建一个Message,它会自动继承cMessage的相关方法。

方法(msg->xxx())

说明

setName(const char *)

设置消息名

const char * getName()

返回消息名

dup()

返回消息的副本;

cMessage * copy = msg->dup();

int getSenderModuleId()

获得发送该消息的Module的ID

int getSenderGateId()

获得发送该消息的Gate的ID

int getArrivalModuleId()

获得该消息将要到达的Module的ID

int getArrivalGateId()

获取该消息将要到达的Gate的ID

bool isSelfMessage()

判断消息是否是SelfMessage

 cModule  * getSenderModule()

获取指向发送该消息Module的指针 

cGate * getSenderGate()

返回一个指针,指向该消息上一次发送时的gate

cModule * getArrivalModule()

返回指向该消息到达Module的指针

cGate * getArrivalGate()

返回一个指针,指向该消息从哪个Gate到达

bool arrivedOn(int gateId)

bool arrivedOn(char * gateName , int gateIndex)

如果该消息通过给定的gate到达了,就返回true

long getId()

获取消息ID

virtual const char * getDisplayString()

展示消息在运行时的显示String

void setArrival(int moduleId,int gateId)

定制调度器,直接由调度器设置消息要到达的模块和Gate

cModule

cModule是cSimpleModule的父类,cSimpleModuel在cModule的基础上添加了许多方法。

方法

说明

virtual void setName(const char * s)

给Module命名

virtual const char * getFullName()

返回Module的全名,格式为:module名[i]

virtual string getFullPath()

返回Module的路径,格式为:网络名.vector名.mudule名[i]

virtual string str() 

重写该方法以添加module ID

virtual cModule * getParentModule() const

返回该Module的父Module,具体分级可以通过getFullPath()方法得到

int getIndex()

获得该module在vector中的索引

getVectorSize()

获得该module所在vector的大小

virtual cModule * getSubmodule(const char * name,int index=-1)

返回指向 通过名字和索引指定 的Module

virtual cModule * getModuleByPath(const char * path)

返回通过 module路径指定的Module 的指针

virtual int gateSize(const char * gatename)

返回gate vector的size

virtual void arrived(cMessage * msg , cGate * ongate , simtime_t)

与send()方法相对应的方法,不过是在另一个Module中调用的。

virtual cCanvas *getCanvas()

返回这个Module的默认canvas

cSimpleModule

主要方法有四个initialize()、handleMessage(cMessage * msg)、finish()

initialize():omnet++在创建一个Module时调用该方法。

handleMessage(cMessage * msg):当Module收到一个Message时调用该方法。

我们可以使用send()方法向另一个Module发送消息,或者使用scheduleAt()和cancelEvent()方法来部署延迟、计时器、超时。

finish()函数当仿真成功结束时被调用。该方法的经典用法是记录下载仿真过程中的统计信息。

方法

说明

virtual void setName(const char * s)

给Module命名

virtual const char * getFullName()

返回Module的全名,格式为:module名[i]

virtual string getFullPath()

返回Module的路径,格式为:网络名.vector名.mudule名[i]

virtual string str() 

重写该方法以添加module ID

virtual cModule * getParentModule() const

返回该Module的父Module,具体分级可以通过getFullPath()方法得到

int getIndex()

获得该module在vector中的索引

getVectorSize()

获得该module所在vector的大小

virtual cModule * getSubmodule(const char * name,int index=-1)

返回指向 通过名字和索引指定 的Module

virtual cModule * getModuleByPath(const char * path)

返回通过 module路径指定的Module 的指针

virtual int gateSize(const char * gatename)

返回gate vector的size

virtual void arrived(cMessage * msg , cGate * ongate , simtime_t)

与send()方法相对应的方法,不过是在另一个Module中调用的。

virtual cCanvas *getCanvas()

返回这个Module的默认canvas

virtual void handleMessage(cMessage * msg)

消息处理函数,当有消息到达时被调用

virtual void send( cMessage * msg , const char *gatename , int gateindex=-1)

从指定gate把消息发送出去

virtual sendDelayed(cMessage * msg, simtime_t delay,const char * gatename , int gateindex=-1 )

延迟delay秒后把消息发送出去

void sendDirect(cMessage * msg,simtime_t propagation Delay,simtime_t duration,cModule * mod,const char * inputGateName , int gateindex=-1)

直接把一个消息发送到其他Module,

void scheduleAt(simtime_t t,cMessage * msg)

发送一个self-message

cMessage * cancelEvent(cMessage * msg)

移除一个消息。常用于我们之前用scheduleAt()部署的消息,用来取消一个计时器

void cancelAndDelete(cMessage * msg)

对msg调用cancelEvent(),之后删除它。该方法常用于SimpleModule的析构函数中,用于销毁self-message

void wait(simtime_t time)

等待一段时间。

只用于我们不希望其他消息在这段时间内到达的时候。

cGate

代表了一个Module的gate。

cGate对象被Module创建并管理,使用者通常不会直接创建和销毁cGate。

const char * getName()

返回gate的名字,不包含索引

const char * getFullName()

返回gate的全名,包含索引

cObject * getOwner()

返回gate的所属Module

cModule * getOwnerModule()

指向gate所属Module

int getIndex()

返回gate的索引号

int getVectorSize()

返回gate vector的size

cGate * getPreviousGate()

指向与这个gate相连接的上一个gate

cGate * getNextGate()

指向与这个Gate相连接的下一个Gate