zoukankan      html  css  js  c++  java
  • OMNET++

    一、信道

      信道封装了一些与连接相关联的行为和参数。预定义的类型:ned.IdealChannel, ned.DelayChannel和ned.DatarateChannel。ned是包的名字。

    IdealChannel

    理想型信道,无延时无失真地传输

    DelayChannel

    有两种参数:

    Delay:double类型,代表时延

    Disabled:bool类型,默认值false,当被设定为true时,信道所有消息会被丢弃

    DatarateChannel

    除了Delay,Disabled参数还有些附加参数:

    Datarate:double型,代表信道的带宽,单位是bit/s,kbit/s,Gbit/s

    ber/per:分别表示误比特率和误分组率

    例子:

    channel  C extends ned.DatarateChannel

    {

      datarate=100Mbps;

      delay=10μs;

      ber=1e-10;

    }

    channel DatarateChannel2 extends ned.DatarateChannel

    {

      double length@unit(m);

      delay=this.length/200000km*1s; //基于长度的传播时延

    }

    channel Backbone extends ned.DatarateChannel

    {

      @backbone;

      double cost= default(1); //增加cost参数,可被路由计算法则观察到,并用来做路由选择

    }

    二、参数

    1.值

    参数可以从几个地方获取值:NED代码中,配置文件(omnetpp.ini),甚至是从和用户的交互过程中。

    eg:

    module Node

    {

      submodules:

        app;App{

          sendIaTime=3s;

          packetLength=1024B;//B=byte

          }

          …

    }

    在ini文件中赋的值不能覆盖NED中的赋的值;只要涉及ini文件,就等同于硬编码。硬编码:就是将数据直接写入到代码中进行编译开发,比如在没有mybatits前,将sql语句写入到jdbc代码里,再比如纯jsp开发的过程中,将前端的html代码与java代码耦合,这都是硬编码,如果要发生更改的问题,就需要更改源代码,如果是C/S开发,客户端的软件需要重新下载安装,非常不合理。硬编码就是什么都在你的程序代码里面写死了,你想稍微修改一下效果,都得修改你的代码。举个例子:比如说你做个软件,他有菜单栏,你如果把菜单的标题全部写在代码里,那如果现在要换英文的,你就不得不改变代码。)

    假如参数在NED文件中没有被赋值,可以用以下方法:**.sendIaTime=100ms(代码适用于所有名sendIaTime的参数,无论这些参数属于哪个模块,用**代替详细的描述可以写出多选的赋值。)

    也可以写入包括随机表达式的公式:**.sendIaTime=2s+exponential(100ms)

    如果在ini文件中没有赋值,就会应用默认值。如果没有默认值提供给仿真程序,将对用户进行访问。

    2.表达式

    公式可以用于模块参数、门向量、模块向量尺寸(sizeof)和当前模块在在子模块向量中的索引(index)。

    3.volatile

    相应参数值的表达式在每次被读时都应该被重新评估。

    volatile int i=10;
    int a = i;
    ...
    // 其他代码,并未明确告诉编译器,对 i 进行过操作
    int b = i;
    volatile 指出 i 是随时可能发生变化的,每次使用它的时候必须从 i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。

    4.单位

    变量声明时可以添加@unit特性,并携带度量的单位。

    simple App

    {

      parameters:

        volatile double sendIaTime@unit(s)=default(exponential(350ms));

        volatile int packetLength@unit(byte)=defult(4KB);

        …

    }

    子类或者子模块的定义中,参数不能加入或不考虑数的@unit特性。

    5.XML参数

    可扩展标记语言

    三、重链接

    循环结构

    module Chain

    {

      parameters:

        int count;

      submodules:

        node[count]:Node{

      gates:

        port[2];

      }

      connections allowunconnected:

        for i=0..count-2{

          node[i].port[1]<-->node[i+1].port[0];

        }

    }

    二叉树网络

    simple BinaryTreeNode{

      gates:

        inout left;

        inout right;

        inout parent;

    }

    module BinaryTree{

      parameters:

        int height;

      submodules:

        node[2^height-1]:BinaryTreeNode;

      connections allowunconnected:

      for i=0..2^(height-1)-2{

        node[i].left<-->node[2*i+1].parent:

        node[i].right<-->node[2*i+2].parent;

      }

    }

    随机拓扑

    module RandomGraph{

      parameters:

        int count;

        double connectedness; //0.0<x<1.0

      submodules:

        node[count]:Node{

        gates:

          in[count];

          out[count];

        }

      connections allowunconnected:

        for i=0..count-1,j=0..count-1{

          node[i].out[j]-->node[j].in[i];

            if i != j && uniform(0,1)<connectedness;

         }

    }

     四、作为参数的子模块类型

    network Net6

    {

      parameters:

        string nodeType;

      submodules:

        node[6]:<nodeType>likeINode{   //创建一个子模块向量,类型来自nodeType参数。如果nodeType="SensorNode”,模块向量就会包括传感器节点(存在并具有资格)

        address=index;

        }

      connections:

      …

    }

    缺少的块是likeINode比特。INode必须是一个存在的模块接口,SensorNode模块类型必须实现。

    对应的NED声明如下:

    moduleinterface INode

    {

      parameters:

        int address;

      gates:

        inout port[];

    }

    module SensorNode like INode

    {

      parameters:

        int address;

        …

      gates:

        inout port[];

        …

    }

    五、特性(元数据注释)

    @prop; // file property

    module Example

    {

      patameters:

        @prop;  //module property

        int a @prop=default(1);  //parameter property

      gates:

        output out @prop;

      submodules:

      src: Source{

          parameters:

            @prop;  //submodule property

            count @prop; //adding a property to a parameter

          gates:

            out[] @prop;  //adding a property to a gate

          }

          …

      connections:

        src.out++-->{@prop;} ==>sink1.in;

        src.out++-->c=Channel{@prop;}-->sink2.in;

    }   

     特性总是和类型关联在一起。因为示例的类型是唯一的,所以不能使每个示例具有不同的特性 。

    1.数据模型

    特性可以包括数据,这些数据在圆括号中给出。

    @enum(Sneezy,Sleepy,Dopey,Doc,Happy,Bashful,Grumpy);

    @coords(x=10.31;y=30.2;unit=km);

    @nodeinfo(id=742;labels=swregion;routers;critical);

    2.修改特性

    将一个模块类型作为子类或一个通道类型使用时;可以往模块或者信道上(参数集或门)增加新特性,也能修改已有的特性。

    3.索引

    六、动态模块的创建

    1.模块创建

    (1)寻找对象族

    (2)创建模块

    (3)(如果需要)设置参数和门的大小

    (4)调用函数构建子模块并且完成模块的构建

    (5)调用函数为新建的简单getModule创建激活消息

    cModuleType *moduleType=findModuleType("WirelessNode");  //寻找对象族

    cModule*module=moduleType->creat("node",this);  //创建模块

    module->par("address")=++lastAddress;  //设置参数和门的大小

    module->setGateSize("in",3);  

    module->setGateSize("out",3);

    module->buildInside();  //用函数构建子模块并且完成模块的构建

    module->scheduleStart(simTime());  //调用函数为新建的简单getModule创建激活消息

    2.模块删除

    module->deleteModule;

  • 相关阅读:
    Educational Codeforces Round 80 (Rated for Div. 2)
    寒假集训
    HDU-4609 3-idiots
    部分分式展开法
    线性同余方程组
    爬取哔哩哔哩python搜索结果
    数据可视化练习题
    python正则表达式
    git的安装和基础知识
    python学习计划
  • 原文地址:https://www.cnblogs.com/Duxue/p/13777251.html
Copyright © 2011-2022 走看看