ns-leach.tcl代码分析

概要

简单记录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" && \
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值