LEACH协议代码的两个BUG
2011-01-04 21:42
363 查看
LEACH协议代码的两个BUG 收藏
1、能量消耗的问题.LEACH协议运行完后,有个记录节点能量的文件,最后节点的总消耗超过了我们最初设定的2J能量,这个是因为checkalive过程中对死亡的节点只是设置标志,移出信道,但并没有终止其发送数据(数据发送不出,但能量继续消耗).解决方法就是:对死亡节点的处理代码最后加一句 $self GoToSleep就可以了,虽然加这个不"正规",但意思到了,就是要死亡节点停止所有的活动就可以了
那是因为在节点死掉了以后,程序中,节点还在发送数据包。在bs_app.tcl 中,BS节点收到数据后,发现发送的节点已经死了,则忽略其发送的数据。但是在计算节点能量,也就是ns-leach.tcl文件中的 checkalive函数中,在一个周期内,不管节点死了没有,它发送数据消耗的能量都被计算到leach.energy文件中去了。
Application/LEACH instproc checkAlive {} {
global ns_ chan opt node_
$self instvar alive_ TDMAschedule_
$self instvar begin_idle_ begin_sleep_
# Check the alive status of the node. If the node has run out of
# energy, it no longer functions in the network.
set ISalive [[[$self node] set netif_(0)] set alive_]
if {$alive_ == 1} {
if {$ISalive == 0} {
puts "Node [$self nodeID] is DEAD!!!!"
$chan removeif [[$self node] set netif_(0)]
set alive_ 0
set opt(nn_) [expr $opt(nn_) - 1]
if {$opt(rcapp) == "LEACH-C/StatClustering" && /
[$self isClusterHead?]} {
foreach element $TDMAschedule_ {
if {$element != [$self nodeID]} {
puts "Node $element is effectively DEAD!!!!"
$chan removeif [$node_($element) set netif_(0)]
[$node_($element) set netif_(0)] set alive_ 0
[$node_($element) set rca_app_] set alive_ 0
set opt(nn_) [expr $opt(nn_) - 1]
}
}
}
#To solove the Energy consumed > Totle Energy bug
$self GoToSleep
} else {
$ns_ at [expr [$ns_ now] + 0.1] "$self checkAlive"
if {$begin_idle_ >= $begin_sleep_} {
set idle_energy [expr $opt(Pidle) * [expr [$ns_ now] - $begin_idle_]]
[$self getER] remove $idle_energy
set begin_idle_ [$ns_ now]
} else {
set sleep_energy [expr $opt(Psleep) * [expr [$ns_ now] - $begin_sleep_]]
[$self getER] remove $sleep_energy
set begin_sleep_ [$ns_ now]
}
}
}
if {$opt(nn_) < $opt(num_clusters)} "sens_finish"
}
2、新版本不兼容旧版本的一些参数,在*.out文件中会出现发送时的一些错误.解决方法:将NS-LAECH.TCL文件中第654行的dst_换成dst_addr就可以了.
Application/LEACH instproc send_now {mac_dst link_dst type msg /
data_size dist code} {
[$self agent] set packetMsg_ $type
[$self agent] set dst_addr_ $mac_dst
[$self agent] sendmsg $data_size $msg $mac_dst $link_dst $dist $code
}
讲这2个bug修复之后,leach协议可以说已经安装成功了,剩下的就是将程序运行起来,然后分析分析运行之后的结果,可以对比leach和leach-c这两者的区别。
我想说要搞明白leach协议的种种并不是一件简单的事,需要花费很多时间和精力,如果想速成的话是不会有很好的结果的,所以建议是反复的研究安装leach时修改的那些文件,一定要搞清楚每个文件都是干什么的,以及修改leach协议的参数在哪里修改,网络拓扑在哪里修改等等,需要搞清楚,才能明白。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xinxiuz/archive/2010/03/10/5364888.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qq361301276/archive/2010/05/31/5638119.aspx
1、能量消耗的问题.LEACH协议运行完后,有个记录节点能量的文件,最后节点的总消耗超过了我们最初设定的2J能量,这个是因为checkalive过程中对死亡的节点只是设置标志,移出信道,但并没有终止其发送数据(数据发送不出,但能量继续消耗).解决方法就是:对死亡节点的处理代码最后加一句 $self GoToSleep就可以了,虽然加这个不"正规",但意思到了,就是要死亡节点停止所有的活动就可以了
那是因为在节点死掉了以后,程序中,节点还在发送数据包。在bs_app.tcl 中,BS节点收到数据后,发现发送的节点已经死了,则忽略其发送的数据。但是在计算节点能量,也就是ns-leach.tcl文件中的 checkalive函数中,在一个周期内,不管节点死了没有,它发送数据消耗的能量都被计算到leach.energy文件中去了。
Application/LEACH instproc checkAlive {} {
global ns_ chan opt node_
$self instvar alive_ TDMAschedule_
$self instvar begin_idle_ begin_sleep_
# Check the alive status of the node. If the node has run out of
# energy, it no longer functions in the network.
set ISalive [[[$self node] set netif_(0)] set alive_]
if {$alive_ == 1} {
if {$ISalive == 0} {
puts "Node [$self nodeID] is DEAD!!!!"
$chan removeif [[$self node] set netif_(0)]
set alive_ 0
set opt(nn_) [expr $opt(nn_) - 1]
if {$opt(rcapp) == "LEACH-C/StatClustering" && /
[$self isClusterHead?]} {
foreach element $TDMAschedule_ {
if {$element != [$self nodeID]} {
puts "Node $element is effectively DEAD!!!!"
$chan removeif [$node_($element) set netif_(0)]
[$node_($element) set netif_(0)] set alive_ 0
[$node_($element) set rca_app_] set alive_ 0
set opt(nn_) [expr $opt(nn_) - 1]
}
}
}
#To solove the Energy consumed > Totle Energy bug
$self GoToSleep
} else {
$ns_ at [expr [$ns_ now] + 0.1] "$self checkAlive"
if {$begin_idle_ >= $begin_sleep_} {
set idle_energy [expr $opt(Pidle) * [expr [$ns_ now] - $begin_idle_]]
[$self getER] remove $idle_energy
set begin_idle_ [$ns_ now]
} else {
set sleep_energy [expr $opt(Psleep) * [expr [$ns_ now] - $begin_sleep_]]
[$self getER] remove $sleep_energy
set begin_sleep_ [$ns_ now]
}
}
}
if {$opt(nn_) < $opt(num_clusters)} "sens_finish"
}
2、新版本不兼容旧版本的一些参数,在*.out文件中会出现发送时的一些错误.解决方法:将NS-LAECH.TCL文件中第654行的dst_换成dst_addr就可以了.
Application/LEACH instproc send_now {mac_dst link_dst type msg /
data_size dist code} {
[$self agent] set packetMsg_ $type
[$self agent] set dst_addr_ $mac_dst
[$self agent] sendmsg $data_size $msg $mac_dst $link_dst $dist $code
}
讲这2个bug修复之后,leach协议可以说已经安装成功了,剩下的就是将程序运行起来,然后分析分析运行之后的结果,可以对比leach和leach-c这两者的区别。
我想说要搞明白leach协议的种种并不是一件简单的事,需要花费很多时间和精力,如果想速成的话是不会有很好的结果的,所以建议是反复的研究安装leach时修改的那些文件,一定要搞清楚每个文件都是干什么的,以及修改leach协议的参数在哪里修改,网络拓扑在哪里修改等等,需要搞清楚,才能明白。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xinxiuz/archive/2010/03/10/5364888.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qq361301276/archive/2010/05/31/5638119.aspx
相关文章推荐
- LEACH协议代码的两个BUG
- LEACH协议代码的两个BUG
- 记录安卓遇到的两个小bug,望初学者写代码的时候引以为戒
- leach协议matlab仿真代码
- Entity Framework 5 自定义代码生成模板 及 两个小Bug(可能是)
- Android下拉刷新代码完全解析,完全解读大神代码,解决两个小bug
- 解决了Live Writer 代码高亮插件【Paste from Visual Studio】的两个BUG
- 1、使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数
- GCC Coverage代码分析-GCC如何编译生成gcov/gcov-dump程序及其bug分析
- HTTP和SOAP完全就是两个不同的协议
- [转]xvid 代码的几个小bug
- 两个元素交换,粗心导致的BUG!!!
- 博客园插入代码格式的一点小bug
- UDP协议的两个主要方法sendto和recvfrom详解
- 遇到个BUG ,eclipse中的注释了的代码还在执行
- [Unity 笔记] 在Object上挂在两个script, 其中一个的初始化代码先于另一个执行
- Bug经典回放四--别让编译器优化掉你想要执行的代码
- Javascript substr方法在某些浏览器下行为出现BUG的补丁代码
- 游戏编程入门学习笔记35——推倒重来篇——《游戏编程入门》示例源码中的两个大bug