您的位置:首页 > 其它

Leach协议nam过程实现

2014-01-13 17:08 204 查看
在网上搜了很久,很少有将leach协议的nam实现的。这里我将自己是怎么将leach协议的nam仿真的修改过程写出来。

1、在将wireless.tcl中加入一下一些代码:

# Initialize Global Variables

#

set ns_ [new Simulator]

set chan [new $opt(chan)]

set prop [new $opt(prop)]

set topo [new Topography]

#set tracefd [open $opt(tr) w]

set tracefd [open leach.tr w]

set namtrace [open leach.nam w] #nam文件名为leach.nam

$ns_ trace-all $tracefd

$ns_ namtrace-all-wireless $namtrace $opt(x) $opt(y)

#每个节点的跟踪设置

create-god $opt(nn)

$ns_ node-config -adhocRouting $opt(rp) \

-llType $opt(ll) \

-macType $opt(mac) \

-ifqType $opt(ifq) \

-ifqLen $opt(ifqlen) \

-antType $opt(ant) \

-propType $opt(prop) \

-phyType $opt(netif) \

-channel $opt(chan) \

-topoInstance $topo \

-agentTrace ON \

-routerTrace ON \

-macTrace ON \

-wiredRouting OFF

#初始化节点的位置,如果不加这个,在nam仿真时会出现节点没有定义

for {set i 0} {$i<$opt(nn)} {incr i} {

$ns_ initial_node_pos $node_($i) 6

}

$ns_ at $opt(stop).0002 "puts\"NS EXITING...\";$ns_ halt"

$ns_ at $opt(stop).0001 "stop"

proc stop {} {

global ns_ tracefd namtrace

$ns_ flush-trace

close $tracefd

close $namtrace

exec nam leach.nam &

exit 0

}

这样wireless.tcl修改好了,其实这样已经可以实现leach协议的仿真,但是nam动画不好看

接下来我自己修改、添加了uamps.tcl和ns-leach.tcl,这样在仿真nam动画是可以标识出bsnode、簇头、同族节点

2、在uamps.tcl中添加一句:

   } else {

puts "($opt(nn_) == BS)"

set node_($id) [new MobileNode/ResourceAwareNode $BS_NODE]

$node_($id) label "BS"

$node_($id) label-color red

}

这样bsnode在nam仿真时会在节点头顶出现一个红色的BS

3、在ns-leach.tcl文件中的createSchedule加入:

Application/LEACH instproc createSchedule {} {

global ns_ opt ADV_SCH MAC_BROADCAST BYTES_ID node_

$self instvar clusterNodes_ TDMAschedule_ rng_

$self instvar dist_ code_ now_ beginningE_

set colorarray(0) "red"

set colorarray(1) "yellow"

set colorarray(2) "blue"

set colorarray(3) "green"

set colorarray(4) "chocolate"

set colorarray(5) "brown"

set colorarray(6) "tan"

set colorarray(7) "blank"

set numNodes [llength $clusterNodes_]

set chID [$self nodeID]

if {$numNodes == 0} {

set xmitOrder ""

puts "Warning! There are no nodes in this cluster ($chID)!"

$self SendMyDataToBS

} else {

# Set the TDMA schedule and send it to all nodes in the cluster.

set xmitOrder $clusterNodes_

set msg [list $xmitOrder]

set spreading_factor $opt(spreading)

set datasize [expr $spreading_factor * $BYTES_ID * [llength $xmitOrder]]

pp "$chID sending TDMA schedule: $xmitOrder at time [$ns_ now]"

pp "Packet size is $datasize."

set mac_dst $MAC_BROADCAST

set link_dst $chID

$self send $mac_dst $link_dst $ADV_SCH $msg $datasize $dist_ $code_

set c_a_ [expr int([$rng_ uniform 0 7])]

$node_($chID) add-mark A $colorarray($c_a_) square    #簇头是用正方形框住的

for {set i 0} {$i<$numNodes} {incr i} {

set n [lindex $xmitOrder $i]

$node_($n) add-mark A $colorarray($c_a_) hexagon    #同一族的颜色是用和簇头相同颜色的六变形框住的

}

}

这样修改完成。

说明,由于颜色只有8中,所以有可能簇头会出现相同的颜色,这样不是很容易区分。这是一个不完美的地方。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: