您的位置:首页 > 其它

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

2008-08-18 03:30 197 查看
要做一个4个节点的Ad hoc网络仿真,实验环境和要求是:

采 用的无线网拓扑结构,主机节点数共有4个;节点1到4的初始位置坐标分别为(0,1
000)、(0,800)、(0,600)和(400,600),节点1和2在仿真中保持静止不动,节点3和4则以60m/s速度分别向坐标(0,0)和
(400,0)位置方向垂直移动。系统带宽为2Mbps,系统节点缺省无线传输半径约为500m。仿真使用的业务流量为FTP,每包发送512字节,发送
速度10包/s。采用静态路由方式,节点1在1.5s发包给节点2,节点3在3.5s发包给节点4。仿真时间一共10s,选取节点2处的估计可用带宽进行
分析。西子博客!c \ F D;N K C I西子博客)n c)^&G k$H
0y {+U1W T7g0 西子博客*B ]#y6e O T D
西子博客:m I8|4| t R e
下面是基本环境仿真的adhoc.tcl源码:西子博客 S a(j ] s
西子博客9B$E k s Z6i o G&r [
西子博客;Q;e1g _;u.M

# 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
# 建立第0个Node,开始时,位置在(0.0, 1000.0)
$node_(0) set X_ 0.0
$node_(0) set Y_ 1000.0

$node_(0) set Z_ 0.0
# 建立第1个Node,开始时,位置在(0.0, 800.0)
$node_(1) set X_ 0.0

$node_(1) set Y_ 800.0
$node_(1) set Z_ 0.0
# 建立第2个Node,开始时,位置在(0.0, 600.0)
$node_(2) set X_ 0.0

$node_(2) set Y_ 600.0

$node_(2) set Z_ 0.0

# 建立第3个Node,开始时,位置在(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]
I&D:N @ ` j-i5t0
M b y0S3[:q i0西子博客*O4]1I9j(j k西子博客 F O R R e0R西子博客4} X s"~4j0A u"d+c M
2z;b)~ u-H n+|;D0西子博客 W ?.^:r \0w { n
.c K N"{.j0
3S `)u {0u0西子博客 C5U:v ? J-~7b西子博客 Q/Q v7k ? S+y
m E3G1t S f @0
U M-?)p3n;b x*J s p0西子博客'l.s _ \ U s a*| K
#^ ^)L:S v A0
^ s |6~;P ].R h1} T ?+m0西子博客-\ i$e @ [ O9S
0I.x Y T | z H0
)s B B'^ Q m0西子博客 g t(b ^ k:Q m西子博客 h X2d N ~ K
1Z&\"g9| ^ d0西子博客#| s O m+E w"@西子博客#p;X y!X3D d H ]西子博客 d5V3U'z H w
/M J q ? x `0
7d t,| X(X0
/l b:|${ H F k*Q0
+R2N S ?2_2m0
Z ~ U8L K L4[0
*j ? r*b0?6B m g G0
\ X8o u n G T p&a4x!` j0西子博客*v g0b S q2n Q ]
{ \&s l1h F0西子博客 Y } g(O M P西子博客+} W c%?+M-E1I f1m
7Q k B V;j0R P S X ~0
j s2W'j$z l:K }"Q \ H0 西子博客6X#V1q A r { ] z西子博客&} E T M'[5p C y C西子博客2b v W-s3g _ e \(U,a
"e9l6? `#u(O K r0
T(q ? d D l ]0
,s*g%H v9t _ } x0
d Z I"\5E&u W R.f0西子博客-^,w&{ W!R z

5? [ \ s D5b @ i0
k6s R l { k2C z0西子博客'n R6v"s m!E
e E'A M!a k G s0
6e:B ?5Z v U.J0
Z u I z/M(v z0
5S5E o$T E0
)i s6q w A f N0
m v |8` G$\ b M R0
;x6d!@9U L G O:G0
p!{%i n6c w/J9W t-p \3D0
"J ^$O)j)S M'` ~ i0
a-] F F)Q ? c0西子博客 Z M y Y p J K p#Q&A1|
/I f e)|1V v s4J l f0
(t N!o-K6W)m.q y2Q0西子博客._3b6R9O Q } Z F l/n
{ P M S.y U Y z y0
9M Z c \ i.\ _ _ f0
*_ I!R7}-m |0西子博客 c0s t N {&?4d ]西子博客 x R!f,[1w%L西子博客 i X q-a1E&d J0k-z西子博客 i0W g.~ \西子博客7h4R7[)L$e X Y z5D
t;O"?-M-F'n,a0西子博客 c V Y ]8M8g$A @ a%Y | T西子博客 m x7b4v7J/N西子博客8M,T0@ j c5s A+_ T2s Q X西子博客 Z o }"a)W L

Q)J W3I t c0
\2n j8{ L U0
Y H*K&`1F0
N%e2K N }9r N$d G0西子博客 @$Z%C j9h |8R#g
W,m2S ?9w:k6@0
']:t P;J6g n*f0西子博客 ~)Y } u c:y
%X k4J;b Y @0
+D5C Q A P c'| [2u0
p4l Z z ^ I)c0西子博客+q ` c U D5M.` j4~ I西子博客'R+` s ? h | p西子博客9V G:d F h M V#@
X i V,C G/@0
K _ N y R7Z0j!o&[ \!j0西子博客 M c&{ b T T O j
+\;[ G i"V4N a {0
_9g2Y1C6n c0
!X \ Y ~ j A2y0西子博客6z$[)U P b x0Y西子博客1S A.N)]+{ G,r-k西子博客5g9v$u,F!b q5` p q;[ b D
/t [%U.j { B ~0R0
1y,S x*@ D B R0
G;} E/I M K ]0
3J%E E C e"v0西子博客 R Q Y.[.w }"A2}西子博客8];` Y9Y3^7q)\ s西子博客,W W/z;D \;z {2T S西子博客:z$])Z ] [8^ ^ s西子博客 J,I)?2]0a C*r(T西子博客*F'z x q a:o f l西子博客 y!@ S n \6i ]%d
t v b D/c K0
s H(N e1F z v H B0
M d ` z h Q I W0西子博客 G1m!S/U t/[ Q U z U0Y
)P)W2|:| ~$K k0# 从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
}

# 告诉MobileNode模拟已结束
for {set i 0} {$i < $val(nn) } {incr i} {

$ns_ at $val(stop) "$node_($i) reset";
}

#===================================
# 结束模拟
#===================================
# 结束nam与模拟器

$ns_ at $val(stop) "$ns_ nam-end-wireless $val(stop)"
$ns_ at $val(stop) "stop"
$ns_ at $val(stop) "puts \"NS EXITING...\" ; $ns_ halt"

# 设定模拟器用的stop function

proc stop {} {
global ns_ tracefd namfd

$ns_ flush-trace

close $tracefd

close $namfd

exec nam adhoc.nam &
exit 0

}

puts $tracefd "M 0.0 nn $val(nn) x $val(x) y $val(y) rp $val(rp)"

puts $tracefd "M 0.0 sc $val(sc) cp $val(cp) seed $val(seed)"
puts $tracefd "M 0.0 prop $val(prop) ant $val(ant)"

puts "Starting Simulation..."
$ns_ run西子博客 G6d n B.N!V:]
i)M O+U _(S R f0西子博客 I h:c {$^ a3l i
M t2X+@-F"t'U l0
O \ N m#? S A2h6j0西子博客 D | _0v u B西子博客/K o Q N R H
J N6a*B(] M0
l3D8d%Q k z:[2f0
+V+a s'a+s I K w0西子博客&U e T L+k8o*\$R西子博客)b$i F0s [(y4d
6u f m3? X0
6k5v { B.^ W4m"\0
d ^ Z:` d q m0西子博客$W7f ? Q.H0r西子博客/r M1d X*d S d西子博客+H {'M;a3K5[
西子博客-Q+x ? ? d.T西子博客 v | C B X l K F
^ D#H \)a'H B7m+N R%_0g0西子博客 N d u Z k u:G w p西子博客 q$r r X D X Q z o
l O9Y#g(n0
O6` } ` g b k U/x0西子博客-t0\ E%N'T k K
G l/u*S G9Z0
h l:G { I M&q0
r x m)| Y6I h0西子博客 p+A X f-G I0A&H)c

Y$X f m | n s2{ v N0西子博客 S G*l$T F
*k(\ C;P/N e ]8z'c.l0
8w M N&c2i [0
,m4\ W,f v1N$W R F0
J ] o1E X1u j1s n0 西子博客%] _ o6b }-R9e A
p w"z#w4g ? K z!? R0西子博客 _*Q @ x/m-e T o,i!f j
7X9Z @+H y-s*l o0西子博客6`4o&n;x v
*{(| c"n x g @2G0
;[1r)u | V7C @0
&[ M(n q6e&W Q0西子博客;x)L d#c v%t O E q
:y&t [ R G Y#j T*f0
B } G V `2{'Y0
[ ` P R I A0
j,q K t#Y a$G)^0西子博客;p p {2a5i.L
;V6{ x v6~ g"i r W j l c9z ]0西子博客 i P.n y-Q Z [ c西子博客,N ` ?4i Y _西子博客 ]-[8k T w B K t j5f*F g西子博客$r,b/]6q)H*a
I I \ M)} _5f0西子博客#t A U I Z ~2J H
/Z b | A u%h n9Q t q0
2e:? T S m I4}0西子博客 }"[ c @ b2G C
?4l s C Y L r0西子博客 f u$@-T(B q.A
H [(g2t1s;F%m i0
5r#p j!x!A(| _:V0
C q r W+o#S2X U8_0西子博客8L b*F z H4p C M

运行ns adhoc.tcl命令后,报错信息如下:
ns: _o46 setdest 0.0 600.0 60.0:
(_o46 cmd line 1)

invoked from within
"_o46 cmd setdest 0.0 600.0 60.0"

invoked from within

"catch "$self cmd $args" ret"

invoked from within

"if [catch "$self cmd $args" ret] {
set cls [$self info class]

global errorInfo

set savedInfo $errorInfo
error "error when calling class $cls: $args" $..."

(procedure "_o46" line 2)
(SplitObject unknown line 2)

invoked from within

"_o46 setdest 0.0 600.0 60.0"
m6x I \'L Q v+U$K m0
,N g(v @ ?7\ r C0西子博客 U b p/s p3t-Y F4n k
;j z'[ z$B'E J0西子博客 d I u6E v,d N西子博客 y O [ l q f西子博客:U2V v)y ? o } ^西子博客 n2` c g g x s N
6p!V p6V ~ | ]3E0西子博客 y e ~+m q [西子博客-W6p'S H#| i
V s {$n ~ o)l6D!B0西子博客 I-c ]'d F,b9e1k q a*l
:w G H k O V Z*P e-o w0西子博客 y;P,~5v w4_ M2E y n J ?9p西子博客6B(|:s V W9V4Z.J
q z u!`0F/`0
.Z E3q!} g-R B;B+k#}2m2]0可以看出问题出在使得两个移动节点移动的代码处(tcl源码中红色部分标记),把移动节点移动的两行代码去掉,ns-2仿真就不报错了,一加上就报错。

我的4个节点是2个固定,2个移动。

反复调试不得其解,于是仔细检查了一下源代码
在MobileNode::command(int argc, const char*const* argv)的处理setdest命令的接口中,有一句判断西子博客 J k B k h%c6T
+H!R D$g*C4_ l0 西子博客 g p c o!p ^&Y ]
"|+I Q | c { U4l J.d,N0西子博客 v s L(p,R
5E W;N5\*] Y v0西子博客8e g*^,a ] P2z D.^

CODE:if (set_destination(atof(argv[2]), atof(argv[3]), atof(argv[4])) < 0)
return TCL_ERROR;

再去看这个函数:MobileNode::set_destination(double x, double y, double s),会发现里面有这一段:
0N,D0L B%m \0西子博客9n v0E z W2N
N } Q X ?0 西子博客 T Q d0C y5R2o-~.w O+K

CODE:if(x >= T_->upperX() || x <= T_->lowerX())
return -1;

if(y >= T_->upperY() || y <= T_->lowerY())

return -1;

也就是说,你不能让你的Node移动到边界,所以,当把脚本改成:

# 从0秒开始,节点2开始从位置(0,600)移動到(0,0),速度為60.0 m/s
$ns_ at 0.0 "$node_(2) setdest 0.1 0.1 60.0 "
# 从0秒开始,节点3开始从位置(400,600)移動到(400,0),速度為60.0 m/s
$ns_ at 0.0 "$node_(3) setdest 400.0 0.1 60.0 "
@ N:`"B | z c6j0
t v }'{ ? z Q0西子博客6U e+j T"n @)F8m西子博客%g+\&B9V y I&Y西子博客3W6{3p'y4?西子博客3} s h y-H B
s N a.y4{ g2] z e C0
L%K&o b W b0
%W!m `*C ^:C r W0
g6{ P g8e'}0?;K0
就好了

解决问题的启示就是,遇到解决不了的问题不妨多参看下ns源代码
Y6C T L H z,a-U0 西子博客 i D a S ? B0T
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: