NS2学习经验积累
配置节点:
使用函数simulator::node-config{}配置即将创建的节点属性,这种节点配置方法主要针对移动节点和卫星。
e.g:
#设定模拟需要的一些属性,比如mobilenode的Channel、MAC、LL层的类型,天线类型,节点数目,场景的长宽尺寸等。
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]" ;#查询号码为0的slot对应的对象名并将其输出。
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]" ;#查询号码为1的slot对应的对象名并将其输出。
puts "$udp1" ;#输出udp1的值。
puts "============================================="
[$node set dmux_] install 0 $udp1 ;#将号码为0的slot所指向的对象设为udp1。
puts "[[$node set dmux_] slot 0]" ;#查询号码为0的slot对应的对象名并将其输出。
puts "============================================="
puts "[[$node set dmux_] alloc-port $null]" ;#寻找一个空闲的slot并输出。
[$node set dmux_] clear 0 ;# 将号码为0的slot清空。
puts "[[$node set dmux_] alloc-port $null]" ;#寻找一个空闲的slot并输出。
puts "============================================="
puts "[[$node set dmux_] slot 0]" ;# 查询号码为0的slot对应的对象名,该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仿真中移动节点的设置
|