Archive

Archive for the ‘OMNeT++’ Category

OMNeT++ 的仿真流程

March 6th, 2010 leeing 1 comment

Simulation with OMNeT++

用OMNeT++进行仿真的大致流程如下:

  1. 一个OMNeT++模型是用通过交换信息来通讯的组件(模块)来构建的。模块可以嵌套,也就是说,几个模块可以组成一个复合模块。在创建模型时,你需要将系统映射到一个相互通讯的模块体系中。
  2. 用NED语言定义模型的结构。你可以在OMNet++提供的IDE中以文本或图形化方式来编辑NED文件。
  3. 模型的活动组件(简单模块)需要用C++来编程,当中要使用仿真内核及类库。
  4. 提供一个拥有配置和参数的omnetpp.ini文件给模型,一个配置文件可以用不同的参数来描述若干个仿真过程。
  5. 构建仿真程序并运行它。你可以将代码链接到OMNet++的仿真内核及其提供的一个用户接口:命令行和交互式接口或图形化接口。
  6. 仿真结果将写入输出向量和输出标量文件中。你可以使用IDE中提供的分析工具来进行可视化。结果文件是普通的文本,所以你能用R,Matlab或其它工具来进行绘图。

原文在 >> 这里 <<。

Categories: OMNeT++, 计算机网络 Tags:

OMNet++ 10 分钟教程

March 5th, 2010 leeing 3 comments

OMNet++ in a nutshell



本文适合对网络模拟器有一定了解的读者,阅读本文时,最好同时打开用户手册和API文档以便随时查阅。

1. 在omnetpp.org中提到的仿真模型和框架与OMNet++是什么关系?

OMNet++提供了基本的工具和机制来编写仿真代码,但它本身并不提供任何特定用于计算机网络仿真,系统架构仿真和任意其它领域的组件;具体的仿真是由一些仿真模型和框架如Mobility Framework或INET Framework来支持,这些模型独立于OMNet++开发,并有自己的发布周期。

2. OMNet++提供了什么?

一个C++库,它由仿真内核及一些用来创建仿真组件(简单模块和信息)的工具类(如随机数生成,统计收集,拓扑发现等);组装和配置这些组件的基础设施(NED语言,ini文件);运行时用户接口或仿真环境(TKenv,Cmdenv);一个用来设计,运行和评估仿真的IDE环境;实时仿真的扩展接口;MRIP,并行的分布式仿真,数据库连接等等这些组成。

3. OMNet++的仿真模型是什么样的?

OMNet++提供了一个基于组件的架构,模型是由可重用的组件或模块组成的。模块之间可以通过gates(在其它系统中称为ports,即端口)进行连接,以构成复合模块。每个仿真模型是一个复合模块类型的实例。这一层次(组件和拓扑)由NED文件来处理。例如,一个名为EtherMAC的组件可以用NED来描述:

  //
  // Ethernet CSMA/CD MAC
  //
  simple EtherMAC {
      parameters:
          string address; // others omitted for brevity
      gates:
          input phyIn;    // to physical layer or the network
          output phyOut;  // to physical layer or the network
          input llcIn;    // to EtherLLC or higher layer
          output llcOut;  // to EtherLLC or higher layer
   }

它可以使用在下面的Ethernet station的模型中:

  //
  // Host with an Ethernet interface
  //
  module EtherStation {
      parameters: ...
      gates: ...
          input in;    // for connecting to switch/hub, etc
          output out;
      submodules:
          app: EtherTrafficGen;
          llc: EtherLLC;
          mac: EtherMAC;
      connections:
          app.out --> llc.hlIn;
          app.in < -- llc.hlOut;
          llc.macIn <-- mac.llcOut;           llc.macOout --> mac.llcIn;
          mac.phyIn < -- in;           mac.phyOut --> out;
  }

其中,注释能用来生成文档。简单模块,例如上面的EtherMAC,会与一个C++ 文件关联以提供行为,它是以simple关键字来声明的。复合模块则是用module关键字来声明的,为了仿真一个Ethernet LAN,应该创建一个复合模块EtherLAN并用network关键字来表示它可以通过自身运行。


network EtherLAN {
      ... (submodules of type EtherStation, etc) ...
  }

NED文件可以在IDE中以图形化方式或文件模式编辑。

NED文件只定义了模型的结构(拓扑),其行为和模块参数的某个子集则是开放的,如前面所提到的,行为是通过在简单模块相关联的C++代码来定义的,而在NED文件中没有赋值的模块参数则从ini文件中获取它们的值。

Read more…

Categories: OMNeT++, 计算机网络 Tags:

OMNet++ 中的 NED 语言学习(4)

January 31st, 2010 leeing No comments

本节主要是关于信道(channel)的相关知识。

信道封装了与连接关联的参数和行为,信道与简单模块类似,在它们背后就是C++类,在默认情况下,类名与NED的类型名相同,除非有一个@class属性(@namespace也需要注意),例如,下面的信道类型需要一个名为CustomChannel 的C++ 类。

channel CustomChannel // needs a CustomChannel C++ class
{
}

跟简单模块不同的是,一般情况下不需要自己来定义信道类型,只需要从系统中已经预定义好的信道类型进行特殊化即可,内建的类型有: ned.IdealChannel, ned.DelayChannel and ned.Datarate-Channel。 (“ned” 是包名,和Java类似的是可以用import ned.* 来导入所有这三种类型,这样就不用写前缀ned)。

IdealChannel

  • 没有参数,可以让所有数据没有任何延迟地传送。

DelayChannel

  • 有两个参数。
  • delay是一个double类型的参数,代表传播时延,可以用s,ms,us来指定。
  • Disabled是一个布尔值,默认为false,当设为true时,信道对象会丢弃所有的信息。

DatarateChannel

  • 与DelayChannel相比,它有更多的参数。
  • datarate是一个double型的参数,代表信道的数据率,可以用bps,Kbps,Mbps,Gbps来指定,默认值是0,代表无限带宽。
  • ber和per分别代表比特错误率和包错误率,并且允许基本的错误建模。它们是随机生成的范围在0到1之间的数值。通过在包对象中设置一个错误的标记(error flag),接收的模块进行检查并丢弃标记为冲突的数据包。它们的默认值都是0。

注意: There is no channel parameter that would decide whether the channel deliversthe message object to the destination module at the end or at the start of the reception; that is decided by the C++ code of the target simple module. See the setDeliverOn-ReceptionStart() method of cGate.

Read more…

Categories: NED, OMNeT++ Tags:

OMNet++ 中的 NED 语言学习(3)

January 28th, 2010 leeing No comments

本节内容是复合模块,即 Compound modules。

一个复合模块可以拥有gates和参数,但是并没有C++代码与之关联。如果想要为一个复合模块添加代码,可以将代码封装为一个简单模块,然后以子模块的方式来添加到复合模块中。

一个复合模块的声明可以包含若干部分,它们都是可选的:

module Host
{
         types: // 在这里定义内部类型,如模块和信道类型等,仅在本地使用
                   ...
         parameters:
                   ...
         gates:
                   ...
         submodules: // 子模块,可以创建子模块向量,子模块的类型可以来自参数
                   ...
         connections:// 可以通过循环,条件等创建连接,连接的行为可以通过将信道与连接联系来定义,信道的类型也可以来自参数
                   ...
}

复合模块可以通过继承来扩展,继承时不仅可以加入参数和gates,还可以加入新的子模块和新的连接,但是不能对子模块或连接进行“de-inherit”,或者修改所继承的模块或类型。

Read more…

Categories: NED, OMNeT++ Tags:

OMNet++ 中的 NED 语言学习(2)

January 25th, 2010 leeing 1 comment

本节介绍简单模块。

简单模块是在模型中活动的组件,它用关键字 simple 来定义。

simple Queue
{
	parameters:
		int capacity;
		@display("i=block/queue");
	gates:
		input in;
		output out;
}

Parameters和gates部分都是可选的,即是说如果没有parameter或gate的话就可以不写。而且parameters关键字本身也是可选的,就算参数和属性存在也可以忽略它。

NED定义不包含模块的任何操作,操作是用C++来定义的,默认情况下OMNet将查找与NED类型同名的C++类(在这里是Queue)。

可以用@class 属性直接指定C++类,类也可以包括命名空间,如下例使用了mylib::Queue

simple Queue
{
	parameters:
		int capacity;
		@class(mylib::Queue);
		@display("i=block/queue");
	gates:
		input in;
		output out;
}

如果几个模块都在相同的命名空间里,那最好用@namespace代替@class属性,例如下面的例子会自动添加命名空间mylib作为前缀:

@namespace(mylib);
simple App {
	...
}
simple Router {
	...
}
simple Queue {
	...
}

Read more…

Categories: NED, OMNeT++ Tags: