NS2实验代码解析
以IEEE 802.15.4 仿真實驗為例,代碼注釋僅供參考。
#仿真模塊參數(shù)設(shè)置 set val(chan) Channel/WirelessChannel # 設(shè)置信道為無線信道 set val(prop) Propagation/TwoRayGround # 設(shè)置無線參數(shù)模型為兩徑模型l set val(netif) Phy/WirelessPhy/802_15_4 #網(wǎng)絡(luò)接口模型 set val(mac) Mac/802_15_4 #MAC層類型 set val(ifq) Queue/DropTail/PriQueue ;#接口隊列模型。使用被動管理算法 #DropTail,當(dāng)系統(tǒng)沒有空閑緩沖資源時丟棄到達(dá)的分組。PriQueue類是優(yōu)先級隊列,優(yōu)先 #處理路由協(xié)議分組。對隊列中的分組進(jìn)行過濾,刪除那些具有特定目標(biāo)地址的分組。set val(ll) LL #邏輯鏈路子層 模擬數(shù)據(jù)鏈路協(xié)議。設(shè)置MAC包頭部的目的地址 set val(ant) Antenna/OmniAntenna # 天線模型 set val(ifqlen) 150 # 網(wǎng)絡(luò)接口隊列的大小 set val(nn) 7 #移動節(jié)點(diǎn)數(shù) set val(rp) AODV # 設(shè)定無線路由協(xié)議為距離向量路由協(xié)議 set val(x) 50 #拓?fù)浞秶膶?set val(y) 50 #拓?fù)浞秶母?set val(nam) WPAN_MAC.nam #用nam指定WPAN_MAC.nam set val(traffic) ftp # 設(shè)置流量協(xié)議的類型 set appTime1 7.0 # 仿真時間1 set appTime2 7.1 # 仿真時間2 set appTime3 7.2 # 仿真時間3 set appTime4 7.3 # 仿真時間4 set appTime5 7.4 # 仿真時間5 set appTime6 7.5 # 仿真時間6 set stopTime 100 # 定義停止時間 Phy/WirelessPhy set CSThresh_ 8.54570e-07 #CSThresh載波監(jiān)聽的門檻距離 Phy/WirelessPhy set RXThresh_ 8.54570e-07 #RXThresh成功接收數(shù)據(jù)包的門檻 Mac/802_15_4 wpanCmd verbose on #開啟wpanCmd verbose Mac/802_15_4 wpanNam namStatus on #將nam狀態(tài)設(shè)置為開啟(默認(rèn)是關(guān)閉的)proc getCmdArgu {argc argv} { #使用 getCmdArgu設(shè)置參數(shù)global val #調(diào)用全局變量valfor {set i 0} {$i < $argc} {incr i} {set arg [lindex $argv $i] #利用索引建立數(shù)組if {[string range $arg 0 0] != "-"} continue #判斷數(shù)組中是否有”-”set name [string range $arg 1 end] #設(shè)置鍵set val($name) [lindex $argv [expr $i+1]] #設(shè)置值} } getCmdArgu $argc $argv #調(diào)用 getCmdArgu函數(shù) #初始化全局變量 set ns [new Simulator] #創(chuàng)建Simulator對象,模擬過程的事件調(diào)度 set tracefd [open WPAN_MAC.tr w] #創(chuàng)建并以只寫的方式打開tr文件 #記錄nam的trace數(shù)據(jù) $ns trace-all $tracefd #調(diào)用tcl函數(shù)trace-all將創(chuàng)建的文件的操作句柄傳遞給tcl變量 if { "$val(nam)" == "WPAN_MAC.nam" } {set namtrace [open ./$val(nam) w] #創(chuàng)建并以只寫的方式打開nam文件$ns namtrace-all-wireless $namtrace $val(x) $val(y) #在50m x 50m 拓?fù)浞秶鷥?nèi) #建立無線nam追蹤 } $ns puts-nam-traceall {# nam4wpan #} #打印nam追蹤信息 set topo [new Topography] #建立一個拓?fù)鋵ο?#xff0c;以記錄移動節(jié)點(diǎn)在拓?fù)鋬?nèi)移動的情況 $topo load_flatgrid $val(x) $val(y) #拓?fù)涞姆秶莤×y(50m x 50m) set god_ [create-god $val(nn)] #建立一個god對象來對路由協(xié)議做性能評價,創(chuàng)建了 #nn個移動節(jié)點(diǎn),nn值為7 set chan_1_ [new $val(chan)] #創(chuàng)建無線信道對象#配置節(jié)點(diǎn) $ns node-config -adhocRouting $val(rp) \ #設(shè)置無線節(jié)點(diǎn)參數(shù)-llType $val(ll) \ #設(shè)置移動節(jié)點(diǎn)的鏈路層-macType $val(mac) \ #設(shè)置移動節(jié)點(diǎn)的MAC層-ifqType $val(ifq) \ #設(shè)置移動節(jié)點(diǎn)的隊列類型-ifqLen $val(ifqlen) \ #設(shè)置移動節(jié)點(diǎn)的隊列長度-antType $val(ant) \ #設(shè)置移動節(jié)點(diǎn)的天線類型-propType $val(prop) \ #設(shè)置移動節(jié)點(diǎn)的無線信號傳輸模型-phyType $val(netif) \ #設(shè)置移動節(jié)點(diǎn)的物理層-topoInstance $topo \ #設(shè)置移動節(jié)點(diǎn)的拓?fù)鋵ο?span id="ozvdkddzhkzd" class="token operator">-agentTrace OFF \ #設(shè)置是否打開應(yīng)用層的trace-routerTrace OFF \ #設(shè)置是否打開路由的trace-macTrace ON \ #設(shè)置是否打開MAC層的trace-movementTrace OFF \ #設(shè)置是否打開移動節(jié)點(diǎn)位置和移動信息的trace-channel $chan_1_ #設(shè)置移動節(jié)點(diǎn)的無線通信類型for {set i 0} {$i < $val(nn) } {incr i} { #創(chuàng)建節(jié)點(diǎn)set node_($i) [$ns node] #創(chuàng)建節(jié)點(diǎn)$node_($i) random-motion 0 #取消隨機(jī)移動 } #設(shè)置移動節(jié)點(diǎn)的初始位置 $node_(0) set X_ 25 #節(jié)點(diǎn)0 在橫向25m處 $node_(0) set Y_ 25 #節(jié)點(diǎn)0在縱向25m處 $node_(0) set Z_ 0 #節(jié)點(diǎn)0的高度為0 $node_(1) set X_ 20 #節(jié)點(diǎn)1在橫向20m處 $node_(1) set Y_ 16.34 #節(jié)點(diǎn)1在縱向16.34m處 $node_(2) set X_ 15 #節(jié)點(diǎn)2在橫向15m處 $node_(2) set Y_ 25 #節(jié)點(diǎn)2在縱向25m處 $node_(2) set Z_ 0 #節(jié)點(diǎn)2的高度為0 $node_(3) set X_ 20 #節(jié)點(diǎn)3在橫向20m處 $node_(3) set Y_ 33.66 #節(jié)點(diǎn)3在縱向33.66m處 $node_(3) set Z_ 0 #節(jié)點(diǎn)3的高度為0 $node_(4) set X_ 30 #節(jié)點(diǎn)4在橫向30m處 $node_(4) set Y_ 33.66 #節(jié)點(diǎn)4在縱向33.66m處 $node_(4) set Z_ 0 #節(jié)點(diǎn)4的高度為0 $node_(5) set X_ 35 #節(jié)點(diǎn)5在橫向35m處 $node_(5) set Y_ 25 #節(jié)點(diǎn)5在縱向25m處 $node_(5) set Z_ 0 #節(jié)點(diǎn)5的高度為0 $node_(6) set X_ 30 #節(jié)點(diǎn)6在橫向30m處 $node_(6) set Y_ 16.34 #節(jié)點(diǎn)6在縱向16.34m處 $node_(6) set Z_ 0 #節(jié)點(diǎn)6的高度為0 $ns at 0.0 "$node_(0) NodeLabel PAN Coor" #節(jié)點(diǎn)0設(shè)置標(biāo)簽 $ns at 0.0 "$node_(0) sscs startPANCoord" #啟動個域網(wǎng)坐標(biāo) $ns at 0.5 "$node_(1) sscs startDevice 1 0" #0.5秒時啟動節(jié)點(diǎn)1 $ns at 1.5 "$node_(2) sscs startDevice 1 0" #1.5秒時啟動節(jié)點(diǎn)2 $ns at 2.5 "$node_(3) sscs startDevice 1 0" #2.5秒時啟動節(jié)點(diǎn)3 $ns at 3.5 "$node_(4) sscs startDevice 1 0" #3.5秒時啟動節(jié)點(diǎn)4 $ns at 4.5 "$node_(5) sscs startDevice 1 0" #4.5秒時啟動節(jié)點(diǎn)5 $ns at 5.5 "$node_(6) sscs startDevice 1 0" #5.5秒時啟動節(jié)點(diǎn)6 for {set i 0} {$i < $val(nn)} {incr i} {$ns initial_node_pos $node_($i) 4 #定義每個節(jié)點(diǎn)顯示大小為4 } for {set i 0} {$i < $val(nn) } {incr i} {$ns at $stopTime "$node_($i) reset" #100.0s后重置 }#設(shè)置流量 Mac/802_15_4 wpanNam PlaybackRate 3ms #設(shè)置仿真播放速度 $ns at $appTime1 "puts \"\nTransmitting data ...\n\"" #打印Transmitting data ...proc cbrtraffic { src dst interval starttime } {global ns node_ #調(diào)用全部節(jié)點(diǎn)set udp_($src) [new Agent/UDP] #創(chuàng)建UDP Agent 對象發(fā)送端eval $ns attach-agent \$node_($src) \$udp_($src) #將src節(jié)點(diǎn)和發(fā)送端綁定set null_($dst) [new Agent/Null] #創(chuàng)建NULL Agent的客戶端eval $ns attach-agent \$node_($dst) \$null_($dst) #將節(jié)點(diǎn)dst和null_綁定set cbr_($src) [new Application/Traffic/CBR] #添加CBR應(yīng)用,CBR是一個流量發(fā)生器eval \$cbr_($src) set packetSize_ 70 #cbr包的大小為1000eval \$cbr_($src) set interval_ $interval #設(shè)置cbr包的時間間隔eval \$cbr_($src) set random_ 0 #設(shè)置為非廣播包eval \$cbr_($src) attach-agent \$udp_($src) #綁定CBR應(yīng)用到UDP Agent上eval $ns connect \$udp_($src) \$null_($dst) #連接節(jié)點(diǎn)src和dst$ns at $starttime "$cbr_($src) start" #src節(jié)點(diǎn)的cbr包在starttime 發(fā)送 } proc poissontraffic { src dst interval starttime } { #建立惡意數(shù)據(jù)流global ns node_ #全局變量調(diào)用set udp($src) [new Agent/UDP] #創(chuàng)建UDP Agent 對象發(fā)送端eval $ns attach-agent \$node_($src) \$udp($src) #將src節(jié)點(diǎn)和發(fā)送端綁定set null($dst) [new Agent/Null] #創(chuàng)建NULL Agent的客戶端eval $ns attach-agent \$node_($dst) \$null($dst) #將節(jié)點(diǎn)dst和null_綁定set expl($src) [new Application/Traffic/Exponential]#添加expl應(yīng)用eval \$expl($src) set packetSize_ 70 #設(shè)置cbr包的大小eval \$expl($src) set burst_time_ 0 #設(shè)置burst_timeeval \$expl($src) set idle_time_ [expr $interval*1000.0-70.0*8/250]ms #設(shè)置空閑時間 eval \$expl($src) set rate_ 250k #設(shè)置expl包的發(fā)送速率時1Mb/seval \$expl($src) attach-agent \$udp($src) #綁定expl到UDP Agent上eval $ns connect \$udp($src) \$null($dst) #連接節(jié)點(diǎn)src和dst$ns at $starttime "$expl($src) start" #src節(jié)點(diǎn)的cbr包在starttime 發(fā)送 } if { ("$val(traffic)" == "cbr") || ("$val(traffic)" == "poisson") } {puts "\nTraffic: $val(traffic)" #打印Traffic: cbr/Traffic: possionputs [format "Acknowledgement for data: %s" [Mac/802_15_4 wpanCmd ack4data]] #打印ack4data信息$ns at $appTime1 "Mac/802_15_4 wpanNam PlaybackRate 0.5ms" #設(shè)置播放速度$ns at [expr $appTime1 + 0.5] "Mac/802_15_4 wpanNam PlaybackRate 1.5ms"#加快速度$val(traffic)traffic 0 1 0.6 $appTime1 #調(diào)用traffic 函數(shù)$val(traffic)traffic 3 0 0.6 $appTime3 #調(diào)用traffic 函數(shù)$val(traffic)traffic 0 5 0.6 $appTime5 #調(diào)用traffic 函數(shù)$ns at $appTime1 "$ns trace-annotate \"(at $appTime1) $val(traffic) traffic from node 0 to node 1\"" #在nam中插入注釋$ns at $appTime3 "$ns trace-annotate \"(at $appTime3) $val(traffic) traffic from node 3 to node 0\"" #在nam中插入注釋$ns at $appTime5 "$ns trace-annotate \"(at $appTime5) $val(traffic) traffic from node 0 to node 5\"" #在nam中插入注釋Mac/802_15_4 wpanNam FlowClr -p AODV -c tomato #設(shè)置AODV包為tomato色Mac/802_15_4 wpanNam FlowClr -p ARP -c green #設(shè)置ARP包為綠色Mac/802_15_4 wpanNam FlowClr -p MAC -s 0 -d -1 -c navy#節(jié)點(diǎn)0到1的MAC包為navyif { "$val(traffic)" == "cbr" } {set pktType cbr #如果traffic為cbr,則正常傳輸} else {set pktType exp #如果traffic為exp,則進(jìn)行干擾性傳輸}Mac/802_15_4 wpanNam FlowClr -p $pktType -s 0 -d 1 -c blue #節(jié)點(diǎn)0到1的cbr或 #exp包為藍(lán)色Mac/802_15_4 wpanNam FlowClr -p $pktType -s 3 -d 0 -c green4 #節(jié)點(diǎn)3到0為綠色Mac/802_15_4 wpanNam FlowClr -p $pktType -s 0 -d 5 -c cyan4 #節(jié)點(diǎn)3到0為青色 }proc ftptraffic { src dst starttime } {global ns node_ #調(diào)用全部變量ns 、 node_set tcp($src) [new Agent/TCP] #創(chuàng)建TCP Agent 對象發(fā)送端eval \$tcp($src) set packetSize_ 50 #設(shè)置包的大小為50set sink($dst) [new Agent/TCPSink] #創(chuàng)建TCP Agent 對象接收端eval $ns attach-agent \$node_($src) \$tcp($src) #發(fā)送端與節(jié)點(diǎn)src關(guān)聯(lián)eval $ns attach-agent \$node_($dst) \$sink($dst) #接收端與節(jié)點(diǎn)dst關(guān)聯(lián)eval $ns connect \$tcp($src) \$sink($dst) #鏈接TCP發(fā)送端和接收端set ftp($src) [new Application/FTP] #添加FTP應(yīng)用eval \$ftp($src) attach-agent \$tcp($src) #綁定FTP到發(fā)送端上$ns at $starttime "$ftp($src) start" #ftp包發(fā)送時間為starttime } if { "$val(traffic)" == "ftp" } { #如果當(dāng)前數(shù)據(jù)流為ftpputs "\nTraffic: ftp" #打印Traffic: ftpputs [format "Acknowledgement for data: %s" [Mac/802_15_4 wpanCmd ack4data]] #打印ack4data信息$ns at $appTime1 "Mac/802_15_4 wpanNam PlaybackRate 0.20ms"#設(shè)置nam播放速度$ns at [expr $appTime1 + 0.5] "Mac/802_15_4 wpanNam PlaybackRate 1.5ms"#同上ftptraffic 0 1 $appTime1 #調(diào)用ftptraffic 函數(shù),appTime1時節(jié)點(diǎn)0向1發(fā)送數(shù)據(jù)ftptraffic 0 3 $appTime3 #調(diào)用ftptraffic 函數(shù)ftptraffic 0 5 $appTime5 #調(diào)用ftptraffic 函數(shù)$ns at $appTime1 "$ns trace-annotate \"(at $appTime1) ftp traffic from node 0 to node 1\"" #在nam中插入注釋$ns at $appTime3 "$ns trace-annotate \"(at $appTime3) ftp traffic from node 0 to node 3\"" #在nam中插入注釋$ns at $appTime5 "$ns trace-annotate \"(at $appTime5) ftp traffic from node 0 to node 5\"" #在nam中插入注釋Mac/802_15_4 wpanNam FlowClr -p AODV -c tomato #設(shè)置AODV數(shù)據(jù)包為tomato色Mac/802_15_4 wpanNam FlowClr -p ARP -c green #設(shè)置ARP數(shù)據(jù)包為綠色Mac/802_15_4 wpanNam FlowClr -p MAC -s 0 -d -1 -c navy #0-1節(jié)點(diǎn)MAC 包為綠色Mac/802_15_4 wpanNam FlowClr -p tcp -s 0 -d 1 -c blue #0-1節(jié)點(diǎn)cp數(shù)據(jù)包為藍(lán)色Mac/802_15_4 wpanNam FlowClr -p ack -s 1 -d 0 -c blue #1-0節(jié)點(diǎn)ack 數(shù)據(jù)包為藍(lán)色Mac/802_15_4 wpanNam FlowClr -p tcp -s 0 -d 3 -c green4 #0-3節(jié)點(diǎn)tcp數(shù)據(jù)包為綠色Mac/802_15_4 wpanNam FlowClr -p ack -s 3 -d 0 -c green4 #3-0節(jié)點(diǎn)ack 數(shù)據(jù)包為綠色Mac/802_15_4 wpanNam FlowClr -p tcp -s 0 -d 5 -c cyan4 #0-5節(jié)點(diǎn)tcp數(shù)據(jù)包為青色Mac/802_15_4 wpanNam FlowClr -p ack -s 5 -d 0 -c cyan4 #5-0節(jié)點(diǎn)ack數(shù)據(jù)包為青色#定義一個結(jié)束的過程 proc stop {} {global ns tracefd appTime1 val env #引用全局變量$ns flush-trace #清除跟蹤close $tracefd #關(guān)閉追蹤文件set hasDISPLAY 0 #設(shè)置播放器為0foreach index [array names env] {if { ("$index" == "DISPLAY") && ("$env($index)" != "") } {set hasDISPLAY 1 #設(shè)置播放器為1}}if { ("$val(nam)" == "WPAN_MAC.nam") && ("$hasDISPLAY" == "1") } {exec nam WPAN_MAC.nam & #以背景執(zhí)行的方式去執(zhí)行NAM} } $ns at $stopTime "stop" #調(diào)用stop過程 $ns at $stopTime "puts \"NS EXITING...\n\"" #打印NS EXITING... $ns at $stopTime "$ns halt" #調(diào)用halt puts "\nStarting Simulation..." #打印Starting Simulation...#開始仿真 $ns run代碼源文件下載(無需積分)
總結(jié)
- 上一篇: 安全多方计算-入门学习笔记(三)
- 下一篇: 即时库存