能制作网站的软件,网站建设要素的核心内容,图片类网站怎样做高并发,网站制作 中企动力公司上一篇第一弹介绍了OMNeT是什么以及如何安装OMNeT#xff0c;现在来说一下如何新建一个自己的OMNeT的工程。
在 Omnet安装完成后#xff0c;samples/tictoc 中有该例子的完整文件#xff0c;你可以立刻运行该文件看他是怎么工作的#xff0c;不过更推荐按接下来的步骤一步…上一篇第一弹介绍了OMNeT是什么以及如何安装OMNeT现在来说一下如何新建一个自己的OMNeT的工程。
在 Omnet安装完成后samples/tictoc 中有该例子的完整文件你可以立刻运行该文件看他是怎么工作的不过更推荐按接下来的步骤一步步完成该项目的构建。 开始
模型介绍
创建一个有两个节点的网络其中一个节点会创建一个数据包两个节点会来回传递相同的数据包这两个节点分别叫做 tic和toc 接着我们会逐渐拓展这个模型在这个过程中介绍Omnet的特征。
构建项目
在omnetpp-6.0.3中新建一个文件夹来存储自己的工程。选择File----New----OMNeT Project… 然后选择路径到自己创建的新的文件夹 点击Next之后选择创建一个空项目 添加NED文件
选择右击Learn_1----New----Network Description File(NED) 然后为新建的NED文件命名点击Next然后选择Empty NED file
创建后可以在 OMNeT IDE 的 “Editor”编辑器区域中编辑该文件。
OMNeT IDE 的 NED 编辑器有两种模式Design 和 Source在它们之间使用编辑器底部的选项卡可以进行切换。
在“设计”模式下 可以使用鼠标和右侧的调色板以图形方式编辑拓扑。在源模式下NED源码可以直接编辑为文本。
在一种模式下完成的更改将立即反映在另一种模式中因此您可以 在编辑过程中自由切换模式并在任何模式下进行更改。 上图是已经编辑好的拓扑结构是我搭建的一个网络模型其源码如下
simple Txc1
{gates:input in;output out;
}//
// Two instances (tic and toc) of Txc1 connected both ways.
// Tic and toc will pass messages to one another.
//
network Tictoc1
{display(bgb162,204);submodules:tic: Txc1 {display(p32,163);}toc: Txc1 {display(p126,31);}connections:tic.out -- { delay 100ms; } -- toc.in;tic.in -- { delay 100ms; } -- toc.out;
}文件中的第一个块声明 Txc1作为简单的模块类型。 简单模块在NED级别上是原子的。它们也是有源成分 他们的行为是在 C 中实现的。该声明还说Txc1有一个名为 in 的输入门和一个名为 out 的输出门。 第二个块 Tictoc1 声明为网络。 Tictoc1由两个子模块 tic和 toc 组装而成 两者都是模块 Txc1的实例。tic的输出门连接到toc的输入门反之亦然。 双向传播延迟为 100 毫秒。
注ned语言更详细的介绍见ned语言 在安装完Omnet后再 doc文件夹下也可以找到这些文档
添加C文件 上图中命名为Txc2.cc是因为已经创建了Txc1.cc的文件所以这里通过重新命名来进行演示实际上大家在新建工程时应该命名为Txc1.cc因为这个.cc文件是针对简单模块Txc1的功能定义。
在新建的C文件中输入以下代码
#include string.h
#include omnetpp.husing namespace omnetpp;/*** Derive the Txc1 class from cSimpleModule. In the Tictoc1 network,* both the tic and toc modules are Txc1 objects, created by OMNeT* at the beginning of the simulation.*/
class Txc1 : public cSimpleModule
{protected:// The following redefined virtual function holds the algorithm.virtual void initialize() override;virtual void handleMessage(cMessage *msg) override;
};// The module class needs to be registered with OMNeT
Define_Module(Txc1);void Txc1::initialize()
{// Initialize is called at the beginning of the simulation.// To bootstrap the tic-toc-tic-toc process, one of the modules needs// to send the first message. Let this be tic.// Am I Tic or Toc?if (strcmp(tic, getName()) 0) {// create and send first message on gate out. tictocMsg is an// arbitrary string which will be the name of the message object.cMessage *msg new cMessage(tictocMsg);send(msg, out);}
}void Txc1::handleMessage(cMessage *msg)
{// The handleMessage() method is called whenever a message arrives// at the module. Here, we just send it to the other module, through// gate out. Because both tic and toc does the same, the message// will bounce between the two.send(msg, out); // send out the message
}代码解读
类Txc1 代表了基础模块 Txc1 Txc1是 Omnet中 cSimpleModule 的子类并且使用Define_Module() 函数宏注册到 Omnet中 。如果忘记使用 Define_Module() 将自己新构建的模块宏注册到 Omnet中将会得到如下类似的报错: “Error: Class ‘Txc1’ not found – perhapsits code was not linked in, or the class wasn’t registered with Register_Class(), or inthe case of modules and channels, with Define_Module()/Define_Channel()”在Txc1中重定义了函数 initialize() 和handleMessage() 他们从仿真内核调用 第一个函数仅仿真开始时调用一次第二个函数当有一个消息到达该模块时就会进行调用。在 initialize() 函数中创建了一个消息对象 cMessage 并通过门 out 发送出去. 如果这个门连接到其他模块的 input门 仿真内核将传输这个消息到另一个模块的 handleMessage() 根据 NED文件中的链接有100ms的传播时延。另一个模块将会将其传回构成一个乒乓一般的传播。消息数据包、帧、作业等和事件计时器、超时都是由 OMNeT 中的 cMessage 对象或其子类表示。 发送或调度它们后它们将保持在仿真内核的“计划事件”或“未来事件”列表中直到时间到了他们才会通过 handleMessage()传输到模块。注意这个仿真没有内置停止条件但可以在那个GUI中停止。
添加omnetpp.ini
为了运行这个仿真我们要创建一个 omnetpp.ini文件该文件告诉仿真程序想要仿真的网络是哪一个NED文件可能包括多个网络通过该文件还可以传递参数到模型中显式的为随机数生成器指明seeds等。 该文件命名为omnetpp.ini
注与 NED的编辑器类似ini文件的编辑器也有两个模式Form和Source 前者适合配置仿真内核后者适合输入仿真参数。
现在选择Source输入如下代码
[General]
network Tictoc1现在已经完成了第一个模型的创建接下来准备编译和运行该模型如下图所示 至此第一个工程创建成功
总结 通过该流程的学习我们了解到一个模型的创建包含了三类主要文件 ned 、cpp和ini 。 ned文件构建模块和网络可以通过图形化界面或文本输入构建cpp文件编程各个模块的具体功能ini文件确定运行那个网络或传递参数等。 除了学习到创建各个文件的用途、创建方式、命名规则等。还学习到cMessage 、initialize()函数、handleMessage()函数相关的知识。 进一步学习ned语言可以通过官方文档。在cpp文件中使用 omnetpp.h头文件和 omnetpp命名空间可以进一步学习。
下一篇将开始进行INET框架的安装以及无线网络模型的搭建