要做一个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