TP3 Castalia: Utilisation de différentes couches MAC
Les chemins d'accès indiqués dans le TP sont relatif
à la racine de Castalia (normalement ~/Castalia-2.3b)
1. Comprendre les fichiers de configurations
- Editer le fichier omnetpp.ini
dans Simulations/valueReporting
- Repérer les sections qui définissent les
différents modules/protocoles qui sont utilisés pour
chaque composants/couches du capteur. Notez la méthode de
déployment des capteurs (6x6). Le manuel
utilisateur de Castalia page 14 et 15 donne les différentes
méthodes de déployment possibles: "uniform"
par exemple.
[General]
# ==========================================================
# Always include the main Castalia.ini file
# ==========================================================
include ../Parameters/Castalia.ini
sim-time-limit = 600s
SN.field_x = 100
# meters
SN.field_y = 100
# meters
SN.numNodes = 36
SN.deployment = "6x6"
SN.node[*].Communication.Radio.RadioParametersFile =
"../Parameters/Radio/CC2420.txt"
SN.node[*].Communication.RoutingProtocolName = "MultipathRingsRouting"
SN.node[*].Communication.MACProtocolName = "TMAC"
SN.node[*].ApplicationName = "ValueReporting"
SN.node[*].Communication.Radio.txPowerLevelUsed = 2
SN.node[*].Communication.Routing.neighbor_RSSIThreshold = -89.3 # in dBm
SN.node[*].Communication.Routing.collectTraceInfo = true
SN.node[3].Application.isSink = true
Vous pouvez voir que le module MAC utilisé actuellement est le
protocole TMAC qui est un dérivé de SMAC pour les
réseaux de capteurs. Le principe de ces protocoles MAC, par
rapport à un protocole de type CSMA/CA (WiFi) classique est de
définir des périodes d'activité et des
période de sommeil complet de la couche radio+MAC afin
d'économiser l'énergie car dans système sans-fils
la réception passive (réception d'un paquet qui n'est pas
pour soi) coûte presque aussi cher que l'émission d'un
paquet. Ces protocoles rajoute des mécanismes de synchronisation
entre les noeuds pour qu'ils puisse se réveiller au bon moment
par rapport à leurs voisins.
- Nous allons dans un premier temps modifier le fichier omnetpp.ini
pour utiliser le protocole CSMA
classique en insérant les lignes suivantes:
SN.node[*].Communication.MACProtocolName
= "TunableMAC"
SN.node[*].Communication.MAC.dutyCycle
= 1.0
SN.node[*].Communication.MAC.randomTxOffset
= 0
SN.node[*].Communication.MAC.backoffType
= 3
Dans Castalia, le CSMA classique est tout
simplement un cas particulier d'une implémentation qui s'appelle
TunableMAC et qui est un protocole de type CSMA dans lequel on peut
"tuner" un certain nombre de paramètres de fonctionnement pour
représenter une instance de protocole CSMA particulier. La liste
des paramètres de ce module est disponible dans le manuel
utilisateur de Castalia page 67-70 et les paramètres qui
sont modifiables sont listés dans le fichier src/node/communiation/mac/tunableMac/TunableMac.ned
qui définit la structure de ce module dans Castalia et dont un
extrait est mis ci-dessous:
//===============
These are main parameters which can be tuned ================
double
dutyCycle = default (1.0); // listening /
(sleeping+listening)
double
listenInterval = default (10); // how long do we
leave the radio in listen mode, in ms
double
beaconIntervalFraction = default (1.0); // fraction
of the sleeping interval that we send beacons
double
probTx = default (1.0); // the
probability of a single try of Transmission to happen
int numTx
= default (1); // when we have
something to Tx, how many times we try
double
randomTxOffset = default (0.0); // Tx after time
chosen randomly from interval [0..randomTxOffset]
double
reTxInterval = default (0.0); // Interval between
retransmissions in ms, (numTx-1) retransmissions
double
backoffType = default (1); // 0-->(backoff =
sleepinterval),
// 1-->(backoff = constant
value),
// 2-->(backoff = multiplying
value - e.g. 1*a, 2*a, 3*a, 4*a ...),
// 3-->(backoff = exponential
value - e.g. 2, 4, 8, 16, 32...)
int
backoffBaseValue = default (16); // the backoff base
value in ms
double
CSMApersistance = default (0); // value in [0..1],
is CSMA non-persistent, p-persistent, or 1-persistent?
bool
txAllPacketsInFreeChannel = default (true); // if you find the channel
free, tx all packets in buffer?
bool
sleepDuringBackoff = default (false); // for no
dutyCycle case: sleep when backing off?
//===============
End of tunable parameters ===================================
Un paramètre important est par exemple dutyCycle qui
définit la fraction de temp d'activité du capteur. Pour
le CSMA classique, nous mettrons donc dutyCycle=1
qui est la valeur par défaut.
2. Expérimentations avec une couche MAC CSMA classique
- Vous pouvez aussi activer le mode debug pour la couche MAC en
insérant la ligne
SN.node[*].Communication.MAC.collectTraceInfo = true
dans le fichier omnetpp.ini. Attention, cela
peut rendre votre fichier de trace très gros!
En utilisant la configuration par défaut de CSMA, relancer la
simulation pour différentes fréquences de capture et
d'envoie de messages vers le SINK. Notez la consommation
d'énergie des noeuds. Que se passe t-il si la fréquence
d'envoi est grande? Comment pouvez vous mettre en évidence ces
problèmes?
3. Modifier les paramètres de fonctionnement de TunableMac
- Par rapport à un CSMA WiFi classique où les
ordinateurs n'ont pas de problème particulier en énergie,
dans les réseaux de capteurs la conservation de l'énergie
est un critère important. Certaines couches MAC sont
différentes et permettent par exemple de définir
des intervals de temps pendant lesquels les capteurs ont leur radio et
couche MAC activées (listening
interval). Les capteurs sont essaient donc d'être le plus
souvent en mode veille où la radio et la couche MAC sont
désactivées pour économiser l'énergie. Mais
cela veut dire aussi que pendant la période d'inactivité,
les capteurs ne peuvent ni envoyer ni recevoir; ce qui peut poser des
problèmes de synchronisation car si un capteur en
activité envoie une trame à un capteur en veille, ce
dernier ne pourra pas le recevoir.
- Dans le module TunableMac
les 2 variables dutyCycle
et listenInterval
permettent de mieux définir le comportement
des capteurs. dutyCycle
définit le rapport entre le temps d'activité et le temps
total par cycle: le capteur est en mode SLEEP durant (1-dutyCycle)
fraction du cycle. listenInterval
définit le temps d'activité du capteur par cycle en ms.
La durée d'un cycle est donc définie comme étant
Tcycle=(1/dutyCycle)*listenInterval.
Le temps d'inactivité par cycle est donc déduit
grâce à ces 2 paramètres dutyCycle
et listenInterval:
temps d'inactivité= Tcycle-listenInterval.
Faites varier dutyCycle
entre 0.1 et 1 par pas de 0.1 et regarder l'effet sur la
consommation d'énergie des noeuds (exprimée en Joules)
lorsque la fréquence de capture est celle par défaut.
Tracer pour un capteur de
votre choix la consommation d'énergie en fonction de dutyCycle. Vous pouvez vous
inspirer du fichier omnetpp.ini
de l'exemple BrigeTest
pour voir comment on peut faire varier des paramètres pour la
simulation en l'indiquant dans le fichier .ini et créer des
configurations spécifiques. Le manuel de Castalia à la
page 18-19 explique cette possibilité. Vous pouvez aussi
utiliser le script Castalia, au lieu de ../../CastaliaBin, dans le
répertoire Simulations/valueReporting:
Castalia-3.2$
cd Simulation/valueReporting
Castalia-3.2/Simulation/valueReporting$
Castalia -c General
pour
ensuite utiliser le script CastaliaResults
pour afficher les résultats de manière
synthétique. Voir le manuel
utilisateur de Castalia page 20-28. IMPORTANT: pour pouvoir utiliser les
scripts Castalia
et CastaliaResults,
il faut que vous ayez dans votre variable PATH le chemin vers Castalia-3.2/bin,
ajoutez cela à votre fichier .bashrc si
besoin:
export
PATH=chemin_de_votre_castalia/bin:$PATH
où chemin_de_votre_castalia
est à remplacer par le chemin où vous avez
installé Castalia (par exemple ~/Castalia-3.2)
- Avec dutyCycle=0.1,
listenInterval=100
et une fréquence de capture toute les 0.5s (voir TP1)
déterminer le nombre de trames correctement recues par le puits
par rapport à la configuration initiale (dutyCycle=1,
listenInterval=100).
- Augmenter dutyCycle
de 0.1 à 0.6 par pas de 0.1 et tracer une courbe montrant le
nombre de trames non recues en fonction de dutyCycle.
4. Expérimentations avec SMAC et TMAC
- SMAC et TMAC sont
dans Castalia tous les deux implémenté dans le module TMAC. SMAC
est donc une instance particulière de TMAC. Le
manuel
utilisateur de Castalia page 72-74 explique les paramètres
de ce module. Tous les 2
utilisent une période d'activité et de sommeil comme
TunableMac mais ajoute des aspects synchronisation entre les noeuds
très bénéfique pour réduire les
problèmes d'émetteur actif alors que le récepteur
ne l'est pas. Ces paramètres d'activités/sommeil sont
déterminés de manière dynamique par le protocole. Le fichier src/node/communication/mac/tMac/TMAC.ned
vous donne tous les paramètres du module TMAC. Le
paramètre disableTAextension
permet de passer de
TMAC (false) à SMAC (true). Le paramètre listenTimeout
est par défaut mis à 15ms dans TMAC, ce paramètre
correspond au paramètre TA de TMAC qui lui permet, au bout de TA
ms d'inactivité radio pendant la période LISTEN de passer
de manière anticipée à une période SLEEP.
- Test avec SMAC: nous
allons remplacer la couche CSMA avec la couche SMAC et utiliser pour la
plupart des paramètres les valeurs par défaut.
Insérer les lignes suivantes dans le fichier omnetpp.ini,
toujours de l'application valueReporting.
SN.node[*].Communication.MACProtocolName = "TMAC"
SN.node[*].Communication.MAC.listenTimeout = 61
SN.node[*].Communication.MAC.disableTAextension = true
SN.node[*].Communication.MAC.conservativeTA = false
SN.node[*].Communication.MAC.collisionResolution = 0
Notez que
pour SMAC, nous mettons listenTimeout à 61ms ce
qui permet de définir un rapport listen/sleep de 10% puisque la
durée d'un cycle est défini comme étant 610ms
(voir le paramètre frameTime).
Comparer
avec les résultats que vous avez obtenus avec CSMA. Qu'est-ce
qui a changé?
- Test avec TMAC: pour
utiliser TMAC, nous allons mettre toutes les paramètres à
des valeurs par défaut comme défini dans le fichier src/node/communication/mac/tMac/TMAC.ned.
Donc nous ne garderons que la ligne:
SN.node[*].Communication.MACProtocolName
= "TMAC"
Comparer avec les
résultats que vous avez obtenus avec SMAC. Qu'est-ce qui a
changé?
- Observez l'impact
d'une augmentation du paramètre listenTimeout que vous pouvez
faire varier par exemple de 15ms (valeur par défaut) à
40ms par pas de 5ms.