NS2学习

NS2学习经验积累

配置节点:
  使用函数simulator::node-config{}配置即将创建的节点属性,这种节点配置方法主要针对移动节点和卫星。
  e.g: 

#设定模拟需要的一些属性,比如mobilenodeChannelMACLL层的类型,天线类型,节点数目,场景的长宽尺寸等。
  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 ;#ifq中的最大分组
  set val(nn) 2 ;#移动节点数

  set val(rp) AODV ;#路由协议
  set val(x) 500 ;#拓扑结构的X轴范围
  set val(y) 500 ;#拓扑结构的Y轴范围
  $set ns [new Simulator]
#
建立节点(mobilenode)之前,先配置节点的一些参数。agentTrace表示应用层的trace,在trace文件中用#AGT表示;routerTrace表示路由的trace,在toace文件中用RTR表示;macTrace表示MAC层的trace

#
trace文件中用MAC表示;movementTrace表示记录节点移动命令的trace,在trace文件中用M表示。

设定移动节点:
  $ns node-config -addressType def/ ;#设定节点地址类型:def(flat) & hierarchical
  -adhocRouting $val(rp) / ;#设定移动节点所使用的路由协议
  -llType $val(ll) / ;#设定移动节点的逻辑链路层
  -macType $val(mac) / ;#设定移动节点的MAC
  -ifqType $val(ifq) / ;#设定移动节点的队列类型
  -ifqLen $val(ifqlen) / ;#设定移动节点的队列长度
  -antType $val(ant) / ;#设定移动节点的天线类型
  -propType $val(prop) / ;#设定移动节点的无线信号传输模型
  -phyType $val(netif) / ;#设定移动节点物理层类型
  -channelType $val(chan) / ;#设定移动节点的无线信道类型
  -topoInstance $topo / ;#设定移动节点的拓扑对象
  -agentTrace ON / ;#是否打开应用层的trace
  -routerTrace ON / ;#是否打开路由的trace
  -macTrace OFF / ;#是否打开MAC层的trace
  -movementTrace OFF ;#是否打开节点位置和移动信息


trace

#建立两个节点(mobilenode),关闭节点的随机运动功能,即节点的运动完全由我们指定。
  
for {set i 0} {$i > shift_) & mask_); }
  
virtual void recv(Packet* p, Handler* h);
  //recv()函数的实现参考源文件
~ns/classifier/classifier.cc
  
virtual NsObject* find(Packet*);
  
——————————————————————————————————
  set ns [new Simulator] ;#建立一个Simulator对象的实例并把它赋值给变量ns

  set node [$ns node] ;#新建一个节点并赋值给node
  set udp0 [new Agent/UDP] ;#新建一个UDP Agent并赋值给udp0
  set udp1 [new Agent/UDP] ;#新建一个UDP Agent并赋值给udp1
  set null [new Agent/Null] ;#新建一个UDP Agent并赋值给null
  $ns attach-agent $node $udp0; #UDP Agent udp0绑定到node上。
  puts "[[$node set dmux_] slot 0]" ;#查询号码为0slot对应的对象名并将其输出。
  puts "$udp0" ;#输出udp0的值。
  puts "[[$node set dmux_] findslot $udp0]" ;#查询udp0所在的slot号码并输出。
  puts "[[$node set dmux_] findslot $null]" ;#查询null所在的slot号码,表中没有找到该对象,返回-1,并输出。
  puts "============================================="
  puts "[[$node set dmux_] installNext $udp1]";#在最后一个slot 0后插入一个新的指向对象udp1的表项,返回

  ;#该表项的slot号码1,并输出。
  puts "[[$node set dmux_] slot 1]" ;#查询号码为1slot对应的对象名并将其输出。
  puts "$udp1" ;#输出udp1的值。
  puts "============================================="
  [$node set dmux_] install 0 $udp1 ;#将号码为0slot所指向的对象设为udp1

  puts "[[$node set dmux_] slot 0]" ;#查询号码为0slot对应的对象名并将其输出。
  puts "============================================="
  puts "[[$node set dmux_] alloc-port $null]" ;#寻找一个空闲的slot并输出。

  [$node set dmux_] clear 0 ;# 将号码为0slot清空。
  puts "[[$node set dmux_] alloc-port $null]" ;#寻找一个空闲的slot并输出。
  puts "============================================="
  puts "[[$node set dmux_] slot 0]" ;# 查询号码为0slot对应的对象名,object为空,故返回错误信息。

  $ns run
  运行结果:

  ——————————————————————————————————
  相关Tcl命令:

     1 set $node [$ns node]:建立一个节点实例。

  2 $node id:返回该节点id

  3 $node neighbors:返回邻居节点的列表。

  4 $node add-neighbor <neighbor_node>:增加一个邻居节点(注:这是单向的邻居,即“neighbor node”node的邻居,但node不是“neighbor node”的邻居)。

  5 $node node-addr:返回节点的地址(address)。地址类型为def时,节点地址与节点id相同;地址类型为hierarchical时,节点地址是一个字符串。

  6 $node reset:重置连到这个node上的所有agent

  7 $node agent <port_num> :返回port_num端口所指向的agent对象,如果port_num端口没有指向任何对象,返回null字符串。

  8 $node attach <agent> <optional:port_num> :将agent对象连接到节点上,如果没有指定端口号,节点会自己分配一个空闲的端口,并把agent连接到该端口上;如果指定端口为port_num,节点会把agent连接到端口port_num上。

  9 $node detach <agent> <null_agent>:将agent与节点分离,并把一个null_agent连接到agent原来所在的端口上。

    10. $node incr-rtgtable-size对象变量rtsize_用于保持对每个节点路由表大小的记录,该命令用于当每次路由入口加入分类器时增加路由表的大小。

     11.$node add-route <destination_id> <target>用于增加单播路由的分类器,目标是一个Tcl对象,如果<destination_id>和节点的id相同,则该对象可能就是dmux_的入口(节点的端口复用器)。否则它通常是该目的链表的头。

      12.$ns_ node [<hier_addr>]创建和返回一个节点的实例。若<hier_addr>给出,指派节点地址为<hier_addr>类型。注意:当层次地址通过set-address-format hierarchical{}或者node-config-addressType hierarchical{}调用时,<hier_addr>必须被使用。

 

关于NS-2仿真中移动节点的设置

要做一个4个节点的Ad hoc网络仿真,实验环境和要求是:

采用的无线网拓扑结构,主机节点数共有4个;节点14的初始位置坐标分别为(0,1 000)(0,800)(0,600)(400,600),节点12在仿真中保持静止不动,节点34则以60m/s速度分别向坐标(0,0)(400,0)位置方向垂直移动。系统带宽为2Mbps,系统节点缺省无线传输半径约为500m。仿真使用的业务流量为FTP,每包发送512字节,发送速度10/s。采用静态路由方式,节点11.5s发包给节点2,节点33.5s发包给节点4。仿真时间一共10s,选取节点2处的估计可用带宽进行分析。

 

下面是基本环境仿真的adhoc.tcl源码:

 

# This script is created by emile.Y.S Xiang
#===================================
#             
定义模拟变量                          
#===================================

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(x)      1000                               ;# X dimension of topology
set val(y)      1000                               ;# Y dimension of topology
set val(cp)     ""                                 ;# node movement model file
set val(sc)     ""                                 ;# traffic model file
set val(ifqlen) 50                                 ;# max packet in ifq
set val(nn)     4                                  ;# number of mobilenodes
set val(seed)   0.0
set val(stop)   10.0                               ;# time of simulation end
set val(tr)     adhoc.tr                           ;# trace file name
set val(rp)     DSDV                               ;# routing protocol
set AgentTrace  ON
set RouterTrace ON
set MacTrace    OFF

#===================================
#             
建立相关档案        
#===================================

# Initialize Global Variables
set ns_    [new Simulator]                          ;#
产生ns simulator实例
$ns_ color 1 Blue
$ns_ color 2 Red

 

# 设定trace file
$ns_ use-newtrace                                   ;#
使用新的trace format
set namfd [open adhoc.nam w]                        ;#
产生nam trace file
$ns_ namtrace-all-wireless $namfd $val(x) $val(y)   ;#
模拟时产生需要的结果文件
set tracefd [open $val(tr) w]                       ;#
产生trace file
$ns_ trace-all $tracefd                             ;#
模拟时产生需要的结果文件

 

#建立topology对象,以记录mobilenodes在拓扑內移动的情况
set topo [new Topography]
#
拓扑的范围为 1000m x 1000m
$topo load_flatgrid $val(x) $val(y)

 

# 建立channel
set chan [new $val(chan)]

 

# 创建god
set god_ [create-god $val(nn)]

#===================================
#             
无线节点配置        
#===================================

# Create the specified number of mobile nodes [$val(nn)] and "attach" them to
# the channel. Four nodes are created : node(0), node(1), node(2) and node(3)
#
设定Mobile Node的参数
$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) /
                 -channel $chan /
                 -topoInstance $topo /
                 -agentTrace ON /
                 -routerTrace OFF /
                 -macTrace OFF /
                 -movementTrace OFF

#===================================
#             
新建Node             
#===================================

for {set i 0} {$i < $val(nn) } {incr i} {
  set node_($i) [$ns_ node]
  $node_($i) random-motion 0 ;#
使各节点非随机移动
}

 

# Provide initial (X,Y, for now Z=0) co-ordinates for mobilenodes
#
建立第0Node,开始时,位置在(0.0, 1000.0)
$node_(0) set X_ 0.0
$node_(0) set Y_ 1000.0
$node_(0) set Z_ 0.0
#
建立第1Node,开始时,位置在(0.0, 800.0)
$node_(1) set X_ 0.0
$node_(1) set Y_ 800.0
$node_(1) set Z_ 0.0
#
建立第2Node,开始时,位置在(0.0, 600.0)
$node_(2) set X_ 0.0
$node_(2) set Y_ 600.0
$node_(2) set Z_ 0.0
#
建立第3Node,开始时,位置在(400.0, 600.0)
$node_(3) set X_ 400.0
$node_(3) set Y_ 600.0
$node_(3) set Z_ 0.0

 

# Load the god object with shortest hop information
#
在节点0和节点1之间最短的hop数为1
$god_ set-dist 0 1 1
#
在节点1和节点2之间最短的hop数为1
$god_ set-dist 1 2 1
#
在节点0和节点2之间最短的hop数为2
$god_ set-dist 0 2 2
#
在节点2和节点3之间最短的hop数为1
$god_ set-dist 2 3 1
#
在节点0和节点3之间最短的hop数为1
$god_ set-dist 0 3 1
#
在节点1和节点3之间最短的hop数为1
$god_ set-dist 1 3 1

#===================================
#             
产生Movement        
#===================================

# Now produce some simple node movements
# Node_(2) and Node_(3) starts to move downward
set god_ [God instance]


# 0秒开始,节点2开始从位置(0,600)移動到(0,0),速度為60.0 m/s
$ns_ at 0.0 "$node_(2) setdest 0.0 0.0 60.0"
#
0秒开始,节点3开始从位置(400,600)移動到(400,0),速度為60.0 m/s
$ns_ at 0.0 "$node_(3) setdest 400.0 0.0 60.0"

#===================================
#      
建立FTP业务,基于TCP来承载 
#===================================

# 在节点0和节点1间设定第0个连线(FTP-TCP),且在时间为1.5秒开始发送
set tcp0 [new Agent/TCP/Newreno]
$tcp0 set fid_ 1
set sink0 [new Agent/TCPSink]
$ns_ attach-agent $node_(0) $tcp0
$ns_ attach-agent $node_(1) $sink0
$ns_ connect $tcp0 $sink0
set ftp0 [new Application/FTP]
$ftp0 attach-agent $tcp0
$ns_ at 1.5 "$ftp0 start"
$ns_ at 10.0 "$ftp0 stop"

 

# 在节点2和节点3间设定第1个连线(FTP-TCP),且在时间为3.5秒开始发送
set tcp1 [new Agent/TCP/Newreno]
$tcp1 set fid_ 2
set sink1 [new Agent/TCPSink]
$ns_ attach-agent $node_(2) $tcp1
$ns_ attach-agent $node_(3) $sink1
$ns_ connect $tcp1 $sink1
set ftp1 [new Application/FTP]
$ftp1 attach-agent $tcp1
$ns_ at 3.5 "$ftp1 start"
$ns_ at 10.0 "$ftp1 stop"

 

# nam中定义节点初始所在位置
for {set i 0} {$i < $val(nn)} {incr i} {
  # The function must be called after mobility model is defined.
  $ns_ initial_node_pos $node_($i) 60
}

 

#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值