NS2有线网络+无线网络混合

如图,2/3为无线节点,1为基站节点,0为有线节点。混合代码如下:
#无线节点参数
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 MAC层协议
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(rp) DSDV ;#路由协议
set val(nn) 4 ;#节点数目
set val(x) 1000 ;#网络拓扑范围——长度
set val(y) 1000 ;#网络拓扑范围——宽度
set val(stop) 10.0 ;#模拟时间

建立一个simulator实例

set ns [new Simulator]

#设定分层路由地址,混合仿真一定要设定分层路由,这是与一般无线模拟不同的地方
$ns node-config -addressType hierarchical ;#设定分层路由
AddrParams set domain_num_ 2 ;# 设定2个网络
lappend cluster_num 1 1 ;# 每个网络一个子网
AddrParams set cluster_num_ $cluster_num
lappend eilastlevel 1 3 ;# 2个子网的节点数目为1和3
AddrParams set nodes_num_ $eilastlevel
puts “Configuration of hierarchical addressing done”

#设置trace跟踪文件和NAM显示文件
set tracefd [open wired_wireless.tr w]
set namtrace [open wired_wireless.nam w]
$ns trace-all $tracefd
$ns namtrace-all-wireless $namtrace $val(x) $val(y)

#建立topology对象
set topo [new Topography]
$topo load_flatgrid $val(x) $val(y)

#创建god对象
create-god $val(nn)

#创建优先节点,并设定节点的位置和大小
set sinkNode [$ns node 0.0.0] ;#有线节点的地址0.0.0
$sinkNode set X_ 600
$sinkNode set Y_ 500
$sinkNode set Z_ 0
$ns initial_node_pos $sinkNode 50

#创建物理信道对象
set chan_1_ [new $val(chan)]

#配置无线节点和基站节点,开启路由
$ns node-config -wiredRouting ON
-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_1_
-topoInstance $topo
-agentTrace ON
-routerTrace ON
-macTrace ON
-movementTrace OFF

#创建基站节点并设定节点位置
set bs(0) [$ns node 1.0.0] ;#基站节点的地址是1.0.0
$bs(0) random-motion 0
$bs(0) set X_ 400.0
$bs(0) set Y_ 500.0
$bs(0) set Z_ 0.0
$ns initial_node_pos $bs(0) 50

#定义基站和有线节点之间的链路
$ns duplex-link $sinkNode $bs(0) 10Mb 1ms DropTail
$ns duplex-link-op $sinkNode $bs(0) orient left
#定义链路的队列长度
$ns queue-limit $bs(0) $sinkNode 10
#监视链路的队列
$ns duplex-link-op $bs(0) $sinkNode queuePos 0.5

#关闭有线路由
$ns node-config -wiredRouting OFF

#创建移动节点

set ss(0) [$ns node 1.0.1]
#设定s0的基站节点
ss(0)basestation[AddrParamsaddr2id[ss(0) base-station [AddrParams addr2id [bs(0) node-addr]] ;#设定ss(0)的基站节点
$ss(0) set X_ 300.0
$ss(0) set Y_ 400.0
$ss(0) set Z_ 0.0
$ns initial_node_pos $ss(0) 50

set ss(1) [$ns node 1.0.2]
ss(0)basestation[AddrParamsaddr2id[ss(0) base-station [AddrParams addr2id [bs(0) node-addr]] ;#设定ss(0)的基站节点
$ss(1) set X_ 300.0
$ss(1) set Y_ 600.0
$ss(1) set Z_ 0.0
$ns initial_node_pos $ss(1) 50

#在有线节点和ss(0)之间建立UDP和CBR数据流(UGS???)
set udp(0) [new Agent/UDP]
$ns attach-agent $ss(0) $udp(0)
set null(0) [new Agent/Null]
$ns attach-agent $sinkNode $null(0)
$ns connect $udp(0) $null(0)
set ugs(0) [new Application/Traffic/CBR]
$ugs(0) attach-agent $udp(0)

#在有线节点和ss(1)之间建立UDP和CBR数据流(有线节点作转发用)
set udp(1) [new Agent/UDP]
$ns attach-agent $sinkNode $udp(1)
set null(1) [new Agent/Null]
$ns attach-agent $ss(1) $null(1)
$ns connect $udp(1) $null(1)
set ugs(1) [new Application/Traffic/CBR]
$ugs(1) attach-agent $udp(1)

#开启和关闭数据流
nsat0.5"ns at 0.5 "ugs(0) start"
nsat0.5"ns at 0.5 "ugs(1) start"

nsat9.0"ns at 9.0 "ugs(1) stop"
nsat9.5"ns at 9.5 "ugs(0) stop"

proc stop {} {
global ns namtrace tracefd
$ns flush-trace
close $tracefd
close $namtrace
exit 0
}

$ns at $val(stop) “stop”
$ns at $val(stop) “puts “NS EXITING…” ; $ns halt”
puts “Starting Simulation…”

注意:将生成的wired_wireless.nam文件中的第11、12行的内容删除再运行。原因:nam的bug将节点0与1粘合了。

相关文章: