⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.tcl

📁 在linux平台下
💻 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 + -