之前学习了OMNeT的安装与运行官方的实例代码,这篇文章记录一下,OMNeT如何创建一个新的项目。
本人为初学者,如有错误望批评指正!
本文原创,创作不易,转载请注明!
打开OMNeT的安装根路径,打开mingwenv.cmd
,输入omnetpp
,打开omnet ide。
左上角 File
– New
– OMNeT++ Project...
,然后输入一个项目名称,然后Next
,然后选择 – Empty project with 'src' and 'simulations' folder
– Finish
.
开始我们新建一个cc文件,src
– New
– Source File
然后在弹出来的界面输入 test.cc
新建一个cc文件来实现简单模块的功能
然后我们输入以下代码:
/*
* test.cc
*
* Created on: 2022年4月21日
* Author: Ronglin
*/
#include //字符串功能函数
//这两行代码固定
#include //必要的头文件导入
using namespace omnetpp; //使用命令空间omnetpp
/**
*创建一个test类,此类继承cSimpleModule
*在网络中,我们新建的tic和toc模块都是Test1对象 由omnet++在模拟开始时创建
*同时我们要重写虚函数initialize()和handleMessage(cMessage *msg)方法
*来实现我们的自定义功能
*/
class Test1 : public cSimpleModule
{
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
//要将Test1类注册到工程中
Define_Module(Test1);
/**
*重写初始化函数
*初始化函数主要是实现在一个模块刚创建时要完成的逻辑功能
*在本函数中,实现的逻辑功能为
*如果本模块的名称为"tic"则创建一条Message并通过out口发送
*/
void Test1::initialize()
{
if (strcmp("tic", getName()) == 0) {
cMessage *msg = new cMessage("tictocMsg");
send(msg, "out");
}
}
/**
*此方法主要是当收到消息的时候
*本模块应执行的逻辑功能
*在本函数中,实现的逻辑功能为
*收到消息之后,将消息通过out口发送出去
*/
void Test1::handleMessage(cMessage *msg)
{
send(msg, "out");
}
简单讲解一下,按照也可以对照注释查看,首先要定义一个类,然后此类要继承自 cSimpleModule
类然后重写函数 initialize()
和 handleMessage(cMessage *msg)
,同时要注意将类注册到omnet中。
写完之后build一遍,菜单栏 – Projec
– Build Project
没有报错即可完成。
为了方便复制这里先搞一份没有注释的
#include
using namespace omnetpp;
class Test1 : public cSimpleModule
{
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
Define_Module(Test1);
void Test1::initialize()
{
}
void Test1::handleMessage(cMessage *msg)
{
}
然后就是配置文件的修改,主要是两个文件,一个是 omnetpp.ini
,还有一个是ned文件,都在 simulations
文件夹下。
这个文件需要改的地方比较少,只需要输入网络(Network)名称即可,我这里叫 test_network
点开 simulations
文件夹下的 package.ned
文件,接下来,我们来创建一个网络。
首先提供GUI模式下的创建网络
点开package.ned
,在右侧 Type
选择第三个 Network
,点击一下,然后鼠标移动到左侧,再点击一下,即可创建出来一个网络。
对着新创建的网络右键,第一个 Properties...
,这里可以设置这个网络的名称,图标,位置等等,我们只需要修改一下名称即可,效果如图,此名称要对应omnetpp.ini
中的网络名称。
然后就要创建模型,点开下面的 Source
,然后输入代码,用来定义模型的门结构
simple Test1
{
gates:
input in;
output out;
}
然后点回Design
,鼠标点住 Test1
,往网络中的灰框框拖动,因为需要两个,我们拖动两次。
然后,选中灰框框里边的 Test1
,右键 , 第一个 Properties...
,只需要更改Name,我这里一个叫tic
,一个叫toc
。
然后建立连接,右侧 palette
– Connection
,然后点击tic
再点击toc
,然后选择tic.out-->toc.in
,建立了一条从tic
到toc
的连接路线,连接建立后,因为还需要设置延时,选中线,右键,Properties...
– Type
选择 DelayChannel
– OK
如图。
然后设置延时时间,选中线,右键 – Parameters...
,然后点击 Value
,输入 100ms
然后 ok。
因为是tic和toc的双向通信,我们需要连接两次,同理,从toc
再点击tic
建立双向连接,再设置延迟,完成后如下图:
至此,一个简单的工程创建完毕。
然后点击工具栏的 Run
然后弹出来一个新的界面,再点击一次 Run
可以看到消息的传递了
有的时候GUI虽然直观但是修改属性找起来很麻烦,直接用代码简单,这里直接附上tictoc1
的 ned代码
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
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("bgb=641,262");
submodules:
tic: Txc1 {
@display("p=98,146");
}
toc: Txc1 {
@display("p=381,61");
}
connections:
tic.out --> { delay = 100ms; } --> toc.in;
tic.in <-- { delay = 100ms; } <-- toc.out;
}
simple Test1
{
parameters: //定义该模块的参数
gates: // 定义该模块的输入和输出口
}
OMNeT很强大,但是缺点是网络上能查到的资料太少了,只能一步一步的去自己摸索了。