2007.10.17
利用了先前做過的 Wireless-Ping 去作電量的分析。
雖然是之前做過的 Wireless-Ping,不過這次的有稍加修改以及省下一些設定,所以模擬出來會跟之前有點不同。
程式碼如下:
#===================================================================
# Define options
#===================================================================
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(nn) 3 ;# number of mobilenodes
set val(rp) DSDV ;# routing protocol
set val(batterymodel) Battery/Simple ;# battery model
set val(batterymonitor) "on"
set val(initialenergy) 3 ;# Initial battery capacity
set val(radiomodel) Radio/Simple ;# generic radio hardware
set val(receivepower) 2 ;# Receiving Power
set val(transmitpower) 5 ;# Transmitting Power
set val(idlepower) 0.05 ;# Idle Power
#===================================
# 設定傳輸以及接收範圍-100
#===================================
Phy/WirelessPhy set freq_ 0.00149896069882414670
Phy/WirelessPhy set RXThresh_ 1.42681e-08
Phy/WirelessPhy set CSThresh_ 1.42681e-08
Phy/WirelessPhy set Pt_ 0.28183815
#===================================
# Initialization
#===================================
# Create a ns simulator
set ns [new Simulator]
set tracefd [open WLping.tr w]
$ns use-newtrace
# 新的 Trace 電量只顯示一個總電量,對於要寫 awk 就可以不用考慮其他的因素
# 因為在這次的模擬,我的寫法只考慮總電能而已
$ns trace-all $tracefd
# Open the NAM trace file
set namfile [open out.nam w]
$ns namtrace-all $namfile
$ns namtrace-all-wireless $namfile 100 100
# set up topography object
set topo [new Topography]
$topo load_flatgrid 100 100
create-god $val(nn)
# Create channel
set chan [new $val(chan)]
# configure node
$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 $chan \
-topoInstance $topo \
-agentTrace ON \
-routerTrace ON \
-macTrace ON \
-movementTrace ON \
-energyModel "EnergyModel" \
-initialEnergy $val(initialenergy) \
-rxPower $val(receivepower) \
-txPower $val(transmitpower) \
-idlePower $val(idlepower)
# Generating nodes
for {set i 0} {$i < $val(nn) } {incr i} {
set node($i) [$ns node]
}
# Provide initial (X,Y, for now Z=0) co-ordinates for mobilenodes
$node(0) set X_ 0.0
$node(0) set Y_ 0.0
$node(0) set Z_ 0.0
$ns initial_node_pos $node(0) 20
$node(1) set X_ 0.0
$node(1) set Y_ 99
$node(1) set Z_ 0.0
$ns initial_node_pos $node(1) 20
$node(2) set X_ 99
$node(2) set Y_ 0.0
$node(2) set Z_ 0.0
$ns initial_node_pos $node(2) 20
# Create two ping agents and attach them to the nodes n0 and n2
set p0 [new Agent/Ping]
$ns attach-agent $node(0) $p0
set p1 [new Agent/Ping]
$ns attach-agent $node(2) $p1
# Connect the two agents
$ns connect $p0 $p1
# Create udp agents and attach them to the nodes n1 and n2
set udp0 [new Agent/UDP]
$ns attach-agent $node(1) $udp0
set null0 [new Agent/Null]
$ns attach-agent $node(0) $null0
# Connect the two agents
$ns connect $udp0 $null0
# Setup a CBR Application over UDP connection
set cbr0 [new Application/Traffic/CBR]
$cbr0 attach-agent $udp0
$cbr0 set type_ CBR
$cbr0 set rate_ 1mb
$cbr0 set packet_size_ 1000
$cbr0 set random_ false
$ns at 0.5 "$cbr0 start"
$ns at 5.0 "$cbr0 stop"
proc finish {} {
global ns tracefd namfile
$ns flush-trace
close $tracefd
close $namfile
exec nam out.nam &
exit 0
}
# Define a 'recv' function for the class 'Agent/Ping'
Agent/Ping instproc recv {from rtt} {
$self instvar node_
puts "node [$node_ id] received ping answer from $from with round-trip-time $rtt ms."
}
for {set i 0} {$i<3} {incr i} {
$ns at [expr $i+0.3] "$p0 send"
$ns at [expr $i+0.5] "$p1 send"
$ns at [expr $i+0.7] "$p0 send"
$ns at [expr $i+0.9] "$p1 send"
}
$ns at 5.5 "finish"
# Run the Simulation
puts "Starting Simulation..."
$ns run
// =======================================================================
接著是針對節點(2)的 awk 分析,我是利用新版的 Trace 只抓想分析的位置即可。
程式的邏輯是 action 為 N 就跳掉往下一串資料讀取,因為 N 不是要考慮的狀態,要考慮的是接收或者傳送時的狀態,接著只抓取『時間』、『節點』、『能量』,這三個狀態去分析。
1. 時間用來計算此筆資料與下一筆資料的間隔時間。 (startT-endT)
2. 節點是要只針對第二個節點。 (可以稍加修改,就可以針對節點 0 與節點 1 去分析)
3. 能量用來計算在此資料與下一筆資料的間隔時間所消耗的能量,再用總能量去扣掉,即為剩下來的能量 (RemainE)
程式碼如下:
# 此 awk 只針對上面的 tcl 所寫
BEGIN {
energyI = 0; ;# 第一筆電量
energyE = 0; ;# 第二筆電量
startT = 0; ;# 開始測量的時間
endT = 0; ;# 結束測量的時間
RemainE = 3; ;# 因為 tcl 設定的基本電量為 3 ,所以設定剩下來的電量為 3 開始
}
{
action = $1; ;# 抓取狀態
time = $3; ;# 抓取時間
node = $5; ;# 抓取節點
energy = $17; ;# 抓取能量
if(action!="N" && energyI==0 && startT==0) { ;# 抓取第一筆時間及能量
startT = time;
energyI = energy;
}
else { ;# 抓取第二筆時間及能量
endT = time;
energyE = energy;
}
if(action!="N" && node==2 && energyE >=0 && endT>=0 && startT<endT) {
# 節點為 2、有能量、有時間,此時則計算此時間點所剩下來的能量 (總能量扣掉間隔時間消耗的能量)
RemainE = RemainE-(energyI-energyE);
printf("%.10f %.10f\n",endT,RemainE);
# 顯示的資料為此時間點以及剩下來的能量,以這兩個資料用 Gnuplot 去畫能量消耗圖
startT = time;
energyI = energy;
# 接著又重新設定開始時間以及開始能量為第二筆資料,這樣才可以一筆一筆的重複計算下去
}
}
END {
}
下圖為節點 2 的電量消耗圖,相簿裡還有節點 0 與節點 1,可以稍微去比較一下三節點之間的差別。
歡迎對於 NS2 有研究或見解的同學、朋友可以一起討論 by Yo PM 06:42
留言列表