NS examples for wireless scenario

[ A Simple One | A Complex One | Link Error Example  | Back to Network Simulator 2 for Wireless ]


This is a simple test scenario for 4x4 grid and 4 flows.

# ===================================================
# Author: ZHIBIN WU 06/19/2003
# ==================================================
set cbr_size 500 set cbr_interval 0.002 set num_row 4 set time_duration 100 set val(chan) Channel/WirelessChannel ;# channel type set val(prop) Propagation/TwoRayGround ;# radio-propagation model set val(netif) Phy/WirelessPhy ;# network interface type set val(mac) Mac/802_11 ;# MAC type set val(ifq) Queue/DropTail/PriQueue ;# interface queue type set val(ll) LL ;# link layer type set val(ant) Antenna/OmniAntenna ;# antenna model set val(ifqlen) 50 ;# max packet in ifq set val(rp) DSDV ;# routing protocol # # Initialize ns # set ns_ [new Simulator] set tracefd [open simple.tr w] $ns_ trace-all $tracefd # set up topography object set topo [new Topography] $topo load_flatgrid 1000 1000 create-god [expr $num_row * $num_row ] $ns_ node-config -adhocRouting $val(rp) -llType $val(ll) \ -macType $val(mac) -ifqType $val(ifq) \ -ifqLen $val(ifqlen) -antType $val(ant) \ -propType $val(prop) -phyType $val(netif) \ -channel [new $val(chan)] -topoInstance $topo \ -agentTrace ON -routerTrace OFF\ -macTrace ON \ -movementTrace OFF for {set i 0} {$i < [expr $num_row*$num_row]} {incr i} { set node_($i) [$ns_ node] } set k 0; while {$k < $num_row } { for {set i 0} {$i < $num_row } {incr i} { set m [expr $i+$k*$num_row]; $node_($m) set X_ [expr $i*240]; $node_($m) set Y_ [expr $k*240+20.0]; $node_($m) set Z_ 0.0 } incr k; }; for {set i 0} {$i < $num_row } {incr i} { set udp_($i) [new Agent/UDP] set null_($i) [new Agent/Null] } $ns_ attach-agent $node_(0) $udp_(0) $ns_ attach-agent $node_(7) $udp_(1) $ns_ attach-agent $node_(2) $udp_(2) $ns_ attach-agent $node_(7) $udp_(3) $ns_ attach-agent $node_(6) $null_(0) $ns_ attach-agent $node_(1) $null_(1) $ns_ attach-agent $node_(8) $null_(2) $ns_ attach-agent $node_(15) $null_(3) for {set i 0} {$i < $num_row } {incr i} { $ns_ connect $udp_($i) $null_($i) } for {set i 0} {$i < $num_row } {incr i} { set cbr_($i) [new Application/Traffic/CBR] $cbr_($i) set packetSize_ $cbr_size $cbr_($i) set interval_ 0.5 $cbr_($i) attach-agent $udp_($i) } $ns_ at 11.0234 "$cbr_(0) start" $ns_ at 10.4578 "$cbr_(1) start" $ns_ at 12.7184 "$cbr_(2) start" $ns_ at 12.2456 "$cbr_(3) start" # Tell nodes when the simulation ends # for {set i 0} {$i < [expr $num_row*$num_row] } {incr i} { $ns_ at [expr $time_duration +10.0] "$node_($i) reset"; } $ns_ at [expr $time_duration +10.0] "finish" $ns_ at [expr $time_duration +10.01] "puts \"NS Exiting...\"; $ns_ halt" proc finish {} { global ns_ tracefd $ns_ flush-trace close $tracefd } puts "Starting Simulation..." $ns_ run

However, a more professional way to write the test tcl is to following the way in ns examples. For example, it is better to write traffic patten file and mobility file seperately and then source them in the main test tcl. Those files are generated respectively with cbrgen and setdest tools. Those files are ususally stored in "/ns-2.??/tcl/mobility/scene" directory.

This is an example for DSDV routing with 50 nodes in a 670*670 m2 area

# ======================================================================
# Default Script Options
# ======================================================================
set opt(chan) Channel/WirelessChannel
set opt(prop) Propagation/TwoRayGround
#set opt(netif) NetIf/SharedMedia
set opt(netif) Phy/WirelessPhy
#set opt(mac) Mac/802_11
set opt(mac) Mac/802_11
set opt(ifq) Queue/DropTail/PriQueue
set opt(ll) LL
set opt(ant) Antenna/OmniAntenna

set opt(x) 670 ;# X dimension of the topography
set opt(y) 670 ;# Y dimension of the topography
set opt(cp) "../mobility/scene/cbr-50-10-4-512"
set opt(sc) "../mobility/scene/scen-670x670-50-600-20-0"


set opt(ifqlen) 50 ;# max packet in ifq
set opt(nn) 50 ;# number of nodes
set opt(seed) 0.0
set opt(stop) 1000.0 ;# simulation time
set opt(tr) out.tr ;# trace file
set opt(rp) dsdv ;# routing protocol script
set opt(lm) "off" ;# log movement

# ======================================================================

#set AgentTrace ON
#set RouterTrace ON
#set MacTrace OFF
#useless code, the only way to toggle Mac trace on is to use node-config

LL set mindelay_ 50us
LL set delay_ 25us
LL set bandwidth_ 0 ;# not used
LL set off_prune_ 0 ;# not used
LL set off_CtrMcast_ 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_ 1460

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
Phy/WirelessPhy set RXThresh_ 3.652e-10
Phy/WirelessPhy set Rb_ 2*1e6
Phy/WirelessPhy set Pt_ 0.2818
Phy/WirelessPhy set freq_ 914e+6
Phy/WirelessPhy set L_ 1.0

# ======================================================================

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

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]]
}
}


proc cmu-trace { ttype atype node } {
global ns_ tracefd

if { $tracefd == "" } {
return ""
}
set T [new CMUTrace/$ttype $atype]
$T target [$ns_ set nullAgent_]
$T attach $tracefd
$T set src_ [$node id]

$T node $node

return $T
}




proc log-movement {} {
global logtimer ns_ ns

set ns $ns_
source ../mobility/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

#
# Source External TCL Scripts
#
#source ../lib/ns-mobilenode.tcl

#if { $opt(rp) != "" } {
#source ../mobility/$opt(rp).tcl
#} elseif { [catch { set env(NS_PROTO_SCRIPT) } ] == 1 } {
#puts "\nenvironment variable NS_PROTO_SCRIPT not set!\n"
#exit
#} else {
#puts "\n*** using script $env(NS_PROTO_SCRIPT)\n\n";
#source $env(NS_PROTO_SCRIPT)
#}
#source ../lib/ns-cmutrace.tcl
source ../lib/ns-bsnode.tcl
source ../mobility/com.tcl

# do the get opt again incase the routing protocol file added some more
# options to look for
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
#
create-god $opt(nn)


#
# log the mobile nodes movements if desired
#
if { $opt(lm) == "on" } {
log-movement
}

$ns_ node-config -macTrace ON


#
# Create the specified number of nodes $opt(nn) and "attach" them
# the channel.
# Each routing protocol script is expected to have defined a proc
# create-mobile-node that builds a mobile node and inserts it into the
# array global $node_($i)
#

if { [string compare $opt(rp) "dsr"] == 0} {
for {set i 0} {$i < $opt(nn) } {incr i} {
dsr-create-mobile-node $i
}
} elseif { [string compare $opt(rp) "dsdv"] == 0} {
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 {
puts "Loading connection pattern..."
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..."
source $opt(sc)
puts "Load complete..."
}
puts $tracefd "M 0.0 nn $opt(nn) x $opt(x) y $opt(y) rp $opt(rp)" puts $tracefd "M 0.0 sc $opt(sc) cp $opt(cp) seed $opt(seed)" puts $tracefd "M 0.0 prop $opt(prop) ant $opt(ant)" puts "Starting Simulation..." $ns_ run

Note that all options listed in the beginning of the file could be initialized with command line arguments by using "getopt $argc $argv"


Example 3 : To attach the error model, add following codes:

     
..........
proc UniformErr {} {
set err [new ErrorModel]
$err unit packet
$err set rate_ 0.05
return $err
}
# $err rate_ 0.5 "invalid command ErrModel::Command does not support"
# the other valid method is " set err [new ErrorModel/Uniform 0.05 pkt] "
# the parameter rate ( 0 or 0.9) is a threshold that all packets all going through and 90% packets are
# going to be drop

proc TwoStateMarkovErr {} {

set tmp0 [new ErrorModel/Uniform 0 pkt]
set tmp1 [new ErrorModel/Uniform .7 pkt]

# Array of states (error models)
set m_states [list $tmp0 $tmp1]
# Durations for each of the states, tmp, tmp1 and tmp2, respectively
set m_periods [list 0.1 .075 ]
# Transition state model matrix
set m_transmx { {0.9 0.1 }
{0.7 0.3 } }
set m_trunit byte
# Use time-based transition
set m_sttype time
set m_nstates 2
set m_nstart [lindex $m_states 0]

set em [new ErrorModel/MultiState $m_states $m_periods $m_transmx \
$m_trunit $m_sttype $m_nstates $m_nstart]
return $em
}

$ns_ node-config -adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(ant) \
-propType $val(prop) \
-phyType $val(netif) \
-channel $chan1 \
-topoInstance $topo \
-agentTrace ON \
-routerTrace OFF\
-macTrace ON \
-movementTrace OFF \
-IncomingErrProc TwoStateMarkovErr
#\
#-OutcomingErrProc TwoStateMarkovErr

#The other way to configure error
# $ns_ node-config --IncomingErrProc $opt(err)