zoukankan      html  css  js  c++  java
  • NS2学习笔记(一)

    NS2有两种运行方式:

    1.“脚本方式”,输入命令: ns tclscripl.tcl,其中 tclscripl.tcl 是一个Tcl脚本的文件名;

    2“命令行方式”,输入命令:ns,进入NS2的命令行环境,然后直接输入各种命令来交互式地运行NS2。(与Python类似)

    运行NS2以后也有两种方法记录结果:

    1.trace文件;

    2.nam(动画演示程序)

    Tcl脚本1:example1.tcl

     1 set ns [new Simulator]#建立一个新的模拟对象simulator
     2 
     3 set tracef [open example1.tr w]#变量tracef指向example1.tr文件
     4 #ns trace-all $tacef#记录模拟过程trace数据
     5 set namtf [open example1.nam w]#变量namtf指向example1.nam文件
     6 $ns namtrace-all $namtf#记录nam的trace数据
     7 
     8 proc finish {} {关闭两个trace文件,在模拟结束后调用nam程序
     9     global ns tracef namtf
    10     $ns flush-trace
    11     close $tracef
    12     close $namtf
    13     exec nam example1.nam &
    14     exit 0
    15 )
    16 
    17 set n0 [$ns node]#创建节点n0
    18 set n1 [$ns node]#创建节点n1
    19 
    20 $ns duplex-link $n0 $n1 1Mb 10ms DropTail#在n0和n1之间建立一条双向的链路,带宽1Mbit/s,时延10ms,队列类型为DropTail。
    21 
    22 set udp0 [new Agent/UDP]#创建一个udp0 Agent
    23 $ns attach-agent $no $udp0#将udp0绑定到n0上
    24 
    25 set cbr0 [new Application/Traffic/CBR]#创建一个CBR流量发生器
    26 $cbr0 set packetSize_ 500#分组大小为500B
    27 $cbr0 set interval_ 0.005#发送间隔为5ms
    28 $cbr0 attach-agent $udp0#将CBR绑定到udp0上
    29 
    30 set null0 [new Agent/Null]#创建一个Null Agent作为数据接收器
    31 $ns attach-agent $n1 $null0#绑定到n1上
    32 
    33 $ns connect $udp0 $null0#将两个Agent连接起来
    34 
    35 $ns at 0.5 "$cbr0 start"#0.5s时启动cbr0
    36 $ns at 4.5 "$cbr0 stop"#4.5s时停止cbr0
    37 
    38 $ns at 5.0 "finish"#5.0s时调用finish过程
    39 $ns run#开始模拟

    Tcl调用成员方法的格式为:$对象名 方法名

    Tcl脚本2(无线模型):wireless.tcl

     1 set val(chan) Channel/WirelessChannel #channel type,val(chan)作为变量名是一个整体,下同
     2 set val(proc) Propagation/TwoRayGround #radio-propagation model
     3 set val(netif) Phy/WirelessPhy #network interface type
     4 set val(mac) Mac/802_11 #MAC type
     5 set val(ifq) Queue/DropTail/PriQueue #interface queue type
     6 set val(ll) LL #link layer type
     7 set val(ant) Antenna/OmniAntenna #antenna model
     8 set val(ifqlen) 50 #max packet in ifq
     9 set val(nn) 2 #number of mobilenodes
    10 set val(rp) AODV #routing protocol
    11 set val(x) 500 #X dimension of the topography
    12 set val(y) 500 #Y dimension of the topography
    13 
    14 set ns [new Simulator]
    15 
    16 set tracefd [open wireless.tr w]
    17 $ns trace-all $tracefd
    18 set namtracefd [new wireless.nam w]
    19 $ns namtrace-all-wireless $namtracefd $val(x) $val(y)
    20 
    21 set topo [new Topography]#建立一个Topography对象,该对象可以保证节点在拓扑边界范围内运动
    22 $topo load_flatgrid $val(x) $val(y)#设定模拟所用场景的大小
    23 
    24 create-god $val(nn) #建立一个God对象,主要用来对路由协议做性能评价;节点的MAC对象会调用God对象,因此即使我们在这里并不适用God对象,仍然需要建立一个God对象
    25 
    26 $ns node-config -adhocRouting $val(rp) #配置节点参数
    27     -llType $val(ll)
    28     -macType $val(mac)
    29     -ifqType $val(ifq)
    30     -ifqLen $val(ifqlen)
    31     -antType $val(ant)
    32     -propType $val(prop)
    33     -phyType $val(netif)
    34     -channelType $val(chan)
    35     -topoInstance $topo
    36     -agentTrace ON
    37     -routerTrace ON
    38     -macTrace OFF
    39     -movementTrace OFF
    40 
    41 for{set i 0} {$i < $val(nn)} {incr i} {
    42     set node_($i) [$ns node]
    43     $node_($i) random-motion 0 #disable random motion 禁止节点随机移动,让节点按脚本规定的方式移动
    44 
    45 $node_(0) set X_ 5.0 #设定节点初始坐标X,Y,Z
    46 $node_(0) set Y_ 2.0
    47 $node_(0) set Z_ 0.0
    48 
    49 $node_(1) set X_ 390.0
    50 $node_(1) set Y_ 385.0
    51 $node_(1) set Z_ 0.0
    52 
    53 $ns at 5.0 "$node_(1) setdest 25.0 20.0 15.0"#节点1在5s时以15m/s的速度向坐标(25.0,20.0)的点运动
    54 $ns at 1.0 "$node_(0) setdest 20.0 18.0 1.0"
    55 
    56 $ns at 10 "$node_(1) setdest 490.0 480.0 15.0"
    57 
    58 set tcp [new Agent/TCP]
    59 $tcp set class_ 2
    60 set sink [new Agent/TCPSink]
    61 $ns attach-agent $node_(0) $tcp
    62 $ns attach-agent $node_(1) $sink
    63 $ns connect $tcp $sink
    64 set ftp [new Appication/FTP]
    65 $ftp attach-agent $tcp
    66 
    67 $ns at 1.0 "$ftp start"
    68 for {set i 0} {$i < $val(nn)} {incr i} {
    69     $ns at 15.0 "$node_($i) reset"
    70 }
    71 $ns at 15.0 "stop"
    72 
    73 proc stop{} {
    74     global ns tracefd nametracefd
    75     $ns flush-trace
    76     close $tracefd
    77     close $nametracefd
    78     exec nam wireless nam &
    79     exit 0
    80 }
    81 
    82 $ns run

     在节点很多的情况下,可以通过文件配置这些节点的初始位置和运动方式。

    source "path" #读取定义位置和运动方式的文件,path是文件的路径名,文件中的内容包括node的set方法设定初始坐标,和simulator的at方法设定运动方式。与上面直接写入脚本的方法一致。

    还可以通过这种引用文件的方式来设定绑定节点的Agent。

  • 相关阅读:
    SaltStack 配置SLS过程
    Python 正则表达式
    Python 矩阵的旋转
    SaltStack 远程执行
    SaltStack 配置管理
    SaltStack
    Python 装饰器
    Python 生产者和消费者模型
    Python 迭代器和生成器
    Python json模块
  • 原文地址:https://www.cnblogs.com/johnsblog/p/4203350.html
Copyright © 2011-2022 走看看