概述
基于OMNET++仿真平台的正方形网络仿真
- 实验要求
- 实验环境
- 建立工程
- 大致思路
- 实验准备
- 参考代码
- 类定义
- 注册模块
- 查看完整原文
实验要求
以讲解的tictoc网络模型为例,建立一个TicToc正方形网络模型,如下图所示,网络节点是正方形的四个节点,均为Tic模块的实例,节点周期性的产生数据包,数据包通过输出门发送到相连的邻接点,
当节点产生的数据包又回到发送节点时,删除该数据包。当某个节点产生的数据包个数等于100时,结束网络仿真过程,统计各节点产生、发送、接受的数据包个数。
实验环境
- Win10 1909
- OMNeT++ 5.5.1
- VSCode
建立工程
首先我们需要做一些实验前的准备工作。点击这里去之前的我的一篇博客记录了OMNeT的安装以及如何开始上手一个简单的工程。这里我不再重复造轮子。
大致思路
首先我们需要一个我们模块的类,这个类public继承自cSimpleModule。根据实验的要求,我们需要设计三个整型变量来分别对各节点产生、发送、接受的数据包个数进行统计。三个函数分别用作初始化(initialize),转发消息(forwardMessage),处理收到的消息(handleMessage)。
在initialize()函数里我们对四个节点进行定时发送,按照周期性的要求,也可以初始化的时候同时发送数据包(消息)。当一个节点收到消息的时候,就进到处理消息函数里,在handleMessage()函数里我们判断一个收到的消息是不是自己发的消息,如果是,那么就销毁刚刚收到的这个消息,并且又开启新一轮的发送消息。
四个节点都是如此,循环直到节点的createcount达到100就停止。
一个很随意的流程图如下:
当然,思路很简单。引用屈博士的话,“说谁不会说”。俗话说,纸上谈来终觉浅,绝知此事要躬行。Talk is cheap ,Show me the code.
实验准备
- .cc文件是对所有模块生效的代码,不是只对特定的某一个模块或者节点生效。
- 删除网络中的所有消息可以结束仿真,调用endSimulation()函数也可以结束仿真。
- 在win10下,如果按下开始仿真任务栏有图标但是没有界面,可以尝试外接一个显示器。
- 提示access denied是因为已经存在一个仿真界面,需要关闭原有的才能新建一个。
- 在仿真界面的左上角有一个fast图标,可以快速仿真到仿真结束。
- 对变量传参到WATCH()函数,可以在仿真时较为直观观察变量的值。
- 数据包和消息(Message)是一个意思。
- EV相当于cout。
- send(msg, “out”)函数只是把消息推送到out门,出了门后消息具体怎么走不属于它管。
- NED文件描述消息出门后具体路线。
参考代码
我们以Txc13作为demo,来完成这一次实验。
类定义
部分参考代码如下:
class Txc13 : public cSimpleModule
{
private:
int createcount;
int sendcount;
int receivecount;
protected:
virtual TicTocMsg13 *generateMessage();
virtual void forwardMessage(TicTocMsg13 *msg);
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
createcount,sendcount,receivecount分别对应各节点产生、发送、接受的数据包个数。
generateMessage()函数是用来产生消息,返回一个TicTocMsg13类型的消息对象。
TicTocMsg13定义如下:
class TicTocMsg13 : public ::omnetpp::cMessage
{
protected:
int source = 0;
int destination = 0;
int hopCount = 0;
private:
void copy(const TicTocMsg13& other);
protected:
// protected and unimplemented operator==(), to prevent accidental usage
bool operator==(const TicTocMsg13&);
public:
TicTocMsg13(const char *name=nullptr, short kind=0);
TicTocMsg13(const TicTocMsg13& other);
virtual ~TicTocMsg13();
TicTocMsg13& operator=(const TicTocMsg13& other);
virtual TicTocMsg13 *dup() const override {return new TicTocMsg13(*this);}
virtual void parsimPack(omnetpp::cCommBuffer *b) const override;
virtual void parsimUnpack(omnetpp::cCommBuffer *b) override;
// field getter/setter methods
virtual int getSource() const;
virtual void setSource(int source);
virtual int getDestination() const;
virtual void setDestination(int destination);
virtual int getHopCount() const;
virtual void setHopCount(int hopCount);
};
在这里我们可以调用函数设置或者获取跳数,目的节点等信息。后面会用到里面的部分函数。
注册模块
这一步很简单但是很重要。
Define_Module(Txc13);
提示;上面的图片是我使用的其他图床,不是csdn的。如果图片查看不了,请移步到我的博客查看。地址是:https://stefancharles.xyz/
查看完整原文
这里不提供全文。需要全文查看请移步我的自搭建博客:
Stefan的博客
本文地址在这里
最后
以上就是安详花卷为你收集整理的基于OMNET++仿真平台的正方形网络仿真的全部内容,希望文章能够帮你解决基于OMNET++仿真平台的正方形网络仿真所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复