wpan_demo4_p.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:12k
源码类别:

通讯编程

开发平台:

Visual C++

  1. ###################################################
  2. #          ZigBee Routing over 802.15.4           #
  3. #                (beacon enabled)                 #
  4. #        Copyright (c) 2003 Samsung/CUNY          #
  5. # - - - - - - - - - - - - - - - - - - - - - - - - #
  6. #           Prepared by Jianliang Zheng           #
  7. #            (zheng@ee.ccny.cuny.edu)             #
  8. ###################################################
  9. # ======================================================================
  10. # Define options
  11. # ======================================================================
  12. set val(chan)           Channel/WirelessChannel    ;# Channel Type
  13. set val(prop)           Propagation/TwoRayGround   ;# radio-propagation model
  14. set val(netif)          Phy/WirelessPhy/802_15_4
  15. set val(mac)            Mac/802_15_4
  16. set val(ifq)            Queue/DropTail/PriQueue    ;# interface queue type
  17. set val(ll)             LL                         ;# link layer type
  18. set val(ant)            Antenna/OmniAntenna        ;# antenna model
  19. set val(ifqlen)         50                         ;# max packet in ifq
  20. set val(nn)             21                         ;# number of mobilenodes
  21. set val(rp)             ZBR                        ;# ZigBee Routing
  22. set val(x) 50
  23. set val(y) 50
  24. set val(nam) wpan_demo4.nam
  25. set val(traffic) mix                        ;# mix/cbr/poisson/ftp
  26. #read command line arguments
  27. proc getCmdArgu {argc argv} {
  28.         global val
  29.         for {set i 0} {$i < $argc} {incr i} {
  30.                 set arg [lindex $argv $i]
  31.                 if {[string range $arg 0 0] != "-"} continue
  32.                 set name [string range $arg 1 end]
  33.                 set val($name) [lindex $argv [expr $i+1]]
  34.         }
  35. }
  36. getCmdArgu $argc $argv
  37. set appTime1          10.3 ;# in seconds 
  38. set appTime2          10.6 ;# in seconds 
  39. set stopTime            100 ;# in seconds 
  40. # Initialize Global Variables
  41. set ns_ [new Simulator]
  42. set tracefd     [open ./wpan_demo4.tr w]
  43. $ns_ trace-all $tracefd
  44. if { "$val(nam)" == "wpan_demo4.nam" } {
  45.         set namtrace     [open ./$val(nam) w]
  46.         $ns_ namtrace-all-wireless $namtrace $val(x) $val(y)
  47. }
  48. $ns_ puts-nam-traceall {# nam4wpan #} ;# inform nam that this is a trace file for wpan (special handling needed)
  49. Mac/802_15_4 wpanCmd verbose on
  50. Mac/802_15_4 wpanNam namStatus on ;# default = off (should be turned on before other 'wpanNam' commands can work)
  51. #Mac/802_15_4 wpanNam ColFlashClr gold ;# default = gold
  52. #Mac/802_15_4 wpanNam NodeFailClr grey ;# default = grey
  53. # For model 'TwoRayGround'
  54. set dist(5m)  7.69113e-06
  55. set dist(9m)  2.37381e-06
  56. set dist(10m) 1.92278e-06
  57. set dist(11m) 1.58908e-06
  58. set dist(12m) 1.33527e-06
  59. set dist(13m) 1.13774e-06
  60. set dist(14m) 9.81011e-07
  61. set dist(15m) 8.54570e-07
  62. set dist(16m) 7.51087e-07
  63. set dist(20m) 4.80696e-07
  64. set dist(25m) 3.07645e-07
  65. set dist(30m) 2.13643e-07
  66. set dist(35m) 1.56962e-07
  67. set dist(40m) 1.20174e-07
  68. Phy/WirelessPhy set CSThresh_ $dist(12m)
  69. Phy/WirelessPhy set RXThresh_ $dist(12m)
  70. # set up topography object
  71. set topo       [new Topography]
  72. $topo load_flatgrid $val(x) $val(y)
  73. # Create God
  74. set god_ [create-god $val(nn)]
  75. set chan_1_ [new $val(chan)]
  76. # configure node
  77. $ns_ node-config -adhocRouting $val(rp) 
  78. -llType $val(ll) 
  79. -macType $val(mac) 
  80. -ifqType $val(ifq) 
  81. -ifqLen $val(ifqlen) 
  82. -antType $val(ant) 
  83. -propType $val(prop) 
  84. -phyType $val(netif) 
  85. -topoInstance $topo 
  86. -agentTrace OFF 
  87. -routerTrace OFF 
  88. -macTrace ON 
  89. -movementTrace OFF 
  90.                 #-energyModel "EnergyModel" 
  91.                 #-initialEnergy 1 
  92.                 #-rxPower 0.3 
  93.                 #-txPower 0.3 
  94. -channel $chan_1_
  95. for {set i 0} {$i < $val(nn) } {incr i} {
  96. set node_($i) [$ns_ node]
  97. $node_($i) random-motion 0 ;# disable random motion
  98. }
  99. set Cm 4
  100. set Lm 3
  101. Agent/ZBR Cm $Cm
  102. Agent/ZBR Lm $Lm
  103. Agent/ZBR BSize calc
  104. set BlockSize [Agent/ZBR BSize]
  105. set cskip0 [Agent/ZBR CSkip 0]
  106. set cskip1 [Agent/ZBR CSkip 1]
  107. set cskip2 [Agent/ZBR CSkip 2]
  108. puts [format "Cm:        %s" $Cm]
  109. puts [format "Lm:        %s" $Lm]
  110. puts [format "BlockSize: %s" $BlockSize]
  111. $ns_ at 0.0 "$ns_ trace-annotate "Cm = $Cm, Lm = $Lm, BlockSize = $BlockSize, CSkip0 = $cskip0, CSkip1 = $cskip1, CSkip2 = $cskip2""
  112. # default is RN+, so only set RN-
  113. source ./wpan_demo4.scn
  114. $ns_ at 0.0 "$node_(0) NodeLabel "PAN Coor""
  115. for {set i 1} {$i < $val(nn)} {incr i} {
  116. set RNType [eval $node_($i) RNType]
  117. if {$RNType == "0"} {
  118. $ns_ at 0.0 "$node_($i) NodeLabel -"
  119. } else {
  120. $ns_ at 0.0 "$node_($i) NodeLabel +"
  121. }
  122. }
  123. $ns_ at 0.0 "$node_(0) sscs startCTPANCoord 1" ;# startCTPANCoord <txBeacon=1> <BO=3> <SO=3>
  124. $ns_ at 0.3 "$node_(1) sscs startCTDevice 1 1"  ;# startCTDevice <isFFD=1> <assoPermit=1> <txBeacon=0> <BO=3> <SO=3>
  125. $ns_ at 1.3 "$node_(9) sscs startCTDevice 1 1"
  126. $ns_ at 1.7 "$node_(13) sscs startCTDevice 1 1"
  127. $ns_ at 2.3 "$node_(19) sscs startCTDevice 1 1"
  128. $ns_ at 3.3 "$node_(2) sscs startCTDevice 1 1 1"
  129. $ns_ at 3.5 "$node_(7) sscs startCTDevice 1 1 1"
  130. $ns_ at 3.6 "$node_(11) sscs startCTDevice 1 1 1"
  131. $ns_ at 3.8 "$node_(16) sscs startCTDevice 1 1 1"
  132. $ns_ at 4.3 "$node_(3) sscs startCTDevice 0 0"
  133. $ns_ at 4.5 "$node_(6) sscs startCTDevice 1 1"
  134. $ns_ at 4.8 "$node_(12) sscs startCTDevice 1 0"
  135. $ns_ at 5.1 "$node_(17) sscs startCTDevice 1 0"
  136. $ns_ at 5.6 "$node_(20) sscs startCTDevice 1 1"
  137. $ns_ at 5.8 "$node_(5) sscs startCTDevice 1 1"
  138. $ns_ at 6.0 "$node_(10) sscs startCTDevice 1 1"
  139. $ns_ at 6.3 "$node_(14) sscs startCTDevice 1 1"
  140. $ns_ at 6.8 "$node_(18) sscs startCTDevice 1 0"
  141. $ns_ at 7.0 "$node_(4) sscs startCTDevice 0 0"
  142. $ns_ at 7.3 "$node_(8) sscs startCTDevice 0 0"
  143. $ns_ at 7.7 "$node_(15) sscs startCTDevice 0 0"
  144. $ns_ at $appTime1 "$node_(0) sscs stopBeacon"
  145. $ns_ at $appTime1 "$node_(2) sscs startBeacon 4 4"
  146. $ns_ at $appTime1 "$node_(7) sscs startBeacon 4 4"
  147. #$ns_ at $appTime1 "$node_(11) sscs stopBeacon"
  148. #$ns_ at $appTime1 "$node_(16) sscs stopBeacon"
  149. Mac/802_15_4 wpanNam PlaybackRate 4ms
  150. $ns_ at $appTime1 "Mac/802_15_4 wpanNam PlaybackRate 1.0ms"
  151. $ns_ at [expr $appTime1 + 0.5] "Mac/802_15_4 wpanNam PlaybackRate 2.0ms"
  152. $ns_ at $appTime1 "puts "nTransmitting data ...n""
  153. # Setup traffic flow between nodes
  154. proc cbrtraffic { src dst interval starttime } {
  155.    global ns_ node_
  156.    set udp_($src) [new Agent/UDP]
  157.    eval $ns_ attach-agent $node_($src) $udp_($src)
  158.    set null_($dst) [new Agent/Null]
  159.    eval $ns_ attach-agent $node_($dst) $null_($dst)
  160.    set cbr_($src) [new Application/Traffic/CBR]
  161.    eval $cbr_($src) set packetSize_ 70
  162.    eval $cbr_($src) set interval_ $interval
  163.    eval $cbr_($src) set random_ 0
  164.    #eval $cbr_($src) set maxpkts_ 10000
  165.    eval $cbr_($src) attach-agent $udp_($src)
  166.    eval $ns_ connect $udp_($src) $null_($dst)
  167.    $ns_ at $starttime "$cbr_($src) start"
  168. }
  169. proc poissontraffic { src dst interval starttime } {
  170.    global ns_ node_
  171.    set udp($src) [new Agent/UDP]
  172.    eval $ns_ attach-agent $node_($src) $udp($src)
  173.    set null($dst) [new Agent/Null]
  174.    eval $ns_ attach-agent $node_($dst) $null($dst)
  175.    set expl($src) [new Application/Traffic/Exponential]
  176.    eval $expl($src) set packetSize_ 70
  177.    eval $expl($src) set burst_time_ 0
  178.    eval $expl($src) set idle_time_ [expr $interval*1000.0-70.0*8/250]ms ;# idle_time + pkt_tx_time = interval
  179.    eval $expl($src) set rate_ 250k
  180.    eval $expl($src) attach-agent $udp($src)
  181.    eval $ns_ connect $udp($src) $null($dst)
  182.    $ns_ at $starttime "$expl($src) start"
  183. }
  184. if {$val(rp) == "ZBR"} {
  185. Mac/802_15_4 wpanCmd callBack 2 ;# 0=none; 1=failure only (default); 2=both failure and success
  186. }
  187. if { ("$val(traffic)" == "mix") || ("$val(traffic)" == "cbr") || ("$val(traffic)" == "poisson") } {
  188.    if { "$val(traffic)" == "mix" } {
  189.     set trafficName "cbr + poisson"
  190.     set traffic1 cbr
  191.     set traffic2 poisson
  192.    } else {
  193.     set trafficName $val(traffic)
  194.     set traffic1 $val(traffic)
  195.     set traffic2 $val(traffic)
  196.    }
  197.    puts "nTraffic: $trafficName"
  198.    #Mac/802_15_4 wpanCmd ack4data on
  199.    puts [format "Acknowledgement for data: %s" [Mac/802_15_4 wpanCmd ack4data]]
  200.    ${traffic1}traffic 3 18 0.2 $appTime1
  201.    ${traffic2}traffic 9 17 0.2 $appTime2
  202.    Mac/802_15_4 wpanNam FlowClr -p AODV -c tomato
  203.    Mac/802_15_4 wpanNam FlowClr -p ARP -c green
  204.    Mac/802_15_4 wpanNam FlowClr -p MAC -c navy
  205.    $ns_ at $appTime1 "$node_(3) add-mark m1 blue circle"
  206.    $ns_ at $appTime1 "$node_(18) add-mark m2 blue circle"
  207.    $ns_ at $appTime1 "$ns_ trace-annotate "(at $appTime1) $traffic1 traffic from node 3 to node 18""
  208.    $ns_ at $appTime2 "$node_(9) add-mark m3 green4 circle"
  209.    $ns_ at $appTime2 "$node_(17) add-mark m4 green4 circle"
  210.    $ns_ at $appTime2 "$ns_ trace-annotate "(at $appTime2) $traffic2 traffic from node 9 to node 17""
  211.    $ns_ at [expr $appTime1 + 2.0] "Mac/802_15_4 wpanCmd link-down 13 16"
  212.    set tmpTime [format "%.1f" [expr $appTime1 + 2.0]]
  213.    $ns_ at [expr $appTime1 + 2.0] "$ns_ trace-annotate "(at $tmpTime) link down: 13 -> 16""
  214.    $ns_ at [expr $appTime2 + 3.0] "$node_(20) node-down"
  215.    set tmpTime [format "%.1f" [expr $appTime2 + 3.0]]
  216.    $ns_ at [expr $appTime2 + 3.0] "$ns_ trace-annotate "(at $tmpTime) node down: 20""
  217.    $ns_ at [expr $appTime1 + 8.0] "Mac/802_15_4 wpanCmd link-up 13 16"
  218.    set tmpTime [format "%.1f" [expr $appTime1 + 8.0]]
  219.    $ns_ at [expr $appTime1 + 8.0] "$ns_ trace-annotate "(at $tmpTime) link up: 13 -> 16""
  220.    $ns_ at [expr $appTime2 + 10.0] "$node_(20) node-up"
  221.    set tmpTime [format "%.1f" [expr $appTime2 + 10.0]]
  222.    $ns_ at [expr $appTime2 + 10.0] "$ns_ trace-annotate "(at $tmpTime) node up: 20""
  223.    if { "$val(traffic)" == "cbr" } {
  224.     set pktType cbr
  225.     set pktType2 cbr
  226.    } elseif { "$val(traffic)" == "poission" } {
  227.     set pktType exp
  228.     set pktType2 exp
  229.    } else {
  230.     set pktType cbr
  231.     set pktType2 exp
  232.    }
  233.    Mac/802_15_4 wpanNam FlowClr -p $pktType -s 3 -d 18 -c blue
  234.    Mac/802_15_4 wpanNam FlowClr -p $pktType2 -s 9 -d 17 -c green4
  235. }
  236. proc ftptraffic { src dst starttime } {
  237.    global ns_ node_
  238.    set tcp($src) [new Agent/TCP]
  239.    eval $tcp($src) set packetSize_ 50
  240.    set sink($dst) [new Agent/TCPSink]
  241.    eval $ns_ attach-agent $node_($src) $tcp($src)
  242.    eval $ns_ attach-agent $node_($dst) $sink($dst)
  243.    eval $ns_ connect $tcp($src) $sink($dst)
  244.    set ftp($src) [new Application/FTP]
  245.    eval $ftp($src) attach-agent $tcp($src)
  246.    $ns_ at $starttime "$ftp($src) start"
  247. }
  248. if { "$val(traffic)" == "ftp" } {
  249.    puts "nTraffic: ftp"
  250.    #Mac/802_15_4 wpanCmd ack4data off
  251.    puts [format "Acknowledgement for data: %s" [Mac/802_15_4 wpanCmd ack4data]]
  252.    ftptraffic 3 18 $appTime1
  253.    ftptraffic 9 17 $appTime2
  254.    Mac/802_15_4 wpanNam FlowClr -p AODV -c tomato
  255.    Mac/802_15_4 wpanNam FlowClr -p ARP -c green
  256.    Mac/802_15_4 wpanNam FlowClr -p MAC -c navy
  257.    $ns_ at $appTime1 "$node_(3) add-mark m1 blue circle"
  258.    $ns_ at $appTime1 "$node_(18) add-mark m2 blue circle"
  259.    $ns_ at $appTime1 "$ns_ trace-annotate "(at $appTime1) ftp traffic from node 3 to node 18""
  260.    Mac/802_15_4 wpanNam FlowClr -p tcp -s 3 -d 18 -c blue
  261.    Mac/802_15_4 wpanNam FlowClr -p ack -s 18 -d 3 -c blue
  262.    $ns_ at $appTime2 "$node_(9) add-mark m3 green4 circle"
  263.    $ns_ at $appTime2 "$node_(17) add-mark m4 green4 circle"
  264.    $ns_ at $appTime2 "$ns_ trace-annotate "(at $appTime2) ftp traffic from node 9 to node 17""
  265.    Mac/802_15_4 wpanNam FlowClr -p tcp -s 9 -d 17 -c green4
  266.    Mac/802_15_4 wpanNam FlowClr -p ack -s 17 -d 9 -c green4
  267. }
  268. # defines the node size in nam
  269. for {set i 0} {$i < $val(nn)} {incr i} {
  270. $ns_ initial_node_pos $node_($i) 2
  271. }
  272. # Tell nodes when the simulation ends
  273. for {set i 0} {$i < $val(nn) } {incr i} {
  274.     $ns_ at $stopTime "$node_($i) reset";
  275. }
  276. $ns_ at $stopTime "stop"
  277. $ns_ at $stopTime "puts "nNS EXITING...n""
  278. $ns_ at $stopTime "$ns_ halt"
  279. proc stop {} {
  280.     global ns_ tracefd appTime val env
  281.     $ns_ flush-trace
  282.     close $tracefd
  283.     set hasDISPLAY 0
  284.     foreach index [array names env] {
  285.         #puts "$index: $env($index)"
  286.         if { ("$index" == "DISPLAY") && ("$env($index)" != "") } {
  287.                 set hasDISPLAY 1
  288.         }
  289.     }
  290.     if { ("$val(nam)" == "wpan_demo4.nam") && ("$hasDISPLAY" == "1") } {
  291.      exec nam wpan_demo4.nam &
  292.     }
  293. }
  294. puts "nStarting Simulation..."
  295. $ns_ run