




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
OMNeT++模擬器包括一些分層次的嵌入式模型,嵌入式模型的深度是無限的,即允許用C++進(jìn)行編程.OMNeT++模擬器可以在根據(jù)不同的目的來改變用戶接口:調(diào)試、實例和批量執(zhí)行。高級用變量/對象來模擬器的執(zhí)行,這在開發(fā)/調(diào)試模擬器工程師非常有用的,用戶接口也促OMNeTOMNeT++可以利用多種機(jī)制來進(jìn)行用于幾個并聯(lián)的分布式MPI的問題。OMNeT++甚至還可以被用于并行模擬仿真算法的多層次描述,因為模擬器可以在GUIGUIOMNEST是OMNeT++的一個商業(yè)版本,OMNeT++只在學(xué)術(shù)和非性活動免費,在進(jìn)行商業(yè)性研究時需要從Global公司獲得OMNEST證。第[9],[11]進(jìn)一步闡述了,通過解釋如何定制網(wǎng)絡(luò)圖,從產(chǎn)生的方件中,如何寫NED源代[7],[8],[10OMNet++工具提最后[13]OMNet++內(nèi)部結(jié)構(gòu)附錄[14]NED第二章概述模塊之間通過信號在通道上OMNeT++模塊包括分層次的嵌入式模塊,這些模塊通過彼此之間傳輸消息來進(jìn)行通信。OMNeTNEDOMNetC++執(zhí)行簡單模塊.模塊類型可以于文件中,并且可以保證與它實際的用法分別開來,這就意味著用戶可 遲,比特錯誤率和數(shù)據(jù)率,所有三個都是可選的.對每個連接都可以分別指定參數(shù),或者定義類型,在整個網(wǎng)絡(luò)中使用.bit/second,用于計算傳輸一個包的時間.TokenFDDINEDomnetpp.inistring,numericbooleanXMLnumeric使用其他參數(shù)的表達(dá)式以及調(diào)用C函數(shù),不同分類的隨量,和由用戶交互輸入的值.NumericCOMNet++的C++類表示.他們被設(shè)計成有效地共同工作,創(chuàng)建一個有力modules,gates,connectionsetc.containerclasses(e.g.queue,array)datacollectionclassesstatisticanddistributionestimationclasses(histograms,P2algorithmforcalculatinglesetc.)transientdetectionandresultaccuracydetectionclassesGUI,其中所有的仿真內(nèi)在都是可見的.NEDnedNEDGNED消息定義(.msg.OMNet++將消息定C++類.C++文件,.h.ccC++編寫的管理仿真和仿真類庫的代碼,編譯使其形成一個庫文件(擴(kuò)展名為.a.lib).C++編寫的用戶接口,編譯使其形成一個庫文件(擴(kuò)展名為.a.lib).編譯所有的C++源文件,仿真內(nèi)核和用戶的接口庫,形成一個仿真可執(zhí)行文件.NED文件OMNet++,或正在顯示模型文件的omnetpp.ini)這個文件包括設(shè)置,件.OMNet+GUIPlove用OMNet++來處理結(jié)果文件:輸出文件的格式是一個文本文件,可以讀進(jìn)數(shù)學(xué)包像或Octave,OpenOfficeCalc,GnumericMSExcel(許多預(yù)處理將需要OMNet++.輸出標(biāo)量文件使用標(biāo)量工具可視化.它可以畫出柱形統(tǒng)計圖表,x-yVSomnetpp將包括以下的子.(如果你安裝了一個預(yù)處理發(fā)布,將缺少一些,或者會有額外的,比如包括OMNet++綁定的軟件). OMNeT++ OMNeT++可執(zhí)行文 (GNED,nedtool等 手冊(PDF),readme,license HTML幫助文件tictoc-tutorial/介紹使用OMNeT++ 參考的HTMLAPI API參考NEDXML庫 OMNeT++動態(tài)NED文件的文NEDNEDXML在 包括OMNeT++的貢獻(xiàn)內(nèi)容. Emacs顯示NED語法 ,像msvc/,其包括VC++的綜合組件等.3NED語言NED EBNFNEDImport,channel,endchannel,simple,endsimple,module,endmodule,error,delay,datarate,const,parameters,gates,submodules,connections,gatesizes,if,for,do,endfor,network,endnetwork,nocheck,ref,ancestor,true,false,like,input,numeric,string,bool,char,xml,xmldoc.如果你想以數(shù)據(jù)開頭的話面加個下劃線例如 NEDC++語法類似:由雙斜線開始”//”,一直延續(xù)到這行NED可以指定有無.ned擴(kuò)展名的文件名.也能在文件包括路程,或使用NED編譯器令行選項-I<path>指定被導(dǎo)入的文件.例如:import //imports信道定義是詳細(xì)說明類型的特征(屬性).信道名可用于后面的NED描述來創(chuàng)建這些參channelchannelLeasedLinedelay0.0018//secerror1e-8datarate128000//bit/secsimpleSimpleModuleName參數(shù)是屬于模塊的變量.簡單模塊參數(shù)可以被簡單模塊算法使用.例如,TrafficGennumOfMessages,該參數(shù)決定多少消息將被產(chǎn)生.Parameters域列出其名字即可參數(shù).參數(shù)類型可以被指定為:numeric,numericconst(或simplyconst),bool,string,或xml,numericsimpleTrafficGennumOfMessages:const,address:string;gates://...NEDomnetpp.ini,配 ormal(2,0.8),當(dāng)每次從簡單模塊(C++代碼)讀參數(shù)時,剪切2.0正態(tài)分布和標(biāo)準(zhǔn)差為0.8,返回一個新隨機(jī)數(shù).例如,這用于指定產(chǎn)生包或作業(yè)的間隔時間.NumericXMLOMNet++包括了XML解釋器(LibXML,Expat,等), 和驗證文件類型定義的文件(如果XML文檔包括一個DOCTYPE),緩存文件(如果多個模塊 ,只加載一次),通過一個XPath子集符號來選擇文檔的一部分,在類DOM的對象樹中顯示內(nèi)容.這種機(jī)制可以通過NED參數(shù)類型xml和xmldoc()操作.可以通過xmldoc()操作指定xmlXMLXMLNEDomnetpp.inixmlsimpleNetworkInterfaceparameters://...in:fromPort,fromHigherLayer;out:toPort,toHigherLayer;simpleRoutingUnitparameters://...in:out:input[];gatesparameterssubmodulesmoduleCompoundModule所有的域(parametersgates,submodules,connections)復(fù)合模塊的參數(shù)和門與3.4.1與3.4.2中所描述的簡單模塊的參數(shù)和門一樣定義使用.numOfPortsmodulepacketsPerSecond:numeric,bufferSize:numeric,numOfPorts:const;in:inputPort[];out:outputPort[];submodules://...connections:NEDmodulesubmodule1:ModuleType1submodule2:ModuleType2完成的.這個表達(dá)式可以模塊參數(shù).允許模塊數(shù)為0.例moduleCompoundModulesize:const;submod1:submod2:submod3:DistVecRoutingNode,AntNetRouting1Node,AntNetRouting2NodeRoutingTestNetwork,這些將用來測試路由算法.目前RoutingTestNetworkDistVecRoutingNodeNED可以添加一個字符串參數(shù),比如routingNodeType到復(fù)合模塊RoutingTestNetwork,子從字符串常量"DistVecRoutingNodeAntNetRouting1Node"或"AntNetRouting2Node"中模塊,那么仿真開始時得到一個運行時間錯誤:moduletypedefinitionnotfound.RoutingTestNetworkNED,NED幫助:必須命名一個現(xiàn)存的模塊類型(比如RoutingNode),運行的所有模塊中指定的routingNodeTypRoutingNode[以上的方法,與面向?qū)ο笳Z言中的多態(tài)性類似—RoutingNodeDistVecRoutingNodeAntNetRouting1NoderoutingNodeTypemoduleRoutingTestNetworkroutingNodeType:string;//shouldholdthenameofanexistinggates://...node1:routingNodeTypelikeRoutingNode;node2:routingNodeTypelikeconnectionsnocheck:node1.out0-->RoutingNodeCNEDDistVecRoutingNode,AntNetRouting1Node在NED文件中.如果子模塊的模塊類型中含有參數(shù),則可以在子模塊的parameters域給其賦值,所賦值可以使用一個常量(比如42或" parametersNEDmoduleCompoundModuleparam1:numeric,param2:numeric,useParam1:submodule1:Nodep1=p2=p3=useParam1==true?param1:能感的.可以用語法submodule.parametername(或submodule[index].Parametername)來已經(jīng)定義的子模塊參數(shù).在[3.7]詳細(xì)描述了表numCPUs=input(10,"Numberofprocessors?"),//defaultvalue,promptprocessingTime=input(10ms),//prompttextcacheSize=使用gatesizes關(guān)鍵字來定義門向量的大小.門向量大以是常量,參數(shù)或表達(dá)式.simplein:inputs[];out:outputs[];moduleCompoundModulenumPorts:const;node1:inputs[2],outputs[2];node2:Nodeinputs[numPorts],條件參數(shù)和gatesizesgatesizesmoduleparameters:count:const;node:Node[count]position="middle";parametersifindex==0:position="beginning";parametersifindex==count-1:position="end";in[2],gatesizesifindex==0||index==count-1:in[1],in[1];的門,但是很少用).這表示NED不允許多個層次級別進(jìn)行連接—這限制了復(fù)合模型實現(xiàn)連接在復(fù)合模塊定義的onnections:域指定,所列出的所有用分號隔開.moduleCompoundModuleparameters://...gates://...submodules://...node1.output-->node2.input;node1.input<--simplein:out:out[];moduleSmallNetnode:Node[6];node[0].out++-->node[0].in++<--node[1].out++-->node[1].in++<--node[1].out++-->node[1].in++<--node[3].out++-->node[3].in++<--node[4].out++-->node[4].in++<--node[5].out++;node1.outGate-->node2.inGate;node1.outGate-->Fiber-->NEDnode1.outGate-->error1e-9delay0.001-->循環(huán)由for語句創(chuàng)建.fori=0..4donode1.outGate[i]-->node2[i].inGate以上的循 Figure:Loopforfori=0..4,j=0..4dofori=0..3,j=i+1..4fori=0..nnode1.outGate[i]-->node2[i].inGateifi%2==0;if條件計算每個(在上面的例子中,計算每個i的值),每次單獨決定是否創(chuàng)建一個鏈nocheckmoduleRandomConnectionsparameters://..gates://..submodules://..connectionsnocheck:fori=0..n-1,j=0..n-1node[i].out[j]-->node[j].in[i]ifNEDNEDnetworkwirelessLAN:WirelessLAN WirelessLANWirelessHost,WirelessHub表達(dá)式具有C語言風(fēng)格的語法.由常用的數(shù)學(xué)操作符構(gòu)成.可以值傳遞或傳遞參數(shù),調(diào)NumericNumericTimeNumericpropagationDelay=560ms,//0.560sconnectionTimeout=6m30s500ms,//390.5srecoveryIntvl=0.5h;//30min minutes hours daysNEDsubmod.param或submod[index].param.ancestorref.ancestor則更次的模塊將被搜索.ancestor被認(rèn)為是不好的習(xí)慣,因為它破壞了封閉原則而且ref參數(shù)通過獲得傳遞值,意味著運行時參數(shù)的改變將影響到所有按獲取參數(shù)值的ancestor,ref^Cis&|,C/C++更方[會擔(dān)心長整型值不能精確表示雙精度值,這不是問題,IEEE-75452類似的,邏輯運算符&&,||C/C++的內(nèi)部轉(zhuǎn)換原則轉(zhuǎn)換成布爾型,運算完成-,!,unaryminus,negation,bitwise^power-*,/,multiply,divide,+,add,<<,bitwise&,|,bitwiseand,or,not>,greater,greateror<,less,lessor&&,||,logicaloperatorsand,or,theC/C++``inlinesizeof()indexsizeof()是一個有用的運算符,可以獲得向量門的大小.indexin[out[],大小相moduleRouterin:out:out[];port:PPPInterface[sizeof(in)];//onePPPforeachinputgateparameters:interfaceId=1+index;//1,2,3...routing:RoutingUnit;in[sizeof(in)];//onegatepairforeachportfori=0..sizeof(in)-1doin[i]-->port[i].in;out[i]<--port[i].out-->port[i].in<--routing.out[i];xmldoc()運算xmldoc()XMLXMLXMLxmlparam=xmlparamxmldoc("someconfig.xml","/config/profile[@id='2']");OMNeT++XPath1.0從C++代碼中XML元素,像cXMLElement*rooement=cXMLElement類提供了一個類DOM的XML文件.可以通過文檔樹,提取你需要的信息,然后至變量或結(jié)構(gòu)中.cXMLElement在第[6]章詳細(xì)說明.**.interface[*].config=或XMLXPathxmldocXPath.XPath表達(dá)式由pathcomponents(或"steps")組成,之間用"/"或"http://"分隔路徑組件是一個名的元素,"*","."或/usr/bin/gcc),".",".."和"*"分別表示當(dāng)前元素,父元素和任何名的元素0"[@attribute=$param]"形式的謂詞中,$param可以是以下的任意一個$MODULE_FULLPATH,$MODULE_FULLNAME,$MODULE_NAME,$MODULE_ID,$PARENTMODULE_FULLPATH,$PARENTMODULE_NAME,$PARENTMODULE_INDEX,$GRANDPARENTMODULE_FULLPATH,$GRANDPARENTMODULE_NAME,/foo/foo/barfoo>的第一個子元素//barbar>/*/bar–任何名的根元素的第一個子元素/*/*/bar/*/foo[0]/*/foo[1]/*/foo[@color='green']"color"值為"green"的第一個子元素//bar[1]<bar//*[@color='yellow"color"值為"yellow//*[@color='yellow']/foo/bar"color"值為"yellow"第一個XMLXMLsample.xml:<?xmlversion="1.0"encoding="UTF-<traffic-profile<traffic-profile<traffic-profilexmldoc("sample.xml","http://traffic-profile[@id='low']xmldoc("sample.xml","http://traffic-C<math.h>exp(log(),sincos(),floor(),產(chǎn)生隨量的函數(shù):uniform,exponential,normal和其他已經(jīng)討論過的.隨量函數(shù)使用由OMNeT++提供的一個隨機(jī)數(shù)產(chǎn)生器(RNGs).缺省情況下,產(chǎn)生0,但是可OMNeT++uniform(a,b,exponential(mean,normal(mean,stddev, g_d(alpha,beta,參數(shù)為alpha>0,beta>0的g分beta(alpha1,alpha2,alpha1>0,alpha2>0betaerlang_k(k,mean,k>0meanErlangchi_square(k,student_t(i,student-tcauchy(a,b,Cauchya,btriang(a,b,c,a<=b<=c,lognormal(m,s,weibull(a,b,Weibulla>0, Paretoa,b和變化intuniform(a,b,bernoulli(p,Bernoulli0<=p<=1(1p,0binomial(n,p,n>=0geometric(p,negbinomial(n,p,n>0且poisson(lambda,intuniform(0,10)/10//oneof:0,0.1,0.2,...,0.9,1 //exponentialwithmean=5(thusparameter=0.2) //normaldistrwithmean7truncatedto>=2CC++編碼.C+0,1,2,34C++Define_Function()宏登記過.#includedoubleaverage(doublea,double{return}Define_Function(average,2averageaverage()NEDmoduleCompoundparameter:a,b;proc:parameters:av=intlong或其他不是雙精度的類型,可以創(chuàng)建一個函數(shù)通過轉(zhuǎn)換,Define_Function2()宏來登記函數(shù),允許函數(shù)#include<omnetpp.h>longfactorial(int{}staticdouble_wrap_factorial(double{return}Define_Function2(factorial,_wrap_factorial,Example1:Application,RoutingModule,DataLink.假定它們是在將導(dǎo)入的單獨的文件中定義的.import"modules";moduleRouterrteProcessingDelay,rteBuffersize,numOfPorts:const;in:inputPorts[];out:outputPorts[];localUser:Application;routing:RoutingUnitprocessingDelay=rteProcessingDelay,buffersize=rteBuffersize;portIf:PPPNetworkInterface[numOfPorts]retryCount=windowSize=2;fori=0..numOfPorts-1routing.output[i]-->portIf[i].fromHigherLayer;routing.input[i]<--portIf[i].toHigherLayer;portIf[i].toPort-->outputPorts[i];portIf[i].fromPort<--inputPorts[i];routing.output[numOfPorts]-->localUser.input;routing.input[numOfPorts]<--Example2:moduleparameters:count:const;node:Node[count]in[2],gatesizesifindex==0||index==count-1:in[1],out[1];fori=0..count-2node[i].out[i!=0?1:0]-->node[i].in[i!=0?1:0]<--node[i+1].out[0];Example3:simpleBinaryTreeNodein:fromupper;out:downleft;out:moduleBinaryTreeheight:const;node:BinaryTreeNode[2^height-1];connectionsnocheck:fori=0..2^height-2,j=0..2^height-2donode[i].downleft-->node[j].fromupperifj==2*i+1;node[i].downright-->node[j].fromupperifnocheckmoduleBinaryTree2height:const;node:BinaryTreeNode[2^height-1];connectionsnocheck:fori=0..2^(height-1)-2node[i].downleft-->node[2*i+1].fromupper;node[i].downright-->Example4:moduleRandomGraphcount:const,connectedness;//0.0<x<1.0node:Nodegatesizes:in[count],out[count];connectionsnocheck:fori=0..count-1,j=0..count-1donode[i].out[j]-->node[j].in[i]ifi!=j&&fori=0..N-1,j=0..N-1donode[i].out[...]-->node[j].in[...]ifcondition(i,j);RandomGraphcondition(i,j)形成的可以產(chǎn)生任意圖表.例如,當(dāng)產(chǎn)生一個樹結(jié)構(gòu)時,條件會返回是否節(jié)點j是節(jié)點jN更少的N2).以下兩個模式?jīng)]有這個缺點.fori=0..Nnodes,j=0..Nconns(i)-1donode[i].out[j]-->node[rightNodeIndex(i,j)].in[j];HypercubeBinaryTreej.這個模式的適應(yīng)用依賴于用于表示rightNodeIndex(i,j)有多簡單.fori=0..Nconnections-1node[leftNodeIndex(i)].out[...]-->node[rightNodeIndex(i)].in[...];如果leftNodeIndex(i)andrightNodeIndex(i)映射函數(shù)可以用充分地表述,那么系列模塊是這種方法的一個例子,其中映射函數(shù)非常簡單:leftNodeIndex(i)=irightNodeIndex(i)=i+1.這個模式也可以用于創(chuàng)建一個有固定數(shù)量的全圖的任意子圖拓?fù)淠0宀槐葟?fù)合模塊多什么,其中一個或多子模塊類型被作為參數(shù)(使用NED語言的likemeshhypercube,butterfly,perfectshuffle模塊,也可以在仿真的任何地方使用它們.有了拓?fù)淠0?就可以重復(fù)使用interconnection例:這個概念在超立方體互連網(wǎng)絡(luò)中論證過.當(dāng)構(gòu)建一個N立方體時,我們可以充分利用實,其每個節(jié)點都N個其它的節(jié)點,不同的僅僅是節(jié)點索引表示的二進(jìn)制位.Figure:Hypercubehypercube.ned)simpleNodeout:in:in[];moduleHypercubedim,nodetype;node:nodetype[2^dim]likeNodeout[dim],in[dim];fori=0..2^dim-1,j=0..dim-1node[i].out[j]-->node[i#2^j].in[j];//#isbitwiseXOR當(dāng)創(chuàng)建一個實際的超立方體時,替換現(xiàn)有的模塊類型名(比如"Hypercube_PE")nodetypeimport"hypercube.ned";simpleHypercube_PEgates:out:out[];in:in[];networkhypercube:Hypercubedim=nodetype="Hypercube_PE";如果將nodetype參數(shù)放入ini文件,就可以使用相同的仿真模型來測試,又如,在一個超立的值,比如"WormholeRoutingNode","DeflectionRoutingNode"等.Therearesituationswhenusinghand-writtenNEDfilestodescribenetworktopologyisinconvenient,forexamplewhenthetopologyinformationcomesfromanexternalsourcelikeanetworkmanagementprogram.NEDNEDawkperlNED件.Perl也可以擴(kuò)展來SQL數(shù)據(jù)庫,因此如果拓?fù)湓跀?shù)據(jù)庫中也能使用.優(yōu)點是必需的awk或perl程序可以在相對短的時間內(nèi)寫出,它后期的并不昂貴:如果數(shù)據(jù)文件的結(jié)構(gòu)改變,NED創(chuàng)建程序可以簡單地修改.NED文件可以由nedtool轉(zhuǎn)換成C++并且另法就是寫C++代碼,成為仿真可執(zhí)行文件的一部分.代碼會從數(shù)據(jù)文件或數(shù)據(jù)庫來nedtool*_n.cc由于寫代碼比用perl產(chǎn)生NED文件復(fù)雜,當(dāng)仿真程序必須地按產(chǎn)品分類的時候推薦使XMLNED為了增加互用性,NEDXMLNEDXML,NEDDTDXMLNED XML很適合機(jī)器處理.例如,stylesheet轉(zhuǎn)換(XSLT)可以用于從NED文件提取信息,或其他的方法從外部的XML形式表示的信息NED一個XML實際應(yīng)opp_neddocnedtool可以用于在NEDXML間轉(zhuǎn)換.NEDXMLnedtool-x它產(chǎn)生wireless_n.xml.許多轉(zhuǎn)換控制提取XML結(jié)果的內(nèi)容和詳細(xì)資料,以及在輸入時進(jìn)行XMLNEDnedtool-nwireless.xmlwireless_n.ned.nedtoolNEDC++代碼:nedtoolwireless.nednedtoolnedc,nedtool_n.ccC++文件編XMLC++nedtool介紹普通的離散仿真,解釋了在OMNeT++概念中要使用的術(shù)語,給出了概述以及為了說明一些在解釋OMNeT++的概念中要使用的術(shù)語,這個部分先簡短的介紹離散事離散仿“離散”系統(tǒng),即狀態(tài)改變()發(fā)生點在時間域上是離散的,并且發(fā)生并不需要時間.它假設(shè)在兩個連續(xù)之間沒有任何(如沒有任何感覺的)發(fā)生,即系統(tǒng)在兩個之間沒有發(fā)生狀態(tài)改變(與連續(xù)系統(tǒng)相反,其中狀態(tài)改變是連續(xù)的).這些被看成是離散系統(tǒng)的系統(tǒng)可以使用離散仿真模塊化.(其他系統(tǒng)也可以被模塊化為連續(xù)仿 出現(xiàn)的時間通常稱為時間戳;在OMNeT++之間我們通常稱為到達(dá)時間(由于在類CPUCPUinitialize--thisincludesbuildingthemodelandinsertinginitialeventsto{t:=timestampofthiseventprocessevent(processingmayinsertneweventsinFESordeleteexisting}finishsimulation(writestatisticalresults,初始到FES來確保仿真能夠開始.仿真之間的初始化策略各不相同.隨后循環(huán)從FES消耗,并且處理 當(dāng)取消超時時,用戶代碼需從FES中移除.當(dāng)沒有時(在實踐中很少發(fā)生),或由于模型時間或CPU時間達(dá)到了給定的限制或者由于voidvoidhandleMessage(cMessagevoidvoid在初始化階段,OMNeT++構(gòu)建了網(wǎng)絡(luò):創(chuàng)建了需要的簡單和復(fù)合模塊,并根據(jù)NED定義這些模塊.OMNeT++initialize()函數(shù).在處理期間調(diào)用handleMessage()和activity()函數(shù).表示用戶在這些函數(shù)中實現(xiàn)模型的行為.handleMessage()和activity()實現(xiàn)不同的處理策略:對每個簡單模塊,用戶handleMessage()方法.activity()是基于協(xié)同操作的handleMessage()activity()activity()不能很好地度量.在這章的后finishfinish()最典型的使用是在仿真期間收集統(tǒng)計記OMNeT++使用消息來表示.每個都是cMessage或其子類的實例表示;沒有 simime_preisin參數(shù),1和2simtme_precsion更有可能起.FES在離散仿真的實現(xiàn)中,FES的實現(xiàn)是非常關(guān)鍵的.在OMNeT++中,FES實現(xiàn)了binary操作更好,但堆也是我們知道的最好的算法.在感的情況下,FES在cMessageHeap類中傳輸延遲數(shù)據(jù)速率此,n = =(1-nobit特,到達(dá)時間相對接收的最后一比特.(如下圖)Figure:MessageOMNeT++網(wǎng)Figure:Messagesendingovermultiple示,通過一輸出門的消息,””了門的給定時間(被傳輸?shù)臅r間).Figure:Connectionwithadata 注意一些仿真(比如OPNET)分配包隊列至輸(端口),發(fā)送的消息緩存在目的模塊(或鏈如上面[4.1.3]cSimpleModuleC++類,有一 oModule是寫的最簡單的簡單模塊.(我們不考慮initialize()使其更小,但如 o?)注意cSimpleModule是基類,以及Define_Module()行.// #includeclassoModule:public{virtualvoidvirtualvoidhandleMessage(cMessage//registermoduleclasswithOMNeT++void{ev<<"o}voidoModule::handleMessage(cMessage{deletemsg;//justdiscardeverythingwe}//file:oModule.nedsimpleoModulein:in;oModule();//constructortakesnoargumentscSimpleModule本身有兩個構(gòu)造器:cSimpleModule()--一個沒有參數(shù)cSimpleModule(size_tstacksize)handleMessageactivity()模塊.(后面的activity()模塊類方法為一個協(xié)同程序,其需要單獨的CPU堆棧,通常16—32K.這將在handleMessage()0.handleMessage()用于模塊中:oModule::oModule(){...}oModule::oModule():cSimpleModule()activity()16K:oModule::oModule():cSimpleModule(16384){...}VSinitialize()initialize()在仿真開始執(zhí)行的時候調(diào)用,這時每個都已NULLinitialize().initialize()慣例:cancelAndDelete(msg)MyModule(constchar*name,cModule*parentModule,size_tOMNeT++3.2Module_Class_Members()宏被保留,但是擴(kuò)展了新的構(gòu)造器定義.因此Module_Class_Members(OMNeT++3.23.2或以后版本中將產(chǎn)生一個編譯錯誤,說”noappropriateconstructorMyModule(constchar*name=NULL,cModule*parentModule=NULL,size_t在OMNeT++3.2之前發(fā)布的版本中通常有一個特性,非正式地且稍微不正確地稱為”收有的,但沒有被析構(gòu)器回收的仿真對象—如果發(fā)現(xiàn)這些對象,它調(diào)用刪除.GCC++沒有提供方法來探測指針是否對象是數(shù)OMNeT++3.2GC(perform-gc=配置選項,見[8.2.6])GCOMNeT++3.2.為了促成這些處理,OMNeT++在仿真終點丟棄未發(fā)布的對象列表.這個丟棄也可以在配置的時候關(guān)閉//file:FFGenerator.h#include<omnetpp.h>*Generatesmessagesorjobs;seeNEDfileformoreclassFFGenerator:public{cMessagelongnumSent;virtual~FFGenerator();virtualvoidvirtualvoidhandleMessage(cMessage*msg);virtualvoidfinish();//file:FFGenerator.cc#include"FFGenerator.cc"http://registermoduleclasswithOMNeT++{sendMessageEvent=}void{numSent=sendMessageEvent=newcMessage("sendMessageEvent");scheduleAt(0.0,sendMessageEvent);}voidFFGenerator::handleMessage(cMessage{cMessage*m=newcMessage("packet");send(m,"out");doubledeltaT=(double)par("sendIaTime");scheduleAt(simTime()+deltaT,sendMessageEvent);}void{recordScalar("packetssent",}{}//file:FFGenerator.nedsimpleFFGeneratorsendIaTime:numeric;out:out;public方法使用.那么其它模塊就可以調(diào)用這些public方法來得到或設(shè)置值.其它模塊調(diào)InterfaceTableRoutingTable.cSimpleModuleinitialize(),意思是在每個(消息到達(dá))中,我們簡單調(diào)用一個用戶定義的函數(shù).這個函數(shù),handleMessage(cMessage*msgcSimpleModulehandleMessage()時不消耗仿真時間.{retrievefirsteventfromFESt:=timestampofthiseventm:=modulecontainingthiseventif(mworkswithhandleMessage())m->handleMessage(event)else//mworkswithactivity()transferTo(m)}handleMessageactivity()模塊創(chuàng)建開始消handleMessage()模塊通過”自身”initialize()調(diào)度自身消息.handleMessage(),0.這非常重要,因為這用于告知OMNeT++handleMessage(activity().send()scheduleAt()–調(diào)度一個(模塊發(fā)送消息給自己cancelEvent()--scheduleAt()刪除一個調(diào)handleMessage()receivewait()函數(shù),由于他們本質(zhì)是基于協(xié)同工作activity()的章節(jié)中介紹. IDLE/BUSY,initialize()函數(shù)初始化這些變量.由于構(gòu)造器在網(wǎng)絡(luò)安裝階段調(diào)用,模型仍然在調(diào)用之后,handleMessage()本身必須關(guān)注調(diào)用的下一個,使得”信道”不被破壞.如在大多數(shù)情況下比選擇activity()需要activity()中設(shè)計非常復(fù)雜,但其結(jié)果代碼比Example1:classFooProtocol:public{//state//virtualvoidprocessMsgFromHigherLayer(cMessage*packet);virtualvoidprocessMsgFromLowerLayer(FooPacket*packet);virtualvoidprocessTimer(cMessage*timer);virtualvoidvirtualvoidhandleMessage(cMessage//voidFooProtocol::handleMessage(cMessage{if(msg->isSelfMessage())elseif(msg->arrivedOn("fromNetw"))processMsgFromLowerLayer(check_and_cast<FooPacket*>(msg));}processMsgFromHigherLayer(processMsgFromLowerLayerprocessTimer()通Example2:{createandsendoutanewschedulemsgagaintotriggernextcallto}{delete}注意PacketGenerator需要重新定義initialize()來創(chuàng)建m和調(diào)度第一個classGenerator:publiccSimpleModule{Generator():cSimpleModule()virtualvoidvirtualvoidhandleMessage(cMessagevoidGenerator::initialize(){//schedulefirstsendingscheduleAt(simTime(),newcMessage);}voidGenerator::handleMessage(cMessage{//generate&sendpacketcMessage*pkt=newcMessage;send(pkt,"out");//schedulenextcallscheduleAt(simTime()+exponential(1.0),msg);}Example3:burstCounterclassBurstyGenerator:public{intburstLength;intvirtualvoidvirtualvoidhandleMessage(cMessagevoidBurstyGenerator::initialize(){//initparametersandstatevariablesburstLength=par("burstLength");burstCounter=burstLength;//schedulefirstpacketoffirstburstscheduleAt(simTime(),newcMessage);}voidBurstyGenerator::handleMessage(cMessage{//generate&sendpacketcMessage*pkt=newcMessage;send(pkt,"out");//ifthiswasthelastpacketoftheburstif(--burstCounter==0){//schedulenextburstburstCounter=burstLength;}{//schedulenextsendingwithinburstscheduleAt(simTime()+exponential(1.0),msg);}}OMNeT++FSMreceive()–接收消息(wait()send()scheduleAt()–調(diào)度一個(模塊發(fā)送消息給本身cancelEvent()--scheduleAt()刪除一個調(diào)end()activityactivity()也不提倡良好的編程風(fēng)格.{{openconnectionbysendingOPENcommandtotransportlayerreceivereplyfromtransportlayerif(opennot{wait(somecontinue//loopbackto}while(there'smoreto{senddataonnetworkconnectionif(connectionbroken){continueouterloop//loopbacktoouter}wait(somereceivedataonnetworkconnectionif(connectionbroken){continueouterloop//loopbacktoouter}wait(some}closeconnectionbysendingCLOSEcommandtotransportlayerif(closenotsuccessful){//handle}wait(some}}有一些不想使用activity()有情況.如果在activity()函數(shù)中不包括wait(),僅在有限循環(huán)的頂部有一個receive()調(diào)用,那么就沒必要使用activity(),用handleMessage()編寫void{{msg=receive();deletemsg;}}shouldratherbeprogrammedvoidSink::handleMessage(cMessage{delete}Activity()activity(trasferTo(therCorutineotheroroutietherCooutinetransferTofirstCooutinetransfero(firsCoroutie)調(diào)用點繼續(xù)執(zhí)行當(dāng)其它同程序執(zhí)行時該協(xié)同序部的狀態(tài)括局部量都被.這tranfero()OMNeT+transferTo()或其{retrievefirsteventfromFESt:=timestampofthiseventtransferTo(modulecontainingthe}transferTo(main)傳輸控制回仿真內(nèi)核.最初,在仿真開始的時候,activity()的簡單模塊通過仿真內(nèi)核的(''startermessages'')插入至receivewait(),因此,他們的實現(xiàn)在某個地方包含調(diào)用{retrievecurrenteventreturntheevent//remember:events=}{createeventscheduleitat(currentsim.time+waitinterval)retrievecurrentif(currenteventisnote){}deletee//note:actualimpl.reusesevents}因此,initializeOMNeT++FES.OMNeT++有一個內(nèi)置機(jī)制用于檢測是否模塊的棧太小而溢出.OMNeT++也activity()initialize().finish().finish()不能activity(initialize().class{variablesforstatisticscollection{declarelocalvarsandinitializetheminitializestatisticscollectionvariables{}}{recordstatisticsinto}activity(spaghettihandleMessage()替代.SIMULAC++SIM)都是基于協(xié)同程序的,盡管程序模型是MaisiePARSECOMNeT++非常類似.PARSECOMNeT++.initialize()andinitialize()–為許多用戶提供安裝代碼.finish()模塊的initialize()函數(shù)在第一個被處理之前,初始被仿真內(nèi)核置入FES之后調(diào)initialize(initialize()函數(shù)在它的子當(dāng)循環(huán)結(jié)束的時候,僅當(dāng)其正常結(jié)束時(比如非運行時錯誤)調(diào)用finish()函數(shù).調(diào)用initialize()相反:第一個子模塊包含復(fù)合模塊.performsimulationbuild(i.e.thesystemmoduleanditssubmodulesrecursively)insertstartermessagesforallsubmodulesusingactivity()docallInitialize()onsystemmoduleentereventloop//(describedif(eventloopterminatednormally)//i.e.noerrorsdocallFinish()onsystemmodulecleanup{calltouser-definedinitialize()functionif(moduleiscompound)for(eachdocallInitialize()on}{if(moduleiscompound)for(eachsubmodule)docallFinish()onsubmodulecalltouser-definedfinish()function}initializevs.finish()vsfinish(),因此這里并不是每次刪除模塊時清除代碼的最好地方.initialize()提供并不足夠,可以使用多級初始化.模塊有voidinitialize(intstage);intnumInitStages()const;initialize(0)initialize(1initialize(2)等.numInitStages()必須重新定義返回需要的初始級數(shù),例如對兩級初始化,numInitStages()2,initialize(intstage)stage=0和stage=1的情況.[注意numInitStages()為常量,如果你忘記了,通過C++規(guī)則,在基類中創(chuàng)建一個不同的1.]numInitStages(1,缺省的initialize(intstageinitialize().這可以在PARSEC仿真語言的設(shè)計中被.其前面的Maisie使用仿真終止,但是—像voidhandleParameterChange(constcharserviceTimevoidQueue::handleParameterChange(constchar*parname){if(strcmp(parname,{//queueservicetimeparameterchanged,re-readitserviceTime=par("serviceTime");//ifthereanyjobbeingserviced,modifyitsservicetimeif(endServiceMsg->isScheduled()){scheduleAt(simTime()+serviceTime,endServiceMsg);}}}classModifiedTransportProtocol:public{virtualvoidvoid{}有限狀態(tài)機(jī)制(FSM)handleMessage()OMNeT++提供一個類和宏集來構(gòu)建FSM.OMNeTFSMOPNETSDL.OMNeT++檢驗).狀態(tài)改變(傳輸)必須被寫入退出代碼.OMNeT++FSMFSMFSM狀態(tài)被在一個cFSM類型對象中.通過枚舉定義可能的狀態(tài);枚舉也是確切的定義,SLEEP和ACTIVE型,SENDenum{INIT=SLEEP=FSM_Steady(1),ACTIVE=SEND=實際的FSM嵌套在一個類似轉(zhuǎn)換的FSM_Switch()中,其中有進(jìn)入,離開每個狀態(tài)的情{casecasecasecase狀態(tài)轉(zhuǎn)換通過調(diào)用FSM_Goto()來完成,在cFSM對象中簡單地了新的狀態(tài):FSMGenState:leavingstateSLEEPFSMGenState:enteringstateACTIVEFSMGenState:leavingstateACTIVEFSMGenState:enteringstateSENDFSMGenState:leavingstateSENDFSMGenState:enteringstateACTIVEFSMGenState:leavingstateACTIVEFSMGenState:enteringstate為了能夠?qū)崿F(xiàn)以上的輸出,必須在包含omnetpp.h之前#defineFSM_DEBUG.#defineFSM_DEBUG //enablesdebugoutputfromFSMs#includeFSM_Print()來改變輸出格式,提供一個新的定義.#defineFSM_Print(fsm,exiting)(ev<<"FSM"<<<<((exiting)?":leavingstate":":enteringstate<<(fsm).stateName()<<switch().(代碼在cfsm.h中)FSM64我們寫另一個脈沖產(chǎn)生器.其有兩個狀態(tài),SLEEPACTIVE.SLEEPACTIVEFifo2#define#includeclassBurstyGenerator:public{//doublesleepTimeMean;doubleburstTimeMean;doublesendIATime;cPar*msgLength;//FSManditsstatescFSMfsm;enumINIT=SLEEP=FSM_Steady(1),ACTIVE=SEND=//variablesusedinti;cMessage*startStopBurst;cMessage*sendMessage;//thevirtualfunctionsvirtualvoidinitialize();virtualvoidhandleMessage(cMessagevoidBurstyGenerator::initialize(){sleepTimeMean=par("sleepTimeMean");burstTimeMean=par("burstTimeMean");sendIATime=par("sendIATime");msgLength=&par("msgLength");i=0;WATCH(i);//alwaysputwatchesininitialize()startStopBurst=newcMessage("startStopBurst");sendMessage=newcMessage("sendMessage");}voidBurstyGenerator::handleMessage(cMessage{{case//transitiontoSLEEPstatecase//scheduleendofsleepperiod(startofnextburst)case//scheduleendofthisburst//transitiontoACTIVEstate:if(msg!=startStopBurst){error("invalideventinstate}case//schedulenextscheduleAt(simTime()+exponential(sendIATime),sendMessage);case//transitiontoeitherSENDorSLEEPif(msg==sendMessage){}elseif(msg==startStopBurst){}elseerror("invalideventinstate}case{//generateandsendoutjobcharmsgname[32];sprintf(msgname,"job-%d",ev<<"Generating"<<msgname<<endl;cMessage*job=newcMessage(msgname);job->setLength((long)*msgLength);send(job,"out"http://returntoACTIVE}}}OMNeT++仿真模型是一個簡單模塊的集合,其中每個模塊通過消息傳遞彼OMNeT++cMessageC++新建的操作在第[5]cMessage*指針.消息對象也給定了描述名稱(常量char*字符串),通常幫助仿真調(diào)試.消字符串可以在構(gòu)cMessage("token")不必驚奇.send(cMessage*msg,constchar*gateName,intindex=0);send(cMessage*msg,intgateId);send(cMessage*msg,cGate在第一個函數(shù)中,參數(shù)gateName是發(fā)送消息的門名稱.如果這個門是一個向量門,index決index.send(msg,send(msg,"outGates",i);//sendviaintoutGateId=findGate("outGate");{send(newcMessage("packet"),outGateId);}cGateisBusy()和for(inti=0;i<n;{cMessage*copy=(cMessage*)msg->dup();send(copy,"out",i);}deletefor(inti=0;i<n-1;i++) //noten-1insteadofn{cMessage*copy=(cMessage*)msg->dup();send(copy,"out",i);}send(msg,"out",n-1);//sendoriginalonlastnotownerofmessage錯誤.//(re)transmitcMessage*copy=(cMessage*)packet->dup();send(copy,"out");andfinally(whennomoreretransmissionswilldelete為了實現(xiàn)以上的規(guī)則,所有的消息函數(shù)檢驗發(fā)送的消息自身是否實際擁有.如果是其它模塊notowerofmssage.OMNeT++中,可以類似如下實現(xiàn):wait(someDelay);send(msg,"outgate"wait(),定時器機(jī)制在[4.6.7]描述.需sendDelayed(cMessage*msg,doubledelay,constchar*gateName,intindex);sendDelayed(cMessage*msg,doubledelay,intgateId);sendDelayed(cMessage*msg,doubledelay,cGate*gate);參數(shù)與send()相同,除了delay參數(shù).函數(shù)的效果就是為了傳輸間隔,模塊保持消息然后再sendDelayed(msg,0.005,sendDirect(cMessage*msg,doubledelay,cModule*mod,intsendDirect(cMessage*msg,doubledelay,cModule*mod,constchar*gateName,intsendDirect(cMessage*msg,doubledelay,cGate另外消息和延遲,也獲得目的模塊和門.門應(yīng)該是輸,并且不能被.換句話說,通過門,需要指定是驗的:代替在NED文件中的普通域.)cModule*destinationModule=parentModule()->submodule("node2");doubledelay= ormal(0.005,0.0001);sendDirect(newcMessage("packet"),delay,destinationModule,activity()activity(handleMessage()在其參receivereceivecSimpleModulecMessage*msg=receive();cSimpleModule函數(shù)有一個可選的timeout參數(shù).(這是一個delta,不是仿真時間[PutasidereceiveOn(),receiveNew()receiveNewOnOMNeT++OMNeT++3.0simtime_ttimeout=3.0;cMessage*msg=receive(timeoutif{ //handle}{...//process}wait()activity()wait(handleMessage()函數(shù)中使用的wait(delay);在其它的仿真軟件中,wait()通常稱為延遲(hold).wait()receive()之后scheduleAt()wait()在模塊中非常方便,不需要為消息到達(dá)做準(zhǔn)備,比如消{//waitfora(potentiallyrandomamountof)time,//intheinrrivalTimemoduleparameterwait(par("inrrivalTime"));//generateandsend}waitAndEnqueue()返回后處理cQueuewaitAndEnqueue(waitTime,&queue);if(!queue.empty()){//processmessagesarrivedduringwait}函數(shù)發(fā)送消息給自身.scheduleAt(absoluteTime,msg);scheduleAt(simtime()+delta,msg);receivehandleMessage());模塊isSelfMessage()成員函數(shù)來確定是否是自身消息.activity(wait()函數(shù),那么如cMessage*msg=newcMessage();scheduleAt(simtime()+waitTime,msg);cMessage*recvd=receive();if//hmm,someothereventoccurredmeanwhile:isScheduled()FESif(msg->isScheduled())//currently//notRe-schedulingan如果想重新調(diào)度當(dāng)前所調(diào)度的至一個不同的仿真時間,首先需要使用cancelEvent()取FEScancelEvent(msgscheduleAt()FEScancelEvent()會出現(xiàn)錯cMessage*timeoutEvent=newcMessage("timeout");scheduleAt(simTime()+10.0,timeoutEvent);cMessage*msg=receive();if(msg==timeoutEvent){//timeout}{//othermessagehasarrived,timercanbecancellednow:deletecancelEvent(timeoutEvent);}endSimulation()函數(shù)來終止仿真:endSimulation(iniCPU如果檢測到錯誤狀態(tài),想要終止仿真器,cModuleerror().其使用方法printf():iferror("Invalidwindowsize%d;mustbe>=1",4.7模塊參cPar&delayPar=cPar類是一個普通的值對象.支持將類型轉(zhuǎn)換成數(shù)值類型,因此參數(shù)可以如下:intnumTasks=par("numTasks");doubleprocessingDelay=cPar&waitTime=par("waitTime");{wait((simtime_t)waitTime}參數(shù)也可以在執(zhí)行期間通過程序改變.如果參數(shù)是(在NED文件中的修改器),其它例如par("waitTime")=0.12;cPar&waitTime=par("waitTime");waitTime=0.12;符串,其包括了所有的文本形式的值(例如"01.2343.955.467"),然后在簡單模塊中解cStringTokenizernextToken()方法將一個接一個NULL.constchar*str="344213467241";//inputstd::vector<int>numbers;//arraytoholdtheresultcStringTokenizertokenizer(str);constcharwhile((token=tokenizer.nextToken())!=NUL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 多層砌體結(jié)構(gòu)施工方案
- 室外污水施工方案
- 水泥砼道路施工方案
- 援助學(xué)習(xí)資料
- 2025年歷史社區(qū)面試試題及答案
- 2025年張店二模歷史試題及答案
- 6年級下冊文言文學(xué)弈
- 5一6年級讀書卡
- 低溫法蘭標(biāo)識
- cdga數(shù)據(jù)治理工程師教材
- LY/T 2499-2015野生動物飼養(yǎng)場總體設(shè)計規(guī)范
- 愛德華閥門檢修工藝(2)2
- GB/T 13701-1992單標(biāo)準(zhǔn)氣體質(zhì)譜法鈾同位素分析
- AMOLED技術(shù)寶典(十年OLED技術(shù)經(jīng)驗總結(jié))
- 7S稽核查檢表-倉庫
- 小學(xué)科學(xué)《噪音的危害與防治》優(yōu)質(zhì)課件
- 病理學(xué)-第3章 局部血液循環(huán)障礙
- 湖北省黃石市基層診所醫(yī)療機(jī)構(gòu)衛(wèi)生院社區(qū)衛(wèi)生服務(wù)中心村衛(wèi)生室信息
- 打印版醫(yī)師執(zhí)業(yè)注冊健康體檢表(新版)
- 時代與變革-為人生而藝術(shù)
- 人教八年級下冊英語U5Do-you-remember-what-you-were-doing?課件
評論
0/150
提交評論