1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
# ======================================================================
# Define options
# ======================================================================
# Set the parameters that we will use for wireless communications
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(ifqlen) 50; # Taille de la queue
set val(x) 1000; # X Largeur de la région (en mètres)
set val(y) 1000; # Y Hauteur de la région (en mètres)
set val(nn) 25; # Nombre de nœuds
set val(stop) 30; # Temps de la simulation (en secondes)
set val(sources) [lindex $argv 0]; # Nombre de sources passé enargument
set val(packet_size) 512; # Taille des paquets envoyés (en octets)
set val(interval) 0.1; # Intervalle d'envoi de paquets (en secondes)
set val(rp) AODV; # Protocole de routage
## Mobilité
# Définition de la variable de Random pour le placement des nœuds dans la région
global defaultRNG
$defaultRNG seed 0
set sizeRNG [new RNG]
$sizeRNG next-substream
# Variable de random utilisée pour un point sur la grille
set size_ [new RandomVariable/Uniform]; # Variable Random uniforme
$size_ set min_ 1; # Valeur minimum
$size_ set max_ 999; # Valeur maximum
$size_ use-rng $sizeRNG
# Variable de random utilisée pour une vitesse de déplacement
set sizespeed_ [new RandomVariable/Uniform]; # Variable Random uniforme
$sizespeed_ set min_ 1; # Valeur minimum
$sizespeed_ set max_ 10; # Valeur maximum
$sizespeed_ use-rng $sizeRNG
# Création du simulateur NS
set ns [new Simulator]
# Paramétrage de l'antenne
Antenna/OmniAntenna set X_ 0; # Direction de X
Antenna/OmniAntenna set Y_ 0; # Direction de Y
Antenna/OmniAntenna set Z_ 1.5; # Direction de Z
Antenna/OmniAntenna set Gt_ 1.0; # Gain de transmission
Antenna/OmniAntenna set Gr_ 1.0; # Gain de réception
# Paramétrage de l'interface réseau
Phy/WirelessPhy set CPThresh_ 10.0; # Collision Threshold
Phy/WirelessPhy set CSThresh_ 1.559e-11;# Portée de détection : 500 mètres
Phy/WirelessPhy set RXThresh_ 0.652e-10; # Portée de communication : 250 mètres (-91,1db)
Phy/WirelessPhy set bandwidth_ 2e6; # Capacité du médium : 2Mbits
Phy/WirelessPhy set Pt_ 0.28183815; # Puissance de transmission :24.5dbm
Phy/WirelessPhy set freq_ 914e+6; # Fréquence : 914MHz
Phy/WirelessPhy set L_ 1.0; # System Loss Factor
# Création des fichiers de trace
set f [open results.tr w]
$ns trace-all $f
$ns eventtrace-all
set nf [open aodv_sim.nam w]
$ns namtrace-all $nf
$ns namtrace-all-wireless $nf $val(x) $val(y)
# Topographie de la simulation
set topo [new Topography];
# Création de la région pour la simulation
$topo load_flatgrid $val(x) $val(y)
# Création du God
create-god $val(nn)
# Création du canal
set chan [new $val(chan)]
# Configuration du nœud
$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 ON \
-macTrace ON \
-movementTrace OFF
# Création des nœuds pour la simulation
for {set i 0} {$i < $val(nn)} {incr i} {
set node_($i) [$ns node]
$node_($i) random-motion 0
}
# Position des nœuds dans la région de manière aléatoire
# Spécification des déplacements aléatoires
for {set i 0} {$i < $val(nn)} {incr i} {
set X [expr round([$size_ value])]; # Position X en random sur la grille
set Y [expr round([$size_ value])]; # Position Y en random sur la grille
$node_($i) set X_ $X]; # Position X du nœud sur la grille
$node_($i) set Y_ $Y]; # Position Y du nœud sur la grille
$node_($i) set Z_ 0.0; # Position Z du nœud sur la grille
set speed [expr round([$sizespeed_ value])]; # vitesse en random entre 1m/s et 10m/s
set newX [expr round([$size_ value])]; # Position X en random sur la grille
set newY [expr round([$size_ value])]; # Position Y en random sur la grille
# Définition du premier mouvement
$ns at [expr 0.1 * $i] "$node_($i) setdest $newX $newY $speed";
# Définition des mouvements suivants si la simulation n'est pas terminée
$ns at [expr 0.1 * $i] "setNewDest $node_($i) $newX $newY";
}
# Méthode qui permet de définir une nouvelle destination au nœud mobile
proc setNewDest {node currentX currentY} {
global ns sizespeed_ size_; # Récupère les variables du programme
set speed [expr round([$sizespeed_ value])]; # Vitesse en random entre 1m/s et 10m/s
set nextX [expr round([$size_ value])]; # Position X en random sur la grille
set nextY [expr round([$size_ value])]; # Position Y en random sur la grille
set now [$ns now]; # Date courante de la simulation
set longX [expr $nextX-$currentX]; # Distance en X à parcourir
set longY [expr $nextY-$currentY]; # Distance en Y à parcourir
# Calcul de la longueur du chemin
set distance [expr sqrt(($longX*$longX)+($longY*$longY))];
# Détermination de la date d'arrivée au point destination
set arrivalDate [expr $now + [expr $distance/$speed]];
# Détermination de la prochaine date de mouvement après 5 secondes de pause
set nextMove [expr $arrivalDate + 5.0];
# Définition de la prochaine destination
$ns at $now "$node setdest $nextX $nextY $speed";
# Définition du prochain mouvement si la simulation n'est pas terminée
$ns at $nextMove "setNewDest $node $nextX $nextY";
}
# Création des agents pour les nœuds sources
for {set i 0} {$i < $val(sources)} {incr i} {
# Création de l'agent UDP
set udp_($i) [new Agent/UDP]
$ns attach-agent $node_($i) $udp_($i)
# Création de l'agent Null
set null_($i) [new Agent/Null]
$ns attach-agent $node_([expr [expr $val(nn) - 1] - $i]) $null_($i)
$ns connect $udp_($i) $null_($i)
# Création et paramètrage du CBR
set cbr_($i) [new Application/Traffic/CBR];
$cbr_($i) attach-agent $udp_($i)
$cbr_($i) set type_ CBR; # Type du CBR
$cbr_($i) set packet_size_ $val(packet_size); # Taille des paquets envoyés
$cbr_($i) set rate_ [expr $val(packet_size) * 8 / [$ns delay_parse
$val(interval)]]; # Taux
$cbr_($i) set random_ false
# Début d'envoi de paquets pas en même temps, sinon Erreur de segmentation
$ns at [expr 0.1 * $i] "$cbr_($i) start"; # Début d'envoi de paquets
$ns at $val(stop) "$cbr_($i) stop"; # Fin d'envoi de paquets
}
# Positionne les nœuds sur la grille
for {set i 0} {$i < $val(nn)} {incr i} {
$ns initial_node_pos $node_($i) 30; # 30 : taille du nœud dans nam
}
# Arrêt de la simulation
$ns at $val(stop) "finish"
$ns at [expr $val(stop) + 0.1] "$ns halt"
# Fonction appelée pour terminer la simulation
proc finish {} {
global ns f nf val
$ns flush-trace
close $f
close $nf
exec nam aodv_sim.nam &
exit 0
}
# Début de la simulation
$ns run |
Partager