文章目录
概要
简单记录mit包中ns-leach.tcl代码的功能 代码运行时不能有中文注释,ns2不支持,代码中文为自己手动添加 以便代码理解
# Message Constants
set ADV_CH 0
set JOIN_REQ 1
set ADV_SCH 2
set DATA 3
set MAC_BROADCAST 0xffffffff
set LINK_BROADCAST 0xffffffff
set BYTES_ID 2
定义了一些常量,用于消息类型和广播地址。
LEACH Application
定义一个名为 Application/LEACH 的类,继承自 Application 类
Class Application/LEACH -superclass Application
init
定义init 方法,初始化Application/LEACH 的实例变量,如当前是否是簇头 (isch_)、是否已经进行过簇头选择 (hasbeench_)、下次状态变化的时间 (next_change_time_)、当前轮次 (round_) .
# 定义init 方法对 Application/LEACH 类进行初始化
Application/LEACH instproc init args {
global opt cluster_count_ #opt 通常用于存储配置选项 cluster_count_ 用于存储簇的数量
#声明多个实例变量
$self instvar rng_ isch_ hasbeench_ next_change_time_ round_
$self instvar clusterChoices_ clusterDist_ clusterNodes_ currentCH_
$self instvar xmitTime_ TDMAschedule_ dist_ code_
$self instvar now_ alive_ frame_time_ end_frm_time_
$self instvar begin_idle_ begin_sleep_
$self instvar myADVnum_ receivedFrom_ dataReceived_
# 初始化所有实例变量为默认值
set rng_ [new RNG]
$rng_ seed 0
set isch_ 0
set hasbeench_ 0
set next_change_time_ 0
set round_ 0
set clusterChoices_ ""
set clusterDist_ ""
set clusterNodes_ ""
set currentCH_ ""
set xmitTime_ ""
set TDMAschedule_ ""
set dist_ 0
set code_ 0
set now_ 0
set alive_ 1
set frame_time_ $opt(frame_time)
set end_frm_time_ 0
set begin_idle_ 0
set begin_sleep_ 0
set myADVnum_ 0
set receivedFrom_ ""
set dataReceived_ ""
set cluster_count_ 0
$self next $args
}
Application/LEACH instproc start {
} {
global cluster_count_
global time1
[$self mac] set node_num_ [$self nodeID]
$self decideClusterHead
$self checkAlive
set time1 0
}
Application/LEACH instproc start {
} {
global cluster_count_
global time1
[$self mac] set node_num_ [$self nodeID]
$self decideClusterHead
$self checkAlive
set time1 0
}
start
定义了 start 方法,开始时调用 decideClusterHead 决定簇头,并调用 checkAlive 检查节点存活状态。
Application/LEACH instproc start {
} {
global cluster_count_
global time1
[$self mac] set node_num_ [$self nodeID]
$self decideClusterHead
$self checkAlive
set time1 0
}
Helper Functions
Application/LEACH instproc getRandomNumber {
llim ulim} {
$self instvar rng_
return [$rng_ uniform $llim $ulim]
}
Application/LEACH instproc node {
} {
return [[$self agent] set node_]
}
Application/LEACH instproc nodeID {
} {
return [[$self node] id]
}
Application/LEACH instproc mac {
} {
return [[$self node] set mac_(0)]
}
Application/LEACH instproc getX {
} {
return [[$self node] set X_]
}
Application/LEACH instproc getY {
} {
return [[$self node] set Y_]
}
Application/LEACH instproc getER {
} {
set er [[$self node] getER]
return $er
}
}
这些是辅助函数,用于获取随机数、节点ID、MAC地址、节点位置、能量状态。
GoToSleep
Application/LEACH instproc GoToSleep {
} {
global opt ns_
$self instvar begin_idle_ begin_sleep_
[[$self node] set netif_(0)] set sleep_ 1
# If node has been awake, remove idle energy (e.g., the amount of energy
# dissipated while the node is in the idle state). Otherwise, the node
# has been asleep and must remove sleep energy (e.g., the amount of
# energy dissipated while the node is in the sleep state).
if {
$begin_idle_ > $begin_sleep_} {
set idle_energy [expr $opt(Pidle) * [expr [$ns_ now] - $begin_idle_]]
[$self getER] remove $idle_energy
} else {
set sleep_energy [expr $opt(Psleep) * [expr [$ns_ now] - $begin_sleep_]]
[$self getER] remove $sleep_energy
}
set begin_sleep_ [$ns_ now]
set begin_idle_ 0
}
睡眠函数,让LEACH协议的一个节点进入睡眠状态,并根据节点之前的状态(空闲或已睡眠)来更新其能量消耗。begin_idle_和begin_sleep_,分别用于存储节点进入空闲状态和睡眠状态的时间戳。
WakeUp
Application/LEACH instproc WakeUp {
} {
global opt ns_
$self instvar begin_idle_ begin_sleep_
[[$self node] set netif_(0)] set sleep_ 0
# If node has been asleep, remove sleep energy (e.g., the amount of energy
# dissipated while the node is in the sleep state). Otherwise, the node
# has been idling and must remove idle energy (e.g., the amount of
# energy dissipated while the node is in the idle state).
if {
$begin_sleep_ > $begin_idle_} {
set sleep_energy [expr $opt(Psleep) * [expr [$ns_ now] - $begin_sleep_]]
[$self getER] remove $sleep_energy
} else {
set idle_energy [expr $opt(Pidle) * [expr [$ns_ now] - $begin_idle_]]
[$self getER] remove $idle_energy
}
set begin_idle_ [$ns_ now]
set begin_sleep_ 0
}
唤醒函数。用于定义一个实例过程WakeUp,让LEACH协议中的一个节点从睡眠状态唤醒,并根据节点之前的状态(睡眠或空闲)来更新其能量消耗记录。[[$self node] set netif_(0)] set sleep_ 0
:这行代码通过$self node获取当前节点的引用,然后访问其第一个网络接口(假设为netif_(0)),并将sleep_属性设置为0,以指示MAC层从睡眠状态唤醒。
setCode
Application/LEACH instproc setCode code {
$self instvar code_
set code_ $code
[$self mac] set code_ $code
setCode函数向LEACH协议的节点上设置一个标识符code,并尝试在节点的MAC层上也进行相同的设置。
checkAlive
Application/LEACH instproc checkAlive {
} {
global ns_ chan opt node_
$self instvar alive_ TDMAschedule_
$self instvar begin_idle_ begin_sleep_
set ISalive [[[$self node] set netif_(0)] set alive_]
if {
$alive_ == 1} {
if {
$ISalive == 0} {
puts "Node [$self nodeID] is DEAD!!!! - ns-leach.tcl"
$chan removeif [[$self node] set netif_(0)]
set alive_ 0
set opt(nn_) [expr $opt(nn_) - 1]
if {
$opt(rcapp) == "LEACH-C/StatClustering" && \