В данном примере мы собираемся просимулировать простой многоинтервальный беспроводной сценарий, состоящий из 3 подвижных узлов. Как и в предыдущем примере, подвижные узлы передвигаются внутри границ определенной топологии. Однако передвижения узла для этого примера будут взяты из файла scen-3-test. scen-3-test определяет рандомное передвижение 3 подвижных узлов внутри топологии 670*670 м. Этот файл доступен как часть дистрибутива ns и находится по пути ~ns/tcl/mobility/scene. Рандомное передвижение узлов может быть сгенерировано с использованием генератора передвижения узлов setdest.

        В дополнении к передвижению узлов потоки трафика, которые установлены между подвижными узлами, также будут взяты из шаблона под названием cbr-3-test. cbr-3-test также доступен под ~ns/tcl/mobility/scene. Рандомные CBR и TCP потоки устанавливаются между 3 подвижными узлами и пакеты информации отправляются, перенаправляются или принимаются узлами внутри зоны радиослышимости друг друга. Чтобы узнать подробнее об установках, содержащихся в этом файле, откроем его:

          #

# 0 connecting to 2 at time 127.93667922166023

#

set udp_(0) [new Agent/UDP]

$ns_ attach-agent $node_(0) $udp_(0)

set null_(0) [new Agent/Null]

$ns_ attach-agent $node_(2) $null_(0)

set cbr_(0) [new Application/Traffic/CBR]

$cbr_(0) set packetSize_ 512

$cbr_(0) set interval_ 4.0

$cbr_(0) set random_ 1

$cbr_(0) set maxpkts_ 10000

$cbr_(0) attach-agent $udp_(0)

$ns_ connect $udp_(0) $null_(0)

$ns_ at 127.93667922166023 "$cbr_(0) start"

 

set tcp [new Agent/TCP]

$tcp set class_ 2

set sink [new Agent/TCPSink]

$ns_ attach-agent $node_(1) $tcp

$ns_ attach-agent $node_(2) $sink

$ns_ connect $tcp $sink

set ftp [new Application/FTP]

$ftp attach-agent $tcp

$ns_ at 150.00000000000000 "$ftp start

        Такие файлы-шаблоны для трафика могут быть сгенерированы с помощью скрипта для генерации TCP/CBR трафика.

       Внесем изменения в скрипт, разработанный в предыдущем примере. В дополнении к переменным, которые были объявлены в начале скрипта, установим еще несколько параметров, таких как: шаблон соединения и файл передвижения узлов, значения x и y для границы топологии, начальное значение для генератора рандомных чисел, время окончания симуляции.

         set val(chan)       Channel/WirelessChannel

set val(prop)       Propagation/TwoRayGround

set val(netif)      Phy/WirelessPhy

set val(mac)        Mac/802_11

set val(ifq)        Queue/DropTail/PriQueue

set val(ll)         LL

set val(ant)        Antenna/OmniAntenna

set val(x)              670   ;# X dimension of the topography

set val(y)              670   ;# Y dimension of the topography

set val(ifqlen)         50            ;# max packet in ifq

set val(seed)           0.0

set val(adhocRouting)   DSR                         

set val(nn)             3             ;# how many nodes are simulated

set val(cp)             "../mobility/scene/cbr-3-test"

set val(sc)             "../mobility/scene/scen-3-test"

set val(stop)           2000.0           ;# simulation time

Число подвижных узлов изменилось до 3, а также вместо DSDV (Destination sequence distance vector) в качестве протокола ad hoc используем DSR (dynamic source routing).

После создания объекта симуляции ns откроем файл wireless1-out.tr для беспроводной трассировки. Также необходимо установить трассировку для визуализатора nam.

set tracefd  [open wireless1-out.tr w]      ;# for wireless traces

$ns_ trace-all $tracefd

 

set namtrace [open wireless1-out.nam w]           ;# for nam tracing

$ns_ namtrace-all-wireless $namtrace $val(x) $val(y)

Далее (после создания подвижных узлов также как и в предыдущем примере) источник шаблонов для передвижения узлов и соединения, которые раньше были установлены как val(sc) и val(cp) соответственно.

#

# Define node movement model

#

puts "Loading connection pattern..."

source $val(cp)

 

#

# Define traffic model

#

puts "Loading scenario file..."

source $val(sc)

В файле scen-3-test мы видим следующие команды:

$ns_ at 50.000000000000 "$node_(2) setdest 369.463244915743 \

170.519203111152 3.371785899154"

Это означает, что на 50-й секунде узел 2 начнет движение по направлению к точке (368.4,170.5) со скоростью 3,37 м/с.

$god_ set-dist 1 2 2

Это командные строки, используемые для загрузки god объекта с информацией о самых коротких скачках. Это означает, что наиболее короткий путь между узлами 1 и 2 – 2 скачка. Предоставлением этой информации предотвращается вычисление короткого расстояния между узлами объектом god в процессе моделирования трасс, что может быть весьма трудоемким.

Программа setdest генерирует файл передвижения узлов с помощью случайного путевого алгоритма. Таким образом, файлы передвижения, сгенерированные с использованием setdest, всегда включают такие строки, чтобы загрузить объект god в необходимое время с необходимой информацией.

Программа, называемая calcdest, может быть использована для комментирования файлов передвижения, сгенерированных с помощью других средств с линиями god информации. Calcdest делает некоторые допущения о формате строк во входном файле передвижения, которые будут причиной для возникновения ошибки, если файл не будет предварительно отформатирован. Если calcdest отвергает созданный вами файл, то самый простой способ его отформатировать – загрузить его в ad-hockey и затем сохранить заново. Если ad-hockey сможет прочесть входной файл, то выходной будет правильно отформатирован для calcdest.

Оба и calcdest, и setdest считают наиболее короткой число скачков между узлами, расположенными в номинальной радио области,  игнорируя все явления, которые могут накладываться на модель рапространения на самом деле. Номинальная область либо приводится в качестве аргумента программы, либо выделяется из заголовка файла передвижения.

Далее добавим следующие строки для обеспечения начальных позиций узлов в визуализаторе. Однако отметим, что только передвижение узлов может быть заметно в nam. Разгрузка информации трафика и визуализация движения пакетов для беспроводных сценариев все еще не поддерживается.

# Define node initial position in nam

for {set i 0} {$i < $val(nn)} {incr i} {

 

        # 20 defines the node size in nam, must adjust it according to your

        # scenario size.

        # The function must be called after mobility model is defined

        $ns_ initial_node_pos $node_($i) 20

Далее добавим информационные заголовки для файла трассировки прямо перед строкой ns run.

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

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)"

В остальном скрипт остается неизменным.

После запуска данного скрипта будут созданы два файла трассировки. Запуская wireless1-out.nam, мы видим 3 подвижных узла, движущихся в окне визуализатора nam. Однако, как было упомянут ранее, потоки трафика увидеть нельзя. 


Рис. 1. Начальное положение беспроводных узлов.


Рис. 2. Конеченое положение беспроводных узлов.

Для разнообразия можно изменить включение на выключение AgentTrace, RouteTrace, MacTrace и movementTrace. Из файла трассировки мы узнаем тогда, что узлы 0 и 2 находятся вне диапазона и не могут слышать друг друга. Узел 1 может соединится с обоими из них. Так все пакеты, отправляемые для узлов 0 и 2 проходят через узел 1. 

Фрагмент файла трассировки:

M 0.0 nn 3 x 670 y 670 rp DSR

M 0.0 sc /home/radist/Documents/ns-allinone-2.35/ns-2.35/tcl/mobility/scene/scen-3-test cp /home/radist/Documents/ns-allinone-2.35/ns-2.35/tcl/mobility/scene/cbr-3-test seed 0.0

M 0.0 prop Propagation/TwoRayGround ant Antenna/OmniAntenna

Sconfig 0.00000 tap: on snoop: rts? on errs? on

Sconfig 0.00000 salvage: on !bd replies? on

Sconfig 0.00000 grat error: on grat reply: on

Sconfig 0.00000 $reply for props: on ring 0 search: on

Sconfig 0.00000 using MOBICACHE

M 33.00000 0 (83.36, 239.44, 0.00), (89.66, 283.49), 19.15

M 50.00000 2 (591.26, 199.37, 0.00), (369.46, 170.52), 3.37

M 51.00000 1 (257.05, 345.36, 0.00), (221.83, 80.86), 14.91

s 127.936679222 _0_ AGT  --- 0 cbr 512 [0 0 0 0] ------- [0:0 2:0 32 0] [0] 0 3

SFESTs 127.993943734 _0_ 0 [0 -> 2] 1(1) to 1 [0 |1 2 ]

r 128.006847881 _2_ AGT  --- 0 cbr 512 [13a 2 1 800] ------- [0:0 2:0 31 2] [0] 2 3

s 131.663684440 _0_ AGT  --- 4 cbr 512 [0 0 0 0] ------- [0:0 2:0 32 0] [1] 0 3

SFESTs 131.663684440 _0_ 4 [0 -> 2] 1(1) to 1 [0 |1 2 ]

r 131.675524586 _2_ AGT  --- 4 cbr 512 [13a 2 1 800] ------- [0:0 2:0 31 2] [1] 2 3

s 133.945590635 _0_ AGT  --- 5 cbr 512 [0 0 0 0] ------- [0:0 2:0 32 0] [2] 0 3

SFESTs 133.945590635 _0_ 5 [0 -> 2] 1(1) to 1 [0 |1 2 ]

r 133.958070782 _2_ AGT  --- 5 cbr 512 [13a 2 1 800] ------- [0:0 2:0 31 2] [2] 2 3

s 137.188115528 _0_ AGT  --- 6 cbr 512 [0 0 0 0] ------- [0:0 2:0 32 0] [3] 0 3

SFs 137.188115528 _0_ 6 [0 -> 2] 1(0) to 1 

SFf 137.193833947 _1_ 6 [0 -> 2] 1 to 2

r 137.199595674 _2_ AGT  --- 6 cbr 512 [13a 2 1 800] ------- [0:0 2:0 31 2] [3] 2 3

s 139.503813140 _0_ AGT  --- 7 cbr 512 [0 0 0 0] ------- [0:0 2:0 32 0] [4] 0 3

SFESTs 139.503813140 _0_ 7 [0 -> 2] 1(1) to 1 [0 |1 2 ]

r 139.516193286 _2_ AGT  --- 7 cbr 512 [13a 2 1 800] ------- [0:0 2:0 31 2] [4] 2 3

s 142.916715894 _0_ AGT  --- 8 cbr 512 [0 0 0 0] ------- [0:0 2:0 32 0] [5] 0 3

SFs 142.916715894 _0_ 8 [0 -> 2] 1(0) to 1 

SFf 142.922614313 _1_ 8 [0 -> 2] 1 to 2...