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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM