leach 分析1对wireless.tcl进行了简要的分析,接下来对Uamps.tcl脚本进行分析。
set opt(Efriss_amp) [expr [expr 1.1 * $opt(RXThresh) * 16 * $PI * $PI] / \
[expr $opt(bw) * $opt(Gt) * $opt(Gr) * $l * $l]]
# Etwo_ray_amp = RXThresh / (Rb Gt Gr ht^2 hr^2)
set opt(Etwo_ray_amp) [expr 1.1 * $opt(RXThresh) / \
[expr $opt(bw) * $opt(Gt) * $opt(Gr) * \
$opt(ht) * $opt(ht) * $opt(ht) * $opt(ht)]]
set opt(EXcvr) 50e-9 ;# Energy for radio circuitry
set opt(e_bf) 5e-9 ;# Beamforming energy (J/bit)
set opt(Esense) 0 ;# Sensing energy (J/bit)
set opt(thresh_energy) 0.00 ;# Threshold for power adaptation
set opt(Pidle) 0 ;# Idle power (W)
set opt(Psleep) 0 ;# Sleep power (W)
set initialized 0
set rng_ [new RNG]#用于产生随机数
首先往opt数组里面添加一些变量,并对这些变量进行初化。opt(Psleep) ,opt(Pidle),set opt(thresh_energy)在ns-leach.tcl中使用到,这个是计算单位时间空闲所消耗的能量和休眠所消耗的能量。
这个脚本主要是创建leach节点:
if {$initialized == 0} {
#remove old trace
sens_init
set initialized 1
}
# Remove old trace files.
catch "eval exec rm [glob -nocomplain $opt(dirname)/TDMAschedule.*.txt]"
catch "exec rm $opt(dirname)/$opt(filename).energy"
catch "exec rm $opt(dirname)/$opt(filename).data"
catch "exec rm $opt(dirname)/$opt(filename).alive"
catch "exec rm $opt(dirname)/startup.energy"
catch "exec rm $opt(dirname)/init.energy"
如果没有初始化过,则将将以前的跟踪文件删除,接着回到创建leach的函数中,创建节点:
if {$id != $opt(nn_)} {
puts -nonewline "$id "
#important
set node_($id) [new MobileNode/ResourceAwareNode]
} else {
puts "($opt(nn_) == BS)"
set node_($id) [new MobileNode/ResourceAwareNode $BS_NODE]
}
如果不是簇头节点则将$opt(nn_)-1个节点设置为一般节点,将$opt(nn_)设置为BS节点。newMobileNode/ResourceAwareNode函数是在ns-ranode.tcl中。分析完这个我们接下来分析newMobileNode/ResourceAwareNode这个函数。
set node $node_($id)
if {$id != $opt(nn_)} {
# Set initial node energy.
if {$opt(eq_energy) == 1} {
$node set-energy $opt(init_energy) $opt(thresh_energy)
} else {
由于eq-energy在leach-test中给定,将eq-energy=1;则每个节点都会对能量尽享初始化,设置节点的初始能量和门槛能量(个人理解,死亡能量)。
set high_e_nodes [list 97 19 12 87 8 22 83 55 34 72]
if {[lsearch $high_e_nodes $id] == -1} {
set E 2
} else {
set E 200
}
$node set-energy $E $opt(thresh_energy)
set initf [open "$opt(dirname)/init.energy" a]
puts $initf "$id\t$E"
close $initf
将不属于list中的能量初始化能量设置为2,将属于list中的能量设置为200.并将初始化能量写到init.energy中,将节点id和节点初始能量写进去。
else {
# Base station has an infinite amount of energy.
$node set-energy 50000 $opt(thresh_energy)
}
节点问簇头节点,则将节点的初始化能量设置为50000,能量无限。
到此为止,创建节点完成并将每个节点的能量初始化完成。下一节将分析ns-ranode.tcl脚本。区分普通节点和簇头节点的不同。
接下来是配置节点信道和跟踪文件:
$ns_ at 0.0 "$node_($id) start-app" ns在0的时候启动应用,应用在ns-ranode.tcl中分析。