Overview:
Underwater acoustic communication is a technique of sending and receiving message below water. There are several ways of employing such communication but the most common is using hydrophones. Under water communication is difficult due to factors like multi-path propagation, time variations of the channel, small available bandwidth and strong signal attenuation, especially over long ranges. In underwater communication there are low data rates compared to terrestrial communication, since underwater communication uses acoustic waves instead of electromagnetic waves.
Aqua-Sim Overview
Aqua-Sim can effectively simulate acoustic signal attenuation and packet collisions in underwater sensor networks. Moreover, Aqua-Sim supports three-dimensional deployment. Further, Aqua-Sim can easily be integrated with the existing codes in NS-2. Aqua-Sim is in parallel with the CMU wireless simulation package. As shown in the figure below, Aqua-Sim is independent of the wireless simulation package and is not affected by any change in the wireless package. On the other hand, any change to Aqua-Sim is also confined to itself and does not have any impact on other packages in NS-2. In this way, Aqua-Sim can evolve independently.
Advantages of Aqua-Sim
- Discrete-event driven network simulator
- Support 3D networks and mobile networks
- Simulate underwater acoustic channels with high fidelity
- Implement a complete protocol stack from physical layer to application layer
Aqua-sim in ns2:
TCL file:
set opt(chan) Channel/UnderwaterChannel
set opt(prop) Propagation/UnderwaterPropagation
set opt(netif) Phy/UnderwaterPhy
set opt(mac) Mac/UnderwaterMac/BroadcastMac
set opt(ifq) Queue/DropTail
set opt(ll) LL
set opt(energy) EnergyModel
set opt(txpower) 0.6
set opt(rxpower) 0.3
set opt(initialenergy) 10000
set opt(idlepower) 0.01
set opt(ant) Antenna/OmniAntenna ;#we don't use it in underwater
set opt(filters) GradientFilter ;# options can be one or more of
;# TPP/OPP/Gear/Rmst/SourceRoute/Log/TagFilter
set opt(max_pkts) 300
set opt(interval_) 0.2 ;# [lindex $argv 0]
set opt(pkt_len) 80; #[lindex $argv 2] ;# pkt length of cbr
# the following parameters are set fot protocols
set opt(bit_rate) 5.0e3 ;#[lindex $argv 1];#1.0e4 ;#bandwidth of the phy link
set opt(encoding_efficiency) 1
set opt(ND_window) 1
set opt(ACKND_window) 1
set opt(PhaseOne_window) 3
set opt(PhaseTwo_window) 1
set opt(PhaseTwo_interval) 0.5
set opt(IntervalPhase2Phase3) 1
set opt(duration) 0.1
set opt(PhyOverhead) 8
set opt(large_packet_size) 480 ;# 60 bytes
set opt(short_packet_size) 40 ;# 5 bytes
set opt(PhaseOne_cycle) 4 ;
set opt(PhaseTwo_cycle) 2 ;
set opt(PeriodInterval) 2
set opt(transmission_time_error) 0.0001;
set opt(dz) 10
set opt(hop) 7 ;# [lindex $argv 4]
set opt(ifqlen) 50 ;# max packet in ifq
set opt(nn) [expr $opt(hop)+1] ;#5 ;# number of nodes in the network
set opt(layers) 1
set opt(x) 300 ;# X dimension of the topography
set opt(y) 300 ;# Y dimension of the topography
set opt(z) 10
set opt(seed) 648.88
set opt(stop) 1000 ;#[lindex $argv 3] ;#150 ;# simulation time
set opt(prestop) 80 ;# time to prepare to stop
set opt(tr) "uw_rwp.tr" ;# trace file
set opt(nam) "uw_rwp.nam" ;# nam file
set opt(adhocRouting) Vectorbasedforward
set opt(width) 20
set opt(adj) 10
set opt(interval) 0.001
set start_time 10
# ==================================================================
LL set mindelay_ 50us
LL set delay_ 25us
LL set bandwidth_ 0 ;# not used
#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 Z_ 0.05
Antenna/OmniAntenna set Gt_ 1.0
Antenna/OmniAntenna set Gr_ 1.0
Mac/UnderwaterMac set bit_rate_ $opt(bit_rate)
Mac/UnderwaterMac set encoding_efficiency_ $opt(encoding_efficiency)
#Mac/UnderwaterMac/AlohaOverhear set MaxResendInterval_ 0.2
#Mac/UnderwaterMac/AlohaOverhear set DeltaDelay_ 1
Node/MobileNode/UnderwaterSensorNode set position_update_interval_ 1.0
# Initialize the SharedMedia interface with parameters to make
# it work like the 914MHz Lucent WaveLAN DSSS radio interface
Phy/UnderwaterPhy set CPThresh_ 100 ;#10.0
Phy/UnderwaterPhy set CSThresh_ 0 ;#1.559e-11
Phy/UnderwaterPhy set RXThresh_ 0 ;#3.652e-10
#Phy/UnderwaterPhy set Rb_ 2*1e6
Phy/UnderwaterPhy set Pt_ 0.2818
Phy/UnderwaterPhy set freq_ 25 ;#frequency range in khz
Phy/UnderwaterPhy set K_ 2.0 ;#spherical spreading
# ==================================================================
# Main Program
# =================================================================
#
# Initialize Global Variables
#
#set sink_ 1
#remove-all-packet-headers
set ns_ [new Simulator]
set topo [new Topography]
$topo load_cubicgrid $opt(x) $opt(y) $opt(z)
#$ns_ use-newtrace
set tracefd [open $opt(tr) w]
$ns_ trace-all $tracefd
set nf [open $opt(nam) w]
$ns_ namtrace-all-wireless $nf $opt(x) $opt(y)
set total_number [expr $opt(nn)-1]
set god_ [create-god $opt(nn)]
set chan_1_ [new $opt(chan)]
global defaultRNG
$defaultRNG seed $opt(seed)
$ns_ node-config -adhocRouting $opt(adhocRouting) \
-llType $opt(ll) \
-macType $opt(mac) \
-ifqType $opt(ifq) \
-ifqLen $opt(ifqlen) \
-antType $opt(ant) \
-propType $opt(prop) \
-phyType $opt(netif) \
#-channelType $opt(chan) \
-agentTrace ON \
-routerTrace ON \
-macTrace ON \
-movementTrace ON \
-topoInstance $topo\
-energyModel $opt(energy)\
-txpower $opt(txpower)\
-rxpower $opt(rxpower)\
-initialEnergy $opt(initialenergy)\
-idlePower $opt(idlepower)\
-channel $chan_1_
set node_(0) [$ns_ node 0]
#$node_(0) set sinkStatus_ 1
#$node_(0) set passive 1
$god_ new_node $node_(0)
$node_(0) set passive 1
set a_(0) [new Agent/Null]
$node_(0) set-mobilitypattern RWP
$node_(0) set max_speed 5
$node_(0) set min_speed 1
$ns_ attach-agent $node_(0) $a_(0)
for {set i 1} {$i<$total_number} {incr i} {
set node_($i) [$ns_ node $i]
$node_($i) set sinkStatus_ 1
$god_ new_node $node_($i)
$node_($i) set-cx 50
$node_($i) set-cy 50
$node_($i) set-cz 0
$node_($i) set_next_hop [expr $i-1] ;# target is node 0
$node_($i) set-mobilitypattern RWP
$node_($i) set max_speed 5
$node_($i) set min_speed 1
}
#puts "the total number is $total_number"
set node_($total_number) [$ns_ node $total_number]
$god_ new_node $node_($total_number)
$node_($total_number) set-cx 50
$node_($total_number) set-cy 50
$node_($total_number) set-cz 0
$node_($total_number) set_next_hop [expr $total_number-1] ;# target is node 0
$node_($total_number) set-mobilitypattern RWP
$node_($total_number) set max_speed 5
$node_($total_number) set min_speed 1
set a_($total_number) [new Agent/UDP]
$ns_ attach-agent $node_($total_number) $a_($total_number)
$ns_ connect $a_($total_number) $a_(0)
set cbr_(0) [new Application/Traffic/CBR]
$cbr_(0) set packetSize $opt(pkt_len) ;#80
$cbr_(0) set interval_ $opt(interval_)
$cbr_(0) set random 1
$cbr_(0) set maxpkts_ $opt(max_pkts)
$cbr_(0) attach-agent $a_($total_number)
for {set i 0} { $i < $opt(nn)} {incr i} {
$ns_ initial_node_pos $node_($i) 2
$node_($i) setPositionUpdateInterval 0.01
$node_($i) random-motion 0
$ns_ at 5.0 "$node_($i) start-mobility-pattern"
}
$ns_ at $start_time "$cbr_(0) start"
#$ns_ at 15 "$a_($total_number) cbr-start"
#$ns_ at $start_time "$a_($total_number) exp-start"
#$ns_ at 4 "$a_(0) cbr-start"
#$ns_ at 2.0003 "$a_(2) cbr-start"
#$ns_ at 0.1 "$a_(0) announce"
puts "+++++++AFTER ANNOUNCE++++++++++++++"
;#$ns_ at $opt(stop).001 "$a_(0) terminate"
;#$ns_ at $opt(stop).002 "$a_($total_number) terminate"
for {set i 1} {$i<$total_number} {incr i} {
#;$ns_ at $opt(stop).002 "$a_($i) terminate"
$ns_ at $opt(stop).002 "$node_($i) reset"
}
$ns_ at $opt(stop).003 "$god_ compute_energy"
$ns_ at $opt(stop).004 "$ns_ nam-end-wireless $opt(stop)"
$ns_ at $opt(stop).005 "puts \"NS EXISTING...\"; $ns_ halt"
puts $tracefd "vectorbased"
puts $tracefd "M 0.0 nn $opt(nn) x $opt(x) y $opt(y) z $opt(z)"
puts $tracefd "M 0.0 prop $opt(prop) ant $opt(ant)"
puts "starting Simulation..."
$ns_ run
OUTPUTS:
NAM Window:
Trace File:
AQUSIM 3D View: