OMNET++ 学习过程记录2
1.先在.cc中声明
class NODE1 : public cSimpleModule
{
}
2.再在.cc中注册
Define_Module(NODE1);写在.cc文件里
3.再在.cc中定义具体函数内容
void NODE1::initialize()
{}
等函数
4.再在.ned中调用
simple NODE1
{
gates:
parameters:
//在这里面就是一些拓扑等可视化的配置
}
实际代码分析:
1.避免使用全局变量,全局变量会阻止并行执行。建议把变量作为private或protected的成员数据封装到简单模块中,并且通过public函数使用。其他模块就可以调用这些public函数来得到或设置值。
2.具体代码结构:
(1)在NODE1.h文件中:
class NODE1: public cSimpleModule
{
//private只能在下述public和protected的函数中使用,外部实例化后也不能直 接调用,除非指针用法
private:
cMessage *sendMessageEvent;
long numSent;
public:
NODE1();//构造函数
virtual ~NODE1();//析构函数
protected:
virtual void initialize();//模块初始化
virtual void handleMessage(cMessage *msg);//消息处理
virtual void finish();//仿真结束
}
(2)在NODE1.cc文件中:
NODE1::NODE1()
{
sendMessageEvent = NULL;//清空事件
}
void NODE1::initialize()
{
numSent = 0;//置0
sendMessageEvent = new cMessage("sendMessageEvent");//创建新事件
scheduleAt(0.0, sendMessageEvent);//发送数据
}
void NODE1::handleMessage(cMessage *msg)
{
ASSERT(msg==sendMessageEvent);
cMessage *m = new cMessage("packet");
m->setLength(par("msgLength"));
send(m, "out");//发送数据回去
numSent++;
double deltaT = (double)par("sendlaTime");
scheduleAt(simTime()+deltaT, sendMessageEvent);
}
void NODE1::finish()
{
recordScalar("packets sent", numSent);
}
NODE1::~ NODE1()
{
cancelAndDelete(sendMessageEvent);
}
(3)在NODE1.ned文件中:
simple NODE1
{
parameters:
volatile double sendlaTime;
gates:
output out;
}
3.代码总结:
(1)handleMessage()会被自动调用,其中与事件/消息相关的函数只有3个:
send();//发送消息至其他模块
scheduleAt();//调度一个事件(模块发送消息给自己)
cancelEvent();//删除一个scheduleAt()调度的事件