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

arrow
arrow
    全站熱搜

    NS2lab 發表在 痞客邦 留言(0) 人氣()