puts "Initializing MannaSim Script..."
#Consumo de energia do sensor node - Dados do Mica Motes
set mica(sensing_power) 0.015 ;# i = 5mA, V = 3 --> P = ixV = 15 mW = 0.015 W
set mica(processing_power) 0.024 ;# i = 8mA, V = 3 --> P = ixV = 24 mW = 0.024 W
set mica(instructions_per_second) 8000000 ;# Atmel 128L 8MHZ --> 8MIPS
#Consumo de energia do sensor node - Dados do WINS
set wins(sensing_power) 0.064 ;# 64 mW = 0.064 W
set wins(processing_power) 0.360 ;# 360 mW = 0.360 W
set wins(instructions_per_second) 150000000 ;# Intel StrongArm 1100 133 MHZ --> 150 MIPS
#Seta valores para consumo de energia com o radio
set mica(consumo_transmissao) 0.036 ;#i = 12mA, V = 3 --> P = ixV = 36mW = 0.036W
set mica(consumo_recepcao) 0.024 ;#i = 8mA, V = 3 --> P = ixV = 24mW = 0.024W
set wins(consumo_transmissao)3.75 ;# 3.75 250m, 0.6 600 mW - 100m
set wins(consumo_recepcao) 1.875 ;# 1.875 250m, 0.3 300 mW
#seta a taxa de transmissao
#Phy/WirelessPhy set bandwidth_
set mica(taxa_transmissao) 28.8*10e3 ;#28.8 kbps
set wins(taxa_transmissao) 100*10e3 ;#100 kbps
proc setup_mica2 {
antenna range
} {
puts "Setting up mica 2 mote with $antenna and range = $range"
#Phy/WirelessPhy set CPThresh_ 10.0
#Phy/WirelessPhy set CSThresh_ 1.559e-11
#Phy/WirelessPhy set RXThresh_ 2.78869e-09; # 100 meters
#Phy/WirelessPhy set RXThresh_ 1.11548e-08; # 50 meters
#Phy/WirelessPhy set Rb_ 2*1e6
Phy/WirelessPhy set Pt_ 0.281838
Phy/WirelessPhy set freq_ 2.4e09
Phy/WirelessPhy set L_ 1.0
Phy/WirelessPhy set lambda_ 0.125
Phy/WirelessPhy set RXThresh_ [TwoRay 0.281838 [$antenna set Gt_] [$antenna set Gr_] 0.8 0.8 1.0 $range 0.125]
Phy/WirelessPhy set bandwidth_ 28.8*10e3 ;#28.8 kbps
Node/MobileNode/SensorNode set sensingPower_ 0.015
Node/MobileNode/SensorNode set processingPower 0.024
Node/MobileNode/SensorNode set instructionsPerSecond_ 8000000
}
##########################################
# CONSTANTES
#########################################
# Continuo: 0
# Programada: 1
# Sob Demanda: 2
########################################
proc create_common_app {
destination_id disseminating_type disseminating_interval
} {
global val
if {
$val(commonApp) == "Application/SensorBaseApp/CommonNodeApp/LeachApp"
} {
if {
$val(n_ch) == 0
} {
puts "NO CLUSTER HEADS HAS BEEN DEFINED! Assuming 20% of common nodes."
set val(n_ch) [expr int($val(n_common) * 2 / 10)]
}
set app_ [new $val(commonApp) $val(nn) $val(n_ch) [expr sqrt($val(x) * $val(x) + $val(y) * $val(y))]]
} else {
set app_ [new $val(commonApp)]
$app_ set destination_id_ $destination_id
}
$app_ set disseminating_type_ $disseminating_type
$app_ set disseminating_interval_ $disseminating_interval
return $app_
}
set val(commonApp) "Application/SensorBaseApp/CommonNodeApp"
set val(chApp) "Application/SensorBaseApp/ClusterHeadApp"
set val(apApp) "Application/AccessPointApp"
proc create_cluster_head_app {
destination_id disseminating_type disseminating_interval
} {
global val
set app_ [new $val(chApp)]
$app_ set destination_id_ $destination_id
$app_ set disseminating_type_ $disseminating_type
$app_ set disseminating_interval_ $disseminating_interval
return $app_
}
proc create_access_point_app {
outside_network
} {
global val
set app_ [new $val(apApp)]
$app_ set outside_network_ $outside_network
return $app_
}
proc create_temp_data_generator {
sensing_interval sensing_type avg_measure std_deviation maximumTemperatureAllowedValue
} {
set temp_gen_ [new DataGenerator/TemperatureDataGenerator]
$temp_gen_ set sensing_interval_ $sensing_interval
$temp_gen_ set sensing_type_ $sensing_type
$temp_gen_ set avg_measure $avg_measure
$temp_gen_ set std_deviation $std_deviation
$temp_gen_ set maximumTemperatureAllowedValue_ $maximumTemperatureAllowedValue
return $temp_gen_
}
proc create_data_generator {
generator sensing_interval sensing_type avg_measure std_deviation maximumTemperatureAllowedValue
} {
set temp_gen_ [new DataGenerator/$generator]
$temp_gen_ set sensing_interval_ $sensing_interval
if {
$sensing_type=="continuous"
} {
$temp_gen_ set sensing_type_ 0
} elseif {
$sensing_type=="programmed"
} {
$temp_gen_ set sensing_type_ 1
} elseif {
$sensing_type=="on demand"
} {
$temp_gen_ set sensing_type_ 2
} else {
$temp_gen_ set sensing_type_ $sensing_type
}
$temp_gen_ set avg_measure $avg_measure
$temp_gen_ set std_deviation $std_deviation
$temp_gen_ set maximumTemperatureAllowedValue_ $maximumTemperatureAllowedValue
return $temp_gen_
}
proc create_common_node {
iniEnergy x y z father_addr start stop
} {
global val ns_ node_ topo udp_ app_ gen_ contador_nodos rng trace
if {
[llength $start] == 0
} {
set start [expr $val(start) + [$rng uniform 0 1]]
set stop $val(stop)
}
$ns_ node-config -sensorNode ON \
-adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(antenna) \
-propType $val(prop) \
-energyModel $val(en) \
-phyType $val(netif) \
-channelType $val(chan) \
-topoInstance $topo \
-agentTrace $trace(agent) \
-routerTrace $trace(router) \
-macTrace $trace(mac) \
-rxPower 0.024 \
-txPower 0.036 \
-initialEnergy $iniEnergy \
-movementTrace $trace(movement)
set node_($contador_nodos) [$ns_ node]
$node_($contador_nodos) random-motion 0
#set x [$rng uniform 0.0 $val(x)]
#set y [$rng uniform 0.0 $val(y)]
#set bla [expr int(sqrt($val(nn)))]
#set x [expr (($contador_nodos) % $bla) * $val(x) / ($bla - 1)]
#set y [expr (($contador_nodos) / $bla) * $val(y) / ($bla - 1)]
$node_($contador_nodos) set X_ $x
$node_($contador_nodos) set Y_ $y
$node_($contador_nodos) set Z_ $z
puts "* Node [$node_($contador_nodos) node-addr] = $contador_nodos created in ($x, $y, $z)"
set app_($contador_nodos) [create_common_app $father_addr $val(disseminating_type) $val(disseminating_interval)]
if {
$val(leach) == 1
} {
set agent [new Agent/RCAgent]
$agent set sport_ 0
$agent set dport_ 0
$node_($contador_nodos) attach $agent 0
$app_($contador_nodos) attach-agent $agent
$agent add-ll [$node_($contador_nodos) set ll_(0)] [$node_($contador_nodos) set mac_(0)]
} else {
set udp_($contador_nodos) [new Agent/UDP]
$node_($contador_nodos) attach $udp_($contador_nodos) $val(port)
}
$node_($contador_nodos) add-app $app_($contador_nodos)
set processing_($contador_nodos) [new $val(processing)]
$app_($contador_nodos) node $node_($contador_nodos)
if {
$val(leach) != 1
} {
$app_($contador_nodos) attach-agent $udp_($contador_nodos)
}
$app_($contador_nodos) attach-processing $processing_($contador_nodos)
$processing_($contador_nodos) node $node_($contador_nodos)
for {
set i 0
} {
$i < [llength $start]
} {
incr i
} {
$ns_ at $start "$app_($contador_nodos) start"
}
for {
set i 0
} {
$i < [llength $stop]
} {
incr i
} {
$ns_ at $stop "$app_($contador_nodos) stop"
}
#[create_temp_data_generator 5.0 0 27.0 10.0 50]
set gen_($contador_nodos) $val(data_generator)
$app_($contador_nodos) attach_data_generator $gen_($contador_nodos)
incr contador_nodos
}
proc create_cluster_head_node {
iniEnergy x y z father_addr start stop
} {
global val ns_ node_ topo udp_ app_ gen_ contador_nodos rng trace
if {
[llength $start] == 0
} {
set start [expr $val(start) + [$rng uniform 0 1]]
set stop $val(stop)
}
$ns_ node-config -sensorNode ON \
-adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(antenna) \
-propType $val(prop) \
-energyModel $val(en) \
-phyType $val(netif) \
-channelType $val(chan) \
-topoInstance $topo \
-agentTrace $trace(agent) \
-routerTrace $trace(router) \
-macTrace $trace(mac) \
-rxPower 0.024 \
-txPower 0.036 \
-initialEnergy $iniEnergy \
-movementTrace $trace(movement)
set node_($contador_nodos) [$ns_ node]
$node_($contador_nodos) random-motion 0
#set x [$rng uniform 0.0 $val(x)]
#set y [$rng uniform 0.0 $val(y)]
#set bla [expr int(sqrt($val(nn)))]
#set x [expr (($contador_nodos) % $bla) * $val(x) / ($bla - 1)]
#set y [expr (($contador_nodos) / $bla) * $val(y) / ($bla - 1)]
$node_($contador_nodos) set X_ $x
$node_($contador_nodos) set Y_ $y
$node_($contador_nodos) set Z_ $z
puts "* Cluster head [$node_($contador_nodos) node-addr] = $contador_nodos created in ($x, $y, $z)"
set udp_($contador_nodos) [new Agent/UDP]
set app_($contador_nodos) [create_cluster_head_app $father_addr $val(disseminating_type) $val(disseminating_interval)]
$node_($contador_nodos) attach $udp_($contador_nodos) $val(port)
$node_($contador_nodos) add-app $app_($contador_nodos)
#CN#set processing_($contador_nodos) [new $val(processing)]
$app_($contador_nodos) node $node_($contador_nodos)
$app_($contador_nodos) attach-agent $udp_($contador_nodos)
#CN#$app_($contador_nodos) attach-processing $processing_($contador_nodos)
$processing_($contador_nodos) node $node_($contador_nodos)
for {
set i 0
} {
$i < [llength $start]
} {
incr i
} {
$ns_ at $start "$app_($contador_nodos) start"
}
for {
set i 0
} {
$i < [llength $stop]
} {
incr i
} {
$ns_ at $stop "$app_($contador_nodos) stop"
}
#CN#set gen_($contador_nodos) $val(data_generator)
#CN#$app_($contador_nodos) attach_data_generator $gen_($contador_nodos)
incr contador_nodos
}
proc create_access_point {
iniEnergy x y z start stop
} {
global ns_ val node_ app_ udp_ contador_nodos topo trace rng
if {
[llength $start] == 0
} {
set start [expr $val(start) + [$rng uniform 0 1]]
set stop $val(stop)
}
$ns_ node-config -sensorNode ON \
-adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(antenna) \
-propType $val(prop) \
-energyModel $val(en) \
-phyType $val(netif) \
-channelType $val(chan) \
-topoInstance $topo \
-agentTrace $trace(agent) \
-routerTrace $trace(router) \
-macTrace $trace(mac) \
-rxPower 0.5 \
-txPower 0.5 \
-initialEnergy $iniEnergy \
-movementTrace $trace(movement)
set node_($contador_nodos) [$ns_ node]
$node_($contador_nodos) random-motion 0
set app_($contador_nodos) [create_access_point_app [$node_(0) node-addr]]
if {
$val(leach) == 1
} {
set agent [new Agent/RCAgent/LeachAgent]
$agent set sport_ 0
$agent set dport_ 0
$node_($contador_nodos) attach $agent 0
$app_($contador_nodos) attach-agent $agent
$agent add-ll [$node_($contador_nodos) set ll_(0)] [$node_($contador_nodos) set mac_(0)]
} else {
set udp_($contador_nodos) [new Agent/UDP]
$node_($contador_nodos) attach $udp_($contador_nodos) $val(port)
$app_($contador_nodos) attach-agent $udp_($contador_nodos)
}
$node_($contador_nodos) set X_ $x
$node_($contador_nodos) set Y_ $y
$node_($contador_nodos) set Z_ $z
puts "* Access point [$node_($contador_nodos) node-addr] = $contador_nodos created in ($x, $y, $z)"
for {
set i 0
} {
$i < [llength $start]
} {
incr i
} {
$ns_ at $start "$app_($contador_nodos) start"
}
for {
set i 0
} {
$i < [llength $stop]
} {
incr i
} {
$ns_ at $stop "$app_($contador_nodos) stop"
}
incr contador_nodos
}
###
# Grid distribution.
proc get_next_x {
} {
global val
set aux [expr int(sqrt($val(nn)))]
return [expr (($contador_nodos) % $aux) * $val(x) / ($aux - 1)]
}
proc get_next_y {
} {
global val
set aux [expr int(sqrt($val(nn)))]
return [expr (($contador_nodos) / $aux) * $val(y) / ($aux - 1)]
}
####
# Calculating the receiving threshold (RXThresh_ for Phy/Wireless)
# Wei Ye, weiye@isi.edu, 2000
proc Friis {
Pt Gt Gr lambda L d
} {
set M [expr $lambda / (4 * 3.14159265359 * $d)]
return [expr ($Pt * $Gt * $Gr * ($M * $M)) / $L]
}
proc TwoRay {
Pt Gt Gr ht hr L d lambda
} {
set crossover_dist [expr (4 * 3.14159265359 * $ht * $hr) / $lambda]
if {
$d < $crossover_dist
} {
return [Friis $Pt $Gt $Gr $lambda $L $d]
} else {
return [expr $Pt * $Gt * $Gr * ($hr * $hr * $ht * $ht) / ($d * $d * $d * $d * $L)]
}
}
###
proc set_default_settings {
} {
global val
####
# Default network settings
set val(antenna) "Antenna/OmniAntenna"
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 ;
###
# Using Mica 2 Mote settings
set val(range) 100
setup_mica2 $val(antenna) $val(range)
set val(bandwidth) [Phy/WirelessPhy set bandwidth_]
set val(mac)Mac/802_11
set val(ifq)Queue/DropTail
set val(ifqlen)200
set val(ll)LL
set val(rp)"LEACH"
# Configuration adjustment
if {
$val(rp) == "LEACH"
} {
set val(rp) DumbAgent
set val(leach) 1
if {
$val(ll) != "RCALinkLayer"
} {
puts "LEACH requires RCALinkLayer! Forcing it!!!"
set val(ll)RCALinkLayer
}
if {
$val(netif) != "Phy/WirelessPhy/LeachWirelessPhy"
} {
puts "LEACH requires LeachWirelessPhy! Forcing it!!!"
set val(netif) Phy/WirelessPhy/LeachWirelessPhy
}
if {
$val(mac) != "Mac/Sensor"
} {
puts "LEACH requires Mac/Sensor! Forcing it!!!"
set val(mac) Mac/Sensor
}
set val(port) 0
Agent/RCAgent set sport_ $val(port)
Agent/RCAgent set dport_ $val(port)
Agent/RCAgent set packetMsg_ 0
Agent/RCAgent set distEst_ 0
Agent/RCAgent set packetSize_ 0
RCALinkLayer set delay_ 25us
RCALinkLayer set bandwidth_ [Phy/WirelessPhy set bandwidth_]
RCALinkLayer set off_prune_ 0
RCALinkLayer set off_CtrMcast_ 0
RCALinkLayer set macDA_ 0
RCALinkLayer set debug_ 0
} else {
set val(leach) 0
}
if {
$val(rp) == "DIRECTED DIFFUSION"
} {
set val(rp) "Directed_Diffusion"
}
}
set val(father_addr) 0
set val(port)2020
set val(netif)Phy/WirelessPhy
set_default_settings
# Global network settings
set contador_nodos 0
set val(chan)Channel/WirelessChannel
# Propagation
set val(prop)Propagation/TwoRayGround
# Energy model
set val(en)EnergyModel/Battery
# Nodes
set val(n_pas)1
set val(n_common) 10
set val(n_ch) 0
set val(nn)[expr $val(n_pas) + $val(n_common) + $val(n_ch)]
puts "\nNodes count:"
puts " - $val(n_pas) access points"
puts " - $val(n_common) common nodes"
puts " - $val(n_ch) cluster heads"
puts " - $val(nn) nodes"
puts " - $val(rp) routing protocol"
puts " - $val(ll) link layer"
puts " - $val(netif) network interface"
# Scenario size
set val(x)100.0
set val(y)100.0
puts "\nScenario size: $val(x) x $val(y)"
set val(start)0.0
set val(stop)[expr $val(start) + 100.0]
set ns_[new Simulator]
# Trace
puts "\nUsing trace.tr as trace file"
set traceFile[open trace.tr w]
$ns_ trace-all $traceFile
$ns_ use-newtrace
set trace(mac) ON
set trace(router) ON
set trace(agent) ON
set trace(movement) ON
set topo[new Topography]
$topo load_flatgrid $val(x) $val(y)
create-god $val(nn)
set rng [new RNG]
$rng seed [clock seconds]
#-------------------------------------------------------------------------------------------
# Creating an access point
puts "Creating an access point..."
set_default_settings
# Using Mica 2 Mote settings
puts "Using mica 2 mote settings"
set val(range) 100
setup_mica2 $val(antenna) $val(range)
set local(x) 50.0
set local(y) 50.0
set local(z) 0.0
set local(start) ""
set local(stop) ""
set local(energy) 100.0
set val(apApp) Application/AccessPointApp/AccessPointLeachApp
create_access_point $local(energy) $local(x) $local(y) $local(z) $local(start) $local(stop)
# Creating common node
puts "Creating common node..."
set_default_settings
# Using Mica 2 Mote settings
puts "Using mica 2 mote settings"
set val(range) 100
setup_mica2 $val(antenna) $val(range)
# Disseminating settings
set val(disseminating_type) 1;# Programmed
puts "Setting disseminating type to programmed"
set val(disseminating_interval)20.0
puts "Setting disseminating interval: $val(disseminating_interval)"
set local(start) ""
set local(stop) ""
set local(energy) 10.0
set local(father_addr) $val(father_addr)
set val(processing) Processing/AggregateProcessing
set val(data_generator) "[create_data_generator {
TemperatureDataGenerator
} {
5.0
} {
programmed
} {
25.0
} {
5.0
} {
30.0
}]"
for {
set common_node_i 0
} {
$common_node_i < 10
} {
incr common_node_i
} {
set local(x) [$rng uniform 0.0 $val(x)]
set local(y) [$rng uniform 0.0 $val(y)]
set local(z) 0.0
set val(commonApp) Application/SensorBaseApp/CommonNodeApp/LeachApp
create_common_node $local(energy) $local(x) $local(y) $local(z) $local(father_addr) $local(start) $local(stop)
}
$ns_ at [expr $val(stop)] "flush stdout"
$ns_ at [expr $val(stop)+0.0001] "finish"
proc finish {
} {
global ns_ traceFile namtrace tempoInicio val
$ns_ flush-trace
# close $namtrace
$ns_ halt
$ns_ flush-trace
$ns_ nam-end-wireless $val(stop)
close $traceFile
flush stdout
exit 0
}
puts "Starting Simulation..."
$ns_ run
puts "Initializing MannaSim Script..."
#Consumo de energia do sensor node - Dados do Mica Motes
set mica(sensing_power) 0.015 ;# i = 5mA, V = 3 --> P = ixV = 15 mW = 0.015 W
set mica(processing_power) 0.024 ;# i = 8mA, V = 3 --> P = ixV = 24 mW = 0.024 W
set mica(instructions_per_second) 8000000 ;# Atmel 128L 8MHZ --> 8MIPS
#Consumo de energia do sensor node - Dados do WINS
set wins(sensing_power) 0.064 ;# 64 mW = 0.064 W
set wins(processing_power) 0.360 ;# 360 mW = 0.360 W
set wins(instructions_per_second) 150000000 ;# Intel StrongArm 1100 133 MHZ --> 150 MIPS
#Seta valores para consumo de energia com o radio
set mica(consumo_transmissao) 0.036 ;#i = 12mA, V = 3 --> P = ixV = 36mW = 0.036W
set mica(consumo_recepcao) 0.024 ;#i = 8mA, V = 3 --> P = ixV = 24mW = 0.024W
set wins(consumo_transmissao)3.75 ;# 3.75 250m, 0.6 600 mW - 100m
set wins(consumo_recepcao) 1.875 ;# 1.875 250m, 0.3 300 mW
#seta a taxa de transmissao
#Phy/WirelessPhy set bandwidth_
set mica(taxa_transmissao) 28.8*10e3 ;#28.8 kbps
set wins(taxa_transmissao) 100*10e3 ;#100 kbps
proc setup_mica2 {
antenna range
} {
puts "Setting up mica 2 mote with $antenna and range = $range"
#Phy/WirelessPhy set CPThresh_ 10.0
#Phy/WirelessPhy set CSThresh_ 1.559e-11
#Phy/WirelessPhy set RXThresh_ 2.78869e-09; # 100 meters
#Phy/WirelessPhy set RXThresh_ 1.11548e-08; # 50 meters
#Phy/WirelessPhy set Rb_ 2*1e6
Phy/WirelessPhy set Pt_ 0.281838
Phy/WirelessPhy set freq_ 2.4e09
Phy/WirelessPhy set L_ 1.0
Phy/WirelessPhy set lambda_ 0.125
Phy/WirelessPhy set RXThresh_ [TwoRay 0.281838 [$antenna set Gt_] [$antenna set Gr_] 0.8 0.8 1.0 $range 0.125]
Phy/WirelessPhy set bandwidth_ 28.8*10e3 ;#28.8 kbps
Node/MobileNode/SensorNode set sensingPower_ 0.015
Node/MobileNode/SensorNode set processingPower 0.024
Node/MobileNode/SensorNode set instructionsPerSecond_ 8000000
}
##########################################
# CONSTANTES
#########################################
# Continuo: 0
# Programada: 1
# Sob Demanda: 2
########################################
proc create_common_app {
destination_id disseminating_type disseminating_interval
} {
global val
if {
$val(commonApp) == "Application/SensorBaseApp/CommonNodeApp/LeachApp"
} {
if {
$val(n_ch) == 0
} {
puts "NO CLUSTER HEADS HAS BEEN DEFINED! Assuming 20% of common nodes."
set val(n_ch) [expr int($val(n_common) * 2 / 10)]
}
set app_ [new $val(commonApp) $val(nn) $val(n_ch) [expr sqrt($val(x) * $val(x) + $val(y) * $val(y))]]
} else {
set app_ [new $val(commonApp)]
$app_ set destination_id_ $destination_id
}
$app_ set disseminating_type_ $disseminating_type
$app_ set disseminating_interval_ $disseminating_interval
return $app_
}
set val(commonApp) "Application/SensorBaseApp/CommonNodeApp"
set val(chApp) "Application/SensorBaseApp/ClusterHeadApp"
set val(apApp) "Application/AccessPointApp"
proc create_cluster_head_app {
destination_id disseminating_type disseminating_interval
} {
global val
set app_ [new $val(chApp)]
$app_ set destination_id_ $destination_id
$app_ set disseminating_type_ $disseminating_type
$app_ set disseminating_interval_ $disseminating_interval
return $app_
}
proc create_access_point_app {
outside_network
} {
global val
set app_ [new $val(apApp)]
$app_ set outside_network_ $outside_network
return $app_
}
proc create_temp_data_generator {
sensing_interval sensing_type avg_measure std_deviation maximumTemperatureAllowedValue
} {
set temp_gen_ [new DataGenerator/TemperatureDataGenerator]
$temp_gen_ set sensing_interval_ $sensing_interval
$temp_gen_ set sensing_type_ $sensing_type
$temp_gen_ set avg_measure $avg_measure
$temp_gen_ set std_deviation $std_deviation
$temp_gen_ set maximumTemperatureAllowedValue_ $maximumTemperatureAllowedValue
return $temp_gen_
}
proc create_data_generator {
generator sensing_interval sensing_type avg_measure std_deviation maximumTemperatureAllowedValue
} {
set temp_gen_ [new DataGenerator/$generator]
$temp_gen_ set sensing_interval_ $sensing_interval
if {
$sensing_type=="continuous"
} {
$temp_gen_ set sensing_type_ 0
} elseif {
$sensing_type=="programmed"
} {
$temp_gen_ set sensing_type_ 1
} elseif {
$sensing_type=="on demand"
} {
$temp_gen_ set sensing_type_ 2
} else {
$temp_gen_ set sensing_type_ $sensing_type
}
$temp_gen_ set avg_measure $avg_measure
$temp_gen_ set std_deviation $std_deviation
$temp_gen_ set maximumTemperatureAllowedValue_ $maximumTemperatureAllowedValue
return $temp_gen_
}
proc create_common_node {
iniEnergy x y z father_addr start stop
} {
global val ns_ node_ topo udp_ app_ gen_ contador_nodos rng trace
if {
[llength $start] == 0
} {
set start [expr $val(start) + [$rng uniform 0 1]]
set stop $val(stop)
}
$ns_ node-config -sensorNode ON \
-adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(antenna) \
-propType $val(prop) \
-energyModel $val(en) \
-phyType $val(netif) \
-channelType $val(chan) \
-topoInstance $topo \
-agentTrace $trace(agent) \
-routerTrace $trace(router) \
-macTrace $trace(mac) \
-rxPower 0.024 \
-txPower 0.036 \
-initialEnergy $iniEnergy \
-movementTrace $trace(movement)
set node_($contador_nodos) [$ns_ node]
$node_($contador_nodos) random-motion 0
#set x [$rng uniform 0.0 $val(x)]
#set y [$rng uniform 0.0 $val(y)]
#set bla [expr int(sqrt($val(nn)))]
#set x [expr (($contador_nodos) % $bla) * $val(x) / ($bla - 1)]
#set y [expr (($contador_nodos) / $bla) * $val(y) / ($bla - 1)]
$node_($contador_nodos) set X_ $x
$node_($contador_nodos) set Y_ $y
$node_($contador_nodos) set Z_ $z
puts "* Node [$node_($contador_nodos) node-addr] = $contador_nodos created in ($x, $y, $z)"
set app_($contador_nodos) [create_common_app $father_addr $val(disseminating_type) $val(disseminating_interval)]
if {
$val(leach) == 1
} {
set agent [new Agent/RCAgent]
$agent set sport_ 0
$agent set dport_ 0
$node_($contador_nodos) attach $agent 0
$app_($contador_nodos) attach-agent $agent
$agent add-ll [$node_($contador_nodos) set ll_(0)] [$node_($contador_nodos) set mac_(0)]
} else {
set udp_($contador_nodos) [new Agent/UDP]
$node_($contador_nodos) attach $udp_($contador_nodos) $val(port)
}
$node_($contador_nodos) add-app $app_($contador_nodos)
set processing_($contador_nodos) [new $val(processing)]
$app_($contador_nodos) node $node_($contador_nodos)
if {
$val(leach) != 1
} {
$app_($contador_nodos) attach-agent $udp_($contador_nodos)
}
$app_($contador_nodos) attach-processing $processing_($contador_nodos)
$processing_($contador_nodos) node $node_($contador_nodos)
for {
set i 0
} {
$i < [llength $start]
} {
incr i
} {
$ns_ at $start "$app_($contador_nodos) start"
}
for {
set i 0
} {
$i < [llength $stop]
} {
incr i
} {
$ns_ at $stop "$app_($contador_nodos) stop"
}
#[create_temp_data_generator 5.0 0 27.0 10.0 50]
set gen_($contador_nodos) $val(data_generator)
$app_($contador_nodos) attach_data_generator $gen_($contador_nodos)
incr contador_nodos
}
proc create_cluster_head_node {
iniEnergy x y z father_addr start stop
} {
global val ns_ node_ topo udp_ app_ gen_ contador_nodos rng trace
if {
[llength $start] == 0
} {
set start [expr $val(start) + [$rng uniform 0 1]]
set stop $val(stop)
}
$ns_ node-config -sensorNode ON \
-adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(antenna) \
-propType $val(prop) \
-energyModel $val(en) \
-phyType $val(netif) \
-channelType $val(chan) \
-topoInstance $topo \
-agentTrace $trace(agent) \
-routerTrace $trace(router) \
-macTrace $trace(mac) \
-rxPower 0.024 \
-txPower 0.036 \
-initialEnergy $iniEnergy \
-movementTrace $trace(movement)
set node_($contador_nodos) [$ns_ node]
$node_($contador_nodos) random-motion 0
#set x [$rng uniform 0.0 $val(x)]
#set y [$rng uniform 0.0 $val(y)]
#set bla [expr int(sqrt($val(nn)))]
#set x [expr (($contador_nodos) % $bla) * $val(x) / ($bla - 1)]
#set y [expr (($contador_nodos) / $bla) * $val(y) / ($bla - 1)]
$node_($contador_nodos) set X_ $x
$node_($contador_nodos) set Y_ $y
$node_($contador_nodos) set Z_ $z
puts "* Cluster head [$node_($contador_nodos) node-addr] = $contador_nodos created in ($x, $y, $z)"
set udp_($contador_nodos) [new Agent/UDP]
set app_($contador_nodos) [create_cluster_head_app $father_addr $val(disseminating_type) $val(disseminating_interval)]
$node_($contador_nodos) attach $udp_($contador_nodos) $val(port)
$node_($contador_nodos) add-app $app_($contador_nodos)
#CN#set processing_($contador_nodos) [new $val(processing)]
$app_($contador_nodos) node $node_($contador_nodos)
$app_($contador_nodos) attach-agent $udp_($contador_nodos)
#CN#$app_($contador_nodos) attach-processing $processing_($contador_nodos)
$processing_($contador_nodos) node $node_($contador_nodos)
for {
set i 0
} {
$i < [llength $start]
} {
incr i
} {
$ns_ at $start "$app_($contador_nodos) start"
}
for {
set i 0
} {
$i < [llength $stop]
} {
incr i
} {
$ns_ at $stop "$app_($contador_nodos) stop"
}
#CN#set gen_($contador_nodos) $val(data_generator)
#CN#$app_($contador_nodos) attach_data_generator $gen_($contador_nodos)
incr contador_nodos
}
proc create_access_point {
iniEnergy x y z start stop
} {
global ns_ val node_ app_ udp_ contador_nodos topo trace rng
if {
[llength $start] == 0
} {
set start [expr $val(start) + [$rng uniform 0 1]]
set stop $val(stop)
}
$ns_ node-config -sensorNode ON \
-adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(antenna) \
-propType $val(prop) \
-energyModel $val(en) \
-phyType $val(netif) \
-channelType $val(chan) \
-topoInstance $topo \
-agentTrace $trace(agent) \
-routerTrace $trace(router) \
-macTrace $trace(mac) \
-rxPower 0.5 \
-txPower 0.5 \
-initialEnergy $iniEnergy \
-movementTrace $trace(movement)
set node_($contador_nodos) [$ns_ node]
$node_($contador_nodos) random-motion 0
set app_($contador_nodos) [create_access_point_app [$node_(0) node-addr]]
if {
$val(leach) == 1
} {
set agent [new Agent/RCAgent/LeachAgent]
$agent set sport_ 0
$agent set dport_ 0
$node_($contador_nodos) attach $agent 0
$app_($contador_nodos) attach-agent $agent
$agent add-ll [$node_($contador_nodos) set ll_(0)] [$node_($contador_nodos) set mac_(0)]
} else {
set udp_($contador_nodos) [new Agent/UDP]
$node_($contador_nodos) attach $udp_($contador_nodos) $val(port)
$app_($contador_nodos) attach-agent $udp_($contador_nodos)
}
$node_($contador_nodos) set X_ $x
$node_($contador_nodos) set Y_ $y
$node_($contador_nodos) set Z_ $z
puts "* Access point [$node_($contador_nodos) node-addr] = $contador_nodos created in ($x, $y, $z)"
for {
set i 0
} {
$i < [llength $start]
} {
incr i
} {
$ns_ at $start "$app_($contador_nodos) start"
}
for {
set i 0
} {
$i < [llength $stop]
} {
incr i
} {
$ns_ at $stop "$app_($contador_nodos) stop"
}
incr contador_nodos
}
###
# Grid distribution.
proc get_next_x {
} {
global val
set aux [expr int(sqrt($val(nn)))]
return [expr (($contador_nodos) % $aux) * $val(x) / ($aux - 1)]
}
proc get_next_y {
} {
global val
set aux [expr int(sqrt($val(nn)))]
return [expr (($contador_nodos) / $aux) * $val(y) / ($aux - 1)]
}
####
# Calculating the receiving threshold (RXThresh_ for Phy/Wireless)
# Wei Ye, weiye@isi.edu, 2000
proc Friis {
Pt Gt Gr lambda L d
} {
set M [expr $lambda / (4 * 3.14159265359 * $d)]
return [expr ($Pt * $Gt * $Gr * ($M * $M)) / $L]
}
proc TwoRay {
Pt Gt Gr ht hr L d lambda
} {
set crossover_dist [expr (4 * 3.14159265359 * $ht * $hr) / $lambda]
if {
$d < $crossover_dist
} {
return [Friis $Pt $Gt $Gr $lambda $L $d]
} else {
return [expr $Pt * $Gt * $Gr * ($hr * $hr * $ht * $ht) / ($d * $d * $d * $d * $L)]
}
}
###
proc set_default_settings {
} {
global val
####
# Default network settings
set val(antenna) "Antenna/OmniAntenna"
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 ;
###
# Using Mica 2 Mote settings
set val(range) 100
setup_mica2 $val(antenna) $val(range)
set val(bandwidth) [Phy/WirelessPhy set bandwidth_]
set val(mac)Mac/802_11
set val(ifq)Queue/DropTail
set val(ifqlen)200
set val(ll)LL
set val(rp)"LEACH"
# Configuration adjustment
if {
$val(rp) == "LEACH"
} {
set val(rp) DumbAgent
set val(leach) 1
if {
$val(ll) != "RCALinkLayer"
} {
puts "LEACH requires RCALinkLayer! Forcing it!!!"
set val(ll)RCALinkLayer
}
if {
$val(netif) != "Phy/WirelessPhy/LeachWirelessPhy"
} {
puts "LEACH requires LeachWirelessPhy! Forcing it!!!"
set val(netif) Phy/WirelessPhy/LeachWirelessPhy
}
if {
$val(mac) != "Mac/Sensor"
} {
puts "LEACH requires Mac/Sensor! Forcing it!!!"
set val(mac) Mac/Sensor
}
set val(port) 0
Agent/RCAgent set sport_ $val(port)
Agent/RCAgent set dport_ $val(port)
Agent/RCAgent set packetMsg_ 0
Agent/RCAgent set distEst_ 0
Agent/RCAgent set packetSize_ 0
RCALinkLayer set delay_ 25us
RCALinkLayer set bandwidth_ [Phy/WirelessPhy set bandwidth_]
RCALinkLayer set off_prune_ 0
RCALinkLayer set off_CtrMcast_ 0
RCALinkLayer set macDA_ 0
RCALinkLayer set debug_ 0
} else {
set val(leach) 0
}
if {
$val(rp) == "DIRECTED DIFFUSION"
} {
set val(rp) "Directed_Diffusion"
}
}
set val(father_addr) 0
set val(port)2020
set val(netif)Phy/WirelessPhy
set_default_settings
# Global network settings
set contador_nodos 0
set val(chan)Channel/WirelessChannel
# Propagation
set val(prop)Propagation/TwoRayGround
# Energy model
set val(en)EnergyModel/Battery
# Nodes
set val(n_pas)1
set val(n_common) 10
set val(n_ch) 0
set val(nn)[expr $val(n_pas) + $val(n_common) + $val(n_ch)]
puts "\nNodes count:"
puts " - $val(n_pas) access points"
puts " - $val(n_common) common nodes"
puts " - $val(n_ch) cluster heads"
puts " - $val(nn) nodes"
puts " - $val(rp) routing protocol"
puts " - $val(ll) link layer"
puts " - $val(netif) network interface"
# Scenario size
set val(x)100.0
set val(y)100.0
puts "\nScenario size: $val(x) x $val(y)"
set val(start)0.0
set val(stop)[expr $val(start) + 100.0]
set ns_[new Simulator]
# Trace
puts "\nUsing trace.tr as trace file"
set traceFile[open trace.tr w]
$ns_ trace-all $traceFile
$ns_ use-newtrace
set trace(mac) ON
set trace(router) ON
set trace(agent) ON
set trace(movement) ON
set topo[new Topography]
$topo load_flatgrid $val(x) $val(y)
create-god $val(nn)
set rng [new RNG]
$rng seed [clock seconds]
#-------------------------------------------------------------------------------------------
# Creating an access point
puts "Creating an access point..."
set_default_settings
# Using Mica 2 Mote settings
puts "Using mica 2 mote settings"
set val(range) 100
setup_mica2 $val(antenna) $val(range)
set local(x) 50.0
set local(y) 50.0
set local(z) 0.0
set local(start) ""
set local(stop) ""
set local(energy) 100.0
set val(apApp) Application/AccessPointApp/AccessPointLeachApp
create_access_point $local(energy) $local(x) $local(y) $local(z) $local(start) $local(stop)
# Creating common node
puts "Creating common node..."
set_default_settings
# Using Mica 2 Mote settings
puts "Using mica 2 mote settings"
set val(range) 100
setup_mica2 $val(antenna) $val(range)
# Disseminating settings
set val(disseminating_type) 1;# Programmed
puts "Setting disseminating type to programmed"
set val(disseminating_interval)20.0
puts "Setting disseminating interval: $val(disseminating_interval)"
set local(start) ""
set local(stop) ""
set local(energy) 10.0
set local(father_addr) $val(father_addr)
set val(processing) Processing/AggregateProcessing
set val(data_generator) "[create_data_generator {
TemperatureDataGenerator
} {
5.0
} {
programmed
} {
25.0
} {
5.0
} {
30.0
}]"
for {
set common_node_i 0
} {
$common_node_i < 10
} {
incr common_node_i
} {
set local(x) [$rng uniform 0.0 $val(x)]
set local(y) [$rng uniform 0.0 $val(y)]
set local(z) 0.0
set val(commonApp) Application/SensorBaseApp/CommonNodeApp/LeachApp
create_common_node $local(energy) $local(x) $local(y) $local(z) $local(father_addr) $local(start) $local(stop)
}
$ns_ at [expr $val(stop)] "flush stdout"
$ns_ at [expr $val(stop)+0.0001] "finish"
proc finish {
} {
global ns_ traceFile namtrace tempoInicio val
$ns_ flush-trace
# close $namtrace
$ns_ halt
$ns_ flush-trace
$ns_ nam-end-wireless $val(stop)
close $traceFile
flush stdout
exit 0
}
puts "Starting Simulation..."
$ns_ run
No comments:
Post a Comment