第1部分-入门

1.1模型

首先,让我们从一个包含两个节点的“network”开始。节点将做一些简单的事情:一个是节点将创建一个数据包,而两个节点将继续来回传递相同的数据包。我们将节点称为tictoc。稍后,我们将逐步改进此模型,并在每个步骤中引入OMNeT ++功能。

这是您从头开始实施首次仿真所采取的步骤。

1.2设置项目

通过输入omnetpp终端来启动OMNeT ++ IDE 。(我们假设您已经安装了有效的OMNeT ++。如果没有,请安装最新版本,并根据需要咨询_安装指南_。)进入IDE后,从菜单中选择“新建”->“ OMNeT ++项目”。



将出现一个向导对话框。输入tictoc作为项目名称,在询问有关_项目_的初始内容时选择“_Empty _Project”,然后单击“完成”。你将在_Project Explorer中_看到一个空项目。(注意:某些OMNeT ++版本会package.ned在项目中生成文件。我们现在不需要它:通过选择文件并单击Delete删除文件。)

该项目将保存属于我们模拟的所有文件。在我们的示例中,项目由一个目录组成。对于较大的模拟,通常将项目的内容分类到src/simulations/文件夹中,并一般将其放在这两个子文件夹下。

Note 注意!

使用IDE完全是可选的。命令行也上可以使用OMNeT ++的几乎所有功能(某些图形密集型和交互式功能(如序列图浏览和结果绘图)除外)。可以使用任何文本编辑器来编辑模型源文件,并且OMNeT ++提供了用于特殊任务的命令行工具,例如生成文件,将消息文件转换为C ++,结果文件查询和数据导出等。要在没有IDE的情况下继续操作,只需创建一个目录,然后使用您喜欢的文本编辑器在其中创建以下NED,C ++和ini文件。

1.3添加NED文件

OMNeT ++使用NED文件来定义组件并将它们组装成更大的单元,例如网络。我们开始通过添加NED文件来实现我们的模型。要将文件添加到项目中,请在左侧的_项目资源管理器_面板中右键单击项目目录 ,然后 从菜单中选择_NEW->网络描述文件Network Description File(NED 网络描述文件)_。提示您输入文件名时输入tictoc1.ned

创建文件后,可以在OMNeT ++ IDE的“_编辑器”区域_中编辑该文件。OMNeT ++ IDE的NED编辑器有两种模式:“_Design”_和“Source”。您可以使用编辑器底部的标签在它们之间切换。在Design 模式下,可以使用鼠标和右侧的调色板以图形方式编辑拓扑。在_Source模式(源代码模式)_下,可以直接编辑NED源代码文本。在其中一种模式下所做的更改将立即反映在另一种模式下,因此您可以在编辑期间自由地在两种模式之间切换,并选择在更方便的任何一种模式下进行更改。(NED文件是纯文本文件,因此您甚至可以使用外部文本编辑器来编辑它们,尽管您会错过语法高亮显示,内容辅助,交叉引用和其他IDE功能。(那就不用外部编辑器呗!))

切换到“_Source”_模式,然后输入以下内容

  1. simple Txc1
  2. {// 定义一个简单模块
  3. gates:
  4. input in;
  5. output out;
  6. }
  7. //
  8. // Txc1的两个实例(tic和toc)双向连接
  9. // Tic 和 toc 会互相发送信息
  10. //
  11. network Tictoc1
  12. {//定义一个网络模块
  13. submodules:
  14. //网络模块由两个子模块组成吗,子模块的两个组成部分tic,toc
  15. tic: Txc1;
  16. toc: Txc1;
  17. connections:
  18. // 子模块之间的连接,但相箭头表示单向链接,{}中间定义连接的传输延时是100ms
  19. tic.out --> { delay = 100ms; } --> toc.in;
  20. tic.in <-- { delay = 100ms; } <-- toc.out;
  21. }

完成后,切换回_Design_模式。您应该会看到类似以下内容的内容:



文件中的第一个块声明Txc1为简单模块类型。简单模块在NED级别上是原子的(最小模块,不可被拆分了)。它们也是活动组件(意思是组成其他大模块的组件),其行为是用C++实现的。该声明还说 Txc1有一个名为输入的门in和一个名为的输出门out

第二个块声明Tictoc1作为network(网络)。Tictoc1是由两个子模块组装而成的,并且这两个子模块tic,``toc都是Txc1的实例, tic的输出门(gate)连接到toc的输入门(gate),反之亦然。两种方式都有100ms的传播延迟。

笔记

您可以在《OMNeT ++仿真手册》中找到有关NED语言的详细说明 。(也可以在doc OMNeT ++安装目录中找到该手册。)

1.4添加C ++文件

现在,我们需要在C ++中实现Txc1简单模块的功能。txc1.cc通过从项目的上下文菜单中选择“新建”->“源文件”(或从IDE主菜单中选择“_File”->“New”->“File ”)_来创建一个文件名(指定文件夹创建文件,注意填写后缀,不然默认创建.h文件),然后输入以下内容:

  1. #include <string.h>
  2. #include <omnetpp.h>
  3. using namespace omnetpp;
  4. /**
  5. * 类Txc1继承cSimpleModule,在Tictoc1 网络结构中,tic和toc斗士Txc1类的实例,
  6. * 他们在仿真程序开始运行的时候就会被创建
  7. */
  8. class Txc1 : public cSimpleModule
  9. {
  10. protected:
  11. // The following redefined virtual function holds the algorithm.
  12. virtual void initialize() override;
  13. virtual void handleMessage(cMessage *msg) override;
  14. };
  15. // The module class needs to be registered with OMNeT++
  16. // 定义的类Txc1都需要在OMNET++注册后才可以被使用
  17. Define_Module(Txc1);
  18. void Txc1::initialize()
  19. {
  20. // 仿真开始最初运行的程序.
  21. // 引导运行tic-toc-tic-toc进程,
  22. // 其中一个模块需要发送第一条信息,我们让tic先发送。
  23. // 首先判断是tic还是toc
  24. if (strcmp("tic", getName()) == 0) {
  25. // 在out门(gate) 发送第一条信息,我们在message对象中随意发了一个 "tictocMsg"
  26. cMessage *msg = new cMessage("tictocMsg");
  27. send(msg, "out");
  28. }
  29. }
  30. void Txc1::handleMessage(cMessage *msg)
  31. {
  32. // handleMessage()函数:当信息传输到当前module时被唤醒
  33. // 这这个module中的这个函数,我们仅仅从out gate 中发送msg。
  34. // 因为tic和toc都做同样的事情,所以他们会来来回回的互发信息
  35. send(msg, "out"); // 发送 message
  36. }

Txc简单module,由C ++类表示Txc1。的Txc1 类需要继承的OMNeT ++的cSimpleModule类,并需要在OMNeT ++注册Define_Module()宏。

笔记!

忘记Define_Module()定义宏一个常见的错误。如果缺少该内容,则会收到与以下内容类似的错误消息:。"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()"

我们从重新定义两种方法cSimpleModuleinitialize()handleMessage()。它们是从仿真内核调用的:initialize()仅调用一次,handleMessage()在消息到达模块时调用。

在其中,initialize()我们创建一个消息对象(cMessage),然后将其从outgate发送出去。由于此门连接到另一个模块的in门,因此在handleMessage()分配给NED文件中的链接的传播延迟为100ms之后,仿真内核将在以下参数中将此消息传递给另一个模块。另一个模块只是将其发送回去(另一个100毫秒的延迟),因此它将导致来来回回的互相发送一样的信息。

Messages(数据包,帧,作业等)和events(计时器,超时)均由OMNeT ++中的cMessage对象(或其子类)表示。在发送或安排它们之后,它们将由仿真内核保存在“预定事件”或“未来事件”列表中,直到时间到了,并通过handleMessage()传递给modules.

请注意,此模拟中没有内置停止条件:它将永远持续下去。你可以从从GUI手动停止它。(您也可以在配置文件中指定模拟时间限制或CPU时间限制,但在本教程中我们不这样做。)

1.5添加omnetpp.ini

为了能够运行仿真,我们需要创建一个omnetpp.ini文件。 omnetpp.ini告诉仿真程序您要仿真哪个网络(因为NED文件可能包含多个网络),您可以将参数传递给模型,为随机数生成器显式指定种子,等等。

omnetpp.ini使用_File->New->Initialization file (INI)_ 菜单项创建文件。新文件将在_Inifile编辑器中_打开。作为NED编辑器,Inifile编辑器还具有两种模式,即_Form(表单模式)和_Source(代码模式),它们可以编辑相同的内容。前者更适合配置仿真内核,后者更适合输入模块参数。

现在,只需切换到“_Source”_模式并输入以下内容:

  1. [General]
  2. network = Tictoc1

您可以在“_Form”_模式下验证结果:



tictoc2所有后续步骤将共享一个通用的omnetpp.ini文件。

现在,我们已经完成了创建第一个模型的准备,并可以编译和运行它了。

Omnet++学习资源太少,个人翻译不易。您的每一分钱都会给后来的开发者提供帮助!感谢支持。

OMnet++ 初学者教程 第一节 入门的更多相关文章

  1. Android精通教程-第一节Android入门简介

    前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...

  2. 2014年度辛星html教程夏季版第一节

    从今天起开始在博客园开启自己的html教程啦,先从第一节开始把,首先推荐一个网站,就是http:/www.w3cschool.cc,这是一个公开的教学网站,但是它有一个问题,那就是虽然很全面,但是不是 ...

  3. MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件

    MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件 前言 万事开头难,有了<MapSer ...

  4. Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ...

  5. 《进击吧!Blazor!》系列入门教程 第一章 8.部署

    <进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...

  6. 基本教程篇--第一节:InitialSampleDemo.cs介绍

       第一节:InitialSampleDemo.cs介绍         为了讲解方便,我先附上源代码和效果图. 代码如下: using System; using System.Drawing; ...

  7. android内部培训视频_第一节

    声明:本视频为公司内部做android培训时录制的,无任何商业目的.同时鉴于水平有限,可能不符合您的需求,放在这里的目的是提供给公司同事下载,作为培训的一个记录,也作为一个系列教程的自我督促完成的理由 ...

  8. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

  9. 辛星跟您玩转vim第一节之vim的下载与三种模式

    首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...

随机推荐

  1. 23 种设计模式 APP & 23 Design Patterns App

    23 种设计模式 APP & 23 Design Patterns App https://github.com/xgqfrms/23-design-patterns-app https:// ...

  2. HTML5 动画效果的多种实现方式

    HTML5 动画效果的多种实现方式 1.  CSS3 transform + transition https://www.w3.org/TR/css-transforms-1/ https://ww ...

  3. fullstack web projects in action

    fullstack web projects in action web 全栈项目实战 Angular 全栈 Angular + TypeScript + Nest.js + PostgreSQL + ...

  4. Intersection Observer

    Intersection Observer Intersection Observer API https://developer.mozilla.org/en-US/docs/Web/API/Int ...

  5. taro coding specification

    taro coding specification https://nervjs.github.io/taro/docs/spec-for-taro.html 跨平台开发 https://nervjs ...

  6. DOM & Shadow DOM & Virtual DOM

    DOM & Shadow DOM & Virtual DOM What is the difference between Shadow DOM and Virtual DOM? ht ...

  7. Flutter Navigator2.0

    Example 1 import 'package:dart_printf/dart_printf.dart'; import 'package:flutter/material.dart'; cla ...

  8. iframe重定向问题

    sandbox="allow-forms allow-scripts allow-same-origin allow-popups"

  9. 用OkHttpGo和FastJson获取OneNET云平台数据(解析嵌套数组)

    JSON数据格式有两种,一种是 { } 大括号表示的JSON对象,一种是 [ ] 中括号表示的JSON数组.从OneNET获取到的数组是这样的,并用Json解析网址查看https://jsonform ...

  10. 微信小程序:列表渲染

    wx:for,(wx:for-item,wx:for-index),wx:key. 列表循环包括数组循环和对象循环 一.数组循环 此时控制台报错如下:属性"wx:key"可以提高性 ...