NS2中tcl脚本文件分析(转)
# 定义选项,设定模拟需要的一些属性。
set val(chan) Channel/WirelessChannel ;# 无线信道类型
set val(prop) Propagation/TwoRayGround ;# 无限信号传输模型
set val(netif) Phy/WirelessPhy ;# 物理层类型
set val(mac) Mac/802_11 ;# MAC层类型
set val(ifq) Queue/DropTail/PriQueue ;# 接口队列类型
set val(ll) LL ;# 链路层类型
set val(ant) Antenna/OmniAntenna ;# 天线类型
set val(ifqlen) 50 ;# 队列长度
set val(nn) 2 ;# 移动节点个数
set val(rp) DSDV ;# 路由协议
set val(x) 500 ;# 拓扑的X尺寸
set val(y) 500 ;# 拓扑的Y尺寸
# 主程序
# 初始化全局变量
#
#建立一个Simulator对象的实例并赋值给变量ns_
set ns_ [new Simulator]
#打开一个名为simple.tr的文件(若不存在,则创建),设定文件可写,变量tracefd指向该文件
set tracefd [open simple.tr w]
#调用Simulator类的trace-all方法将整个模拟过程写入simple.tr的Trace文件中
$ns_ trace-all $tracefd
set namtracefd [open simple.nam w]
#在拓扑范围内建立无线nam跟踪
$ns_ namtrace-all-wireless $namtracefd $val(x) $val(y)
#建立一个Topography对象,该对象会保证节点在拓扑边界范围内运动
set topo [new Topography]
#设定模拟所采用的场景的长宽尺寸
$topo load_flatgrid $val(x) $val(y)
#
# 建立一个God对象。God对象主要用来对路由协议做性能评价,它存储了节点总数,节点间最短路径等信息。节点的MAC对象会调用God对象,因此即使不使用也仍然要建立此对象。
#
create-god $val(nn)
#
# 建立指定数目[$val(nn)]的移动节点并将它们连接至信道。
# 这里建立了两个节点: node(0),node(1)
# 配置节点
$ns_ node-config -adhocRouting $val(rp) \
-llType $val(ll) \
-macType $val(mac) \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(ant) \
-propType $val(prop) \
-phyType $val(netif) \
-channelType $val(chan) \
-topoInstance $topo \
-agentTrace ON \
-routerTrace ON \
-macTrace OFF \
-movementTrace OFF
#建立两个节点,关闭节点的随机运动功能,即节点的运动完全有程序指定
for {set i 0} {$i < $val(nn) } {incr i} {
set node_($i) [$ns_ node]
$node_($i) random-motion 0 ;
}
#
# 为移动节点指定初始的X,Y坐标,此处Z坐标为0
#
$node_(0) set X_ 5.0
$node_(0) set Y_ 2.0
$node_(0) set Z_ 0.0
$node_(1) set X_ 390.0
$node_(1) set Y_ 385.0
$node_(1) set Z_ 0.0
# 下面产生一些简单的运动
# Node_(1)在50.0s,以15.0m/s的速度向坐标(25.0,20.0)运动
$ns_ at 50.0 "$node_(1) setdest 25.0 20.0 15.0"
# Node_(0)在10.0s,以1.0m/s的速度向坐标(20.0,18.0)运动
$ns_ at 10.0 "$node_(0) setdest 20.0 18.0 1.0"
# Node_(1)在100.0s,以15.0m/s的速度向坐标(490.0,480.0)运动
$ns_ at 100.0 "$node_(1) setdest 490.0 480.0 15.0"
#设置节点间的流量
#创建一个TCP源代理对象tcp
set tcp [new Agent/TCP]
#class_是agent类中定义的整型变量,用于分类,之后可用于着色。此程序无用。
$tcp set class_ 2
#创建分组的接收代理对象sink
set sink [new Agent/TCPSink]
#将源代理对象tcp绑定到节点0
$ns_ attach-agent $node_(0) $tcp
#将接收代理对象sink绑定到节点1
$ns_ attach-agent $node_(1) $sink
#在源代理对象tcp和接收代理对象sink之间建立连接
$ns_ connect $tcp $sink
#在TCP连接上创建一个FTP流量模拟器,因为TCP不会产生自己的流量
set ftp [new Application/FTP]
$ftp attach-agent $tcp
#在10.0s启动ftp流量模拟器
$ns_ at 10.0 "$ftp start"
#
#模拟结束时告知节点
#
for {set i 0} {$i < $val(nn) } {incr i} {
#在模拟结束前(150.0s)重置节点中的所有对象
$ns_ at 150.0 "$node_($i) reset";
}
#告知Simulator对象在150.0s时调用stop过程
$ns_ at 150.0 "stop"
#在150.01s时输出提示语句并终止调度器
$ns_ at 150.01 "puts \"NS EXITING...\" ; $ns_ halt"
#stop过程
proc stop {} {
#声明全局变量
global ns_ tracefd namtracefd
#清空跟踪的缓冲区
$ns_ flush-trace
#关闭文件
close $tracefd
close $namtracefd
#启动nam
exec nam simple.nam &
exit 0
}
puts "Starting Simulation..."
#启动调度器
$ns_ run