📄 main.tcl
字号:
# ======================================================================
# Default Script Options
# ======================================================================
set opt(chan) Channel/WirelessChannel
set opt(prop) Propagation/TwoRayGround
set opt(netif) Phy/WirelessPhy
set opt(mac) Mac/802_11
set opt(ifq) CMUPriQueue ;# for dsr
set opt(ifqlen) 50
set opt(ll) LL
set opt(ant) Antenna/OmniAntenna
set opt(x) 6000 ;# X dimension of the topography
set opt(y) 3000 ;# Y dimension of the topography
set opt(cp) ""; # traffic TCP/TFRC/etc
set opt(sc) ""; # topology scenario
set opt(nn) 0 ;# number of nodes -- changes according to opt(sc)
set opt(seed) 0.0
set opt(stop) 200.0 ;# simulation time
set opt(tr) out.tr ;# trace file
set opt(rp) dsr ;# routing protocol script (dsr or dsdv)
set opt(lm) "off" ;# log movement
set opt(err) "" ;# if needed, check MyErrorProc below
set opt(alpha) 1.0
set opt(beta) 1 ;# DSR beta (0: static, 1: DSR, >2:DSR++DAMPEN)
set opt(rate) 2e6
set opt(dist) 250 ;# receiving range
set opt(ntcp) 0 ;# opt(cp) related parameter: number of TCPs
set opt(hops) 1 ;# opt(cp) related parameter: E2E hops
# ======================================================================
set AgentTrace OFF
set RouterTrace ON
set MacTrace ON
CMUTrace set newtrace_ 1
LL set mindelay_ 50us
LL set delay_ 25us
LL set bandwidth_ 0 ;# not used
Agent/Null set sport_ 0
Agent/Null set dport_ 0
Agent/CBR set sport_ 0
Agent/CBR set dport_ 0
Agent/TCPSink set sport_ 0
Agent/TCPSink set dport_ 0
Agent/TCP set sport_ 0
Agent/TCP set dport_ 0
Agent/TCP set packetSize_ 1024
Queue/DropTail/PriQueue set Prefer_Routing_Protocols 1
# unity gain, omni-directional antennas
# set up the antennas to be centered in the node and 1.5 meters above it
Antenna/OmniAntenna set X_ 0
Antenna/OmniAntenna set Y_ 0
Antenna/OmniAntenna set Z_ 1.5
Antenna/OmniAntenna set Gt_ 1.0
Antenna/OmniAntenna set Gr_ 1.0
# Initialize the SharedMedia interface with parameters to make
# it work like the 914MHz Lucent WaveLAN DSSS radio interface
Phy/WirelessPhy set CPThresh_ 10.0
Phy/WirelessPhy set CSThresh_ 1.559e-11; # 550m
Phy/WirelessPhy set RXThresh_ 3.652e-10; # 250m
Phy/WirelessPhy set Pt_ 0.281838
Phy/WirelessPhy set freq_ 2.4e+9
Phy/WirelessPhy set L_ 1.0
ErrorModel set enable_ 1
ErrorModel set markecn_ false
ErrorModel set bandwidth_ 2Mb
# ======================================================================
#source [lindex $argv 0]; # override the default settings
# ======================================================================
proc usage { argv0 } {
puts "Usage: $argv0"
puts "\tmandatory arguments:"
puts "\t\t\[-x MAXX\] \[-y MAXY\]"
puts "\toptional arguments:"
puts "\t\t\[-cp conn pattern\] \[-sc scenario\] \[-nn nodes\]"
puts "\t\t\[-seed seed\] \[-stop sec\] \[-tr tracefile\]\n"
}
proc getopt {argc argv} {
global opt
lappend optlist cp nn seed sc stop tr x y ntcp hops beta alpha qlen rate
for {set i 0} {$i < $argc} {incr i} {
set arg [lindex $argv $i]
if {[string range $arg 0 0] != "-"} continue
set name [string range $arg 1 end]
set opt($name) [lindex $argv [expr $i+1]]
puts "opt($name) = $opt($name)"
}
}
proc create_tcp_connection {src dst log_file_prefix start} {
global ns_ tcp_ node_ iiik tcptrace_ opt
if ![info exists iiik] {
set iiik 0
}
set tcp_($iiik) [new Agent/TCP/Newreno]
set tcpsink_($iiik) [new Agent/TCPSink]
$ns_ attach-agent $node_($src) $tcp_($iiik)
$ns_ attach-agent $node_($dst) $tcpsink_($iiik)
$ns_ connect $tcp_($iiik) $tcpsink_($iiik)
$tcp_($iiik) set fid_ 1
$tcp_($iiik) set window_ 64
$tcp_($iiik) set nodeid_ [$node_($src) id]
$tcpsink_($iiik) set nodeid_ [$node_($src) id]
if { $log_file_prefix != "" } {
$tcpsink_($iiik) set total_bytes_ 0
$ns_ register_record $tcpsink_($iiik) $log_file_prefix$iiik.tr
set tcptrace_($iiik) [open $log_file_prefix$iiik.log w]
$tcp_($iiik) set trace_all_oneline_ false
$tcp_($iiik) trace cwnd_
$tcp_($iiik) trace rtt_
$tcp_($iiik) trace srtt_
$tcp_($iiik) trace ssthresh_
$tcp_($iiik) attach $tcptrace_($iiik)
$ns_ at $opt(stop) "flush $tcptrace_($iiik)"
$ns_ at $opt(stop) "close $tcptrace_($iiik)"
}
set ftp_($iiik) [$tcp_($iiik) attach-source FTP]
$ns_ at $start "$ftp_($iiik) start"
incr iiik
}
proc MyErrorProc {} {
set errObj [new ErrorModel]
$errObj FECstrength 0
$errObj set rate_ 0.001
$errObj set unit pkt
return $errObj
}
Simulator instproc register_record {agent file} {
$self instvar agent_list log_file_list
lappend agent_list $agent
lappend log_file_list [open $file w]
}
set total_thr_file [open "thr.log" w]
Simulator instproc record {} {
$self instvar agent_list log_file_list
global total_thr_file opt
set nnn [llength $agent_list]
set now [$self now]
# set interval 5
set interval $opt(stop)
set bw_tcp 0
set bw_tfrc 0
for {set i 0} {$i < $nnn} {incr i} {
set agent [lindex $agent_list $i]
set bytes [$agent set total_bytes_]
set file [lindex $log_file_list $i]
set bw [expr $bytes/$interval*8.0/1024.0]
set bw_tcp [expr $bw_tcp + $bw]
$agent set total_bytes_ 0
puts $file "$now $bw"
}
if { $interval == $opt(stop) } {
if { $now == $opt(stop) } {
puts $total_thr_file "$bw_tcp"
}
} else {
puts $total_thr_file "$now $bw_tcp"
}
$self at [expr $now+$interval] "$self record"
}
proc log-movement {} {
global logtimer ns_ ns
set ns $ns_
source /tcl/timer.tcl
Class LogTimer -superclass Timer
LogTimer instproc timeout {} {
global opt node_;
for {set i 0} {$i < $opt(nn)} {incr i} {
$node_($i) log-movement
}
$self sched 0.1
}
set logtimer [new LogTimer]
$logtimer sched 0.1
}
# ======================================================================
# Main Program
# ======================================================================
getopt $argc $argv
if { $opt(x) == 0 || $opt(y) == 0 } {
usage $argv0
exit 1
}
if {$opt(seed) > 0} {
puts "Seeding Random number generator with $opt(seed)\n"
ns-random $opt(seed)
}
#
# Initialize Global Variables
#
set ns_ [new Simulator]
set chan [new $opt(chan)]
set prop [new $opt(prop)]
set topo [new Topography]
set tracefd [open $opt(tr) w]
$topo load_flatgrid $opt(x) $opt(y)
$prop topography $topo
#
# Create God
#
set god_ [create-god $opt(nn)]
#
# log the mobile nodes movements if desired
#
if { $opt(lm) == "on" } {
log-movement
}
if { $opt(dist) == 60 } {
Phy/WirelessPhy set CSThresh_ 1.65011e-9; # 130m
Phy/WirelessPhy set RXThresh_ 7.74635e-9; # 60m
}
if { [string compare $opt(rp) "dsr"] == 0} {
Agent/DSRAgent set beta_ $opt(beta)
Mac/802_11 set basicRate_ $opt(rate)
Mac/802_11 set dataRate_ $opt(rate)
Phy/WirelessPhy set bandwidth_ $opt(rate)
Phy/WirelessPhy set Rb_ $opt(rate)
for {set i 0} {$i < $opt(nn) } {incr i} {
dsr-create-mobile-node $i
}
} elseif { [string compare $opt(rp) "dsdv"] == 0} {
Mac/802_11 set basicRate_ $opt(rate)
Mac/802_11 set dataRate_ $opt(rate)
Phy/WirelessPhy set bandwidth_ $opt(rate)
Phy/WirelessPhy set Rb_ $opt(rate)
for {set i 0} {$i < $opt(nn) } {incr i} {
dsdv-create-mobile-node $i
}
}
#
# Source the Connection and Movement scripts
#
if { $opt(cp) == "" } {
puts "*** NOTE: no connection pattern specified."
set opt(cp) "none"
} else {
Agent/TCP set increase_num_ $opt(alpha)
puts "Loading connection pattern... $opt(cp)"
source $opt(cp)
}
#
# Tell all the nodes when the simulation ends
#
for {set i 0} {$i < $opt(nn) } {incr i} {
$ns_ at $opt(stop).000000001 "$node_($i) reset";
}
$ns_ at $opt(stop).00000001 "puts \"NS EXITING...\" ; $ns_ halt"
if { $opt(sc) == "" } {
puts "*** NOTE: no scenario file specified."
set opt(sc) "none"
} else {
puts "Loading scenario file... $opt(sc)"
source $opt(sc)
puts "Load complete..."
}
$ns_ at 0.0 "$ns_ record"
puts "Starting Simulation..."
$ns_ run
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -