Chinaunix首页 | 论坛 | 博客
  • 博客访问: 847024
  • 博文数量: 180
  • 博客积分: 10029
  • 博客等级: 上将
  • 技术积分: 2185
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-06 09:15
文章存档

2010年(133)

2009年(47)

我的朋友

分类: 系统运维

2009-11-06 10:58:10

E-mail:
 
 
    以下是一个无线网络场景的模拟程序,代码参考了Marc Greis‘ Tutorial。加上我自己做的详细注释,我想会对初学者有一定的帮助吧!
    此场景的模拟时间比较长,而且场景的物理范围很大,在利用NAM观察时,请在合适的时间适当地调整时间进度和显示的大小!
    关于NS2的网络仿真原理, 请看 NS2中文教材(1):NS2网络模拟的原理
 
    比如: 当两个节点在通信范围之外时,可以把时间进度调得比较快,缩小地显示整个场景!
          后来两节点靠得较近时,FTP传送开始,可以把时间进度调得比较慢,放大地显示整个场景!
          注意观察: FTP发包,因为用的是TCP连接,可以看到慢启动过程和快速恢复哦!
 
    这是无线网络场景的TCL脚本,较之有线网络场景,最大的区别在于无线节点参数的配置。
    首先通过set命令对相应的变量赋值,例如:
          set val(chan)           Channel/WirelessChannel    ;#设定通信信道类型
    第二步,对即将要生成的节点进行配置:
         $ns node-config -adhocRouting $val(rp) \  ;# 行尾的 \ 起到续行的作用。
    不过,这些基本的操作,代码基本上是一致的,每一次编写简单的脚本时,就好比是在做一道填空题,将相应的配置进行填补就好啦! 只有对复杂的协议进行测试的时候,才需要更加复杂的配置,比如: 能量模型,多种节点等, 这将在后续的博文中进行演示。
 
    实例2:
         

#场景描述:
#无线网络中,两个节点  node_(0) 和 node_(1), TCP+FTP, 并且设置了节点的移动
#===========================================================================
# 无线节点的参数设置
#===========================================================================
set val(chan)           Channel/WirelessChannel    ;# channel type
set val(prop)           Propagation/TwoRayGround   ;# radio-propagation model
set val(netif)          Phy/WirelessPhy            ;# network interface type
set val(mac)            Mac/802_11                 ;# MAC type
set val(ifq)            Queue/DropTail/PriQueue    ;# interface queue type
set val(ll)             LL                         ;# link layer type
set val(ant)            Antenna/OmniAntenna        ;# antenna model
set val(ifqlen)         50                         ;# max packet in ifq
set val(nn)             2                          ;# number of mobilenodes
set val(rp)             AODV                       ;# routing protocol
set val(x)              500                        ;# X dimension of the topography
set val(y)              500                        ;# Y dimension of the topography
#============================================================================


# 创建Simulator对象,用于模拟过程的事件调度
set ns [new Simulator]
#设置相关记录文件
set tracefd [open example2.tr w]
$ns trace-all $tracefd
set namtracefd [open example2.nam w]
# 注意: 与有线场景的命令有差别哦!
$ns namtrace-all-wireless $namtracefd $val(x) $val(y)


# 设置模拟结束时的操作, 将记录写入文件,并关闭文件, 最后启动 NAM 进行动画显示
proc finish {} {
 global ns tracefd namtracefd
 $ns flush-trace

 close $tracefd
 close $namtracefd
 
 exec nam example2.nam &
 exit 0   
}

# 建立一个Topography对象,该对象保证移动节点会在拓扑边界范围内运动
set topo [new Topography]
# 500 X 500的边界
$topo load_flatgrid $val(x) $val(y)

# God对象主要用来对路由协议做性能评价,
# 它存储了: 节点的总数、各个节点间最短路径表等信息, 这些信息通常在模拟开始之前就计算好了!
# 节点的MAC对象会调用God对象, (初学者没必要关心!)
create-god $val(nn)

$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  


# 创建两个节点,存储在数组 Node中,   
for {set i 0} {$i < $val(nn) } {incr i} {
 set node_($i) [$ns node] 
 $node_($i) random-motion 0  ;# disable random motion
}
#设置节点的物理位置,一般第三位Z_=0.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


#设置节点的移动, setdest 20.0 18.0 1.0:  向(20.0,18.0)位置以 1.0m/s的速度移动!
$ns at 1.0 "$node_(0) setdest 20.0 18.0 1.0"
$ns at 5.0 "$node_(1) setdest 25.0 20.0 15.0"
$ns at 100.0 "$node_(1) setdest 490.0 480.0 15.0"


# 创建TCP,及TCP对应的TCPSink,并连接起来,最后在TCP连接上添加FTP应用
set tcp [new Agent/TCP]
$tcp set class_ 2
set sink [new Agent/TCPSink]
$ns attach-agent $node_(0) $tcp
$ns attach-agent $node_(1) $sink
$ns connect $tcp $sink
set ftp [new Application/FTP]
$ftp attach-agent $tcp


#设置FTP数据流的开始时间
$ns at 1.0 "$ftp start"
#模拟结束前调用各节点的reset函数, 无线场景中,一般照写就可!
for {set i 0} {$i < $val(nn) } {incr i} {
    $ns at 150.0 "$node_($i) reset";
}
$ns at 150.0 "finish"

$ns run

运行结果:

请调整NAM右上角的时间按钮,可清洗地观察到CP慢启动过程哦!

        

关于NS2的网络仿真原理, 请看 NS2中文教材(1):NS2网络模拟的原理
 
E-mail:
 
 
 
阅读(7069) | 评论(6) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2009-12-01 20:32:44

你好!看了你写的文章,写的很好,我刚开始用NS2,有个问题想请教一下。就是如何设置随意移动的节点。看书上有$node random-motion 1,但试了总不成功。提示can‘t read "node",望指教。