一、信道
信道封裝了一些與連接相關聯的行為和參數。預定義的類型: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;