web-dev-qa-db-fra.com

comment définir un noeud pour dormir en ns2

Je veux juste définir un nœud pour dormir dans "ns-2" et j'ai cherché dans les protocoles et j'ai trouvé beaucoup d'objets et de fonctions sur la veille, mais je ne pouvais pas les utiliser dans d'autres protocoles pour définir un nœud en veille.
Quand je les utilise, je reçois une erreur de segmentation ou un point flottant et je sais ce que signifient ces erreurs, mais je ne trouve pas le moyen de les résoudre.
Comme lorsque j'utilise la fonction sleep () de "SMAC".
J'ai cherché dans Google et après une semaine, je n'ai toujours pas trouvé de solution ...! pourriez-vous les gars s'il vous plaît aidez-moi ici ...?

1
Jenova

J'ai trouvé la solution il y a des mois, mais j'ai vu cette question, alors j'ai dit, répondons-y, des gens comme moi qui ne trouvaient pas de réponse avant d'avoir traversé tous ces ennuis, pourraient facilement trouver comment résoudre ce problème ...

Bien, permettez-moi tout d’abord de vous présenter les codes de protocole dans ns2.
Un protocole a été créé avec 2 fichiers principaux (il en existe plusieurs avec un seul fichier mais je parle de la plupart d’entre eux) dans ns2, l’un d’eux ayant le type .cc qui contient le nom du protocole (comme AODV.cc) pour la définition et l’autre a le type .h pour la déclaration et il contient également le nom du protocole (comme AODV.h).

enter image description here

Il pourrait y avoir d’autres fichiers, y compris le protocole, mais le fichier principal est protocolname.cc.

enter image description here

Nous devons modifier/ajouter des fonctions dans le protocolname.cc afin de pouvoir simuler notre propre protocole.

Par exemple :
Nous devons utiliser le clustering pour notre protocole:
AODV.h:

public:
    AODV();
    void CLUSTERING();
    ...

AODV.cc:

void AODV::CLUSTERING(){
    if(current_){
         while(numberofNodes){
               // Selecting clusters
         }
    }
}

Nous savons maintenant comment fonctionne le mécanisme de ns2. Commençons par les nœuds de sommeil.
Tout d’abord, il existe 4 fonctions dans ns2 pour activer un nœud en "off", "on", "sleep", "inactif". La différence entre ceux-ci ne sont pas si grands.
Comme vous le savez, la fonction "off" désactive un nœud, mais diffuse toujours quelque chose en fonction de votre protocole.

$ns_ at 7.0 "$node(2) off"

Et vous pouvez l'activer comme:

$ns_ at 7.0 "$node(2) on"

La base est:

$simulator at $time "$Node_($number) off"

Je ne sais pas comment mettre un noeud en veille dans scenario.tcl, mais vous pouvez le faire dans les codes de votre protocole.
Maintenant, pour mettre un nœud en veille, nous pourrions faire plusieurs choses ...

  • établissement de noeuds pour dormir à partir du modèle énergétique
  • mise en veille de la physique sans fil

Nous allons d’abord essayer energymodel.cc et si cela ne fonctionne pas, nous utiliserons l’autre.
Pour définir un noeud en veille à partir de energymodel.cc, nous pouvons utiliser ce code dans void Mac802_11::recv pour fonctionner en ns-2.35/mac/mac-802_11.cc:

if(index_ == myNode){
    EnergyModel *em = netif_->node()->energy_model();
    if (em && em->sleep()) {
        em->set_node_sleep(1);
        //em->set_node_state(EnergyModel::INROUTE);
    }
}

Remplacez myNode par le numéro de l'interface que vous souhaitez désactiver.
Si vous n'utilisez pas MultiInterface pour votre simulation, le nombre d'interfaces sera égal au nombre de vos nœuds.

exemple :
Ordinaire :

            node ---- > interface ----> channel

MultiInterface:

                         ---- > interface[0] -----|
                        |                          ---------|
                        |                                   v
            node -------|---- > interface[1] --------- > channel
                        |                                   ^
                        |                         ----------|
                         ---- > interface[2] -----|

Ouvrez un terminal et cd dans votre répertoire ns2, par exemple si vous avez ns-allinone-2.35, cd à /ns-allinone-2.35/ns-2.35/ et tapez maintenant make et inter. Une fois terminé, essayez de simuler votre scenario.tcl.

Maintenant, si votre simulation démarre et que vous voyez le fichier nom, lorsque les noeuds reçoivent le premier paquet, leur forme doit changer de . Cercle noir à cercle noir hexagone bleu .
Dès lors, les nœuds ne doivent ni envoyer ni recevoir de paquet de données.

Si cette méthode ne fonctionnait pas maintenant, il était temps d'utiliser l'autre option.
Allez à /ns-2.35/mac/ et ouvrez wireless-phy.cc.
Vous verrez qu’à la fin du fichier, il contient les 4 fonctions dont nous avons besoin.
nous pouvons simplement utiliser ces fonctions sur le réseau wireless-phy.cc pour définir un nœud en veille ou en veille en appelant simplement ces fonctions.Mais il se peut que nous devions les utiliser dans une autre couche, comme dans mac.
Pour utiliser ces fonctions dans mac-802_11.cc, utilisez simplement le code ci-dessous où vous voulez dans mac-802_11.cc et ajoutez wireless-phy.cc à vos en-têtes Mac:

 #include "wireless-phy.h" // at the header of mac-802_11.cc
 /*
  * Use the below code in any function you want in mac
  */
 Phy *p;
 p=netif_;
 ((WirelessPhy *)p)->node_sleep();

Et pour utiliser une autre de ces 4 fonctions, il suffit de changer le nom de la fonction comme ->node_sleep(); en ->node_wakeup();.

1
Jenova

Un nœud peut être "Off" et "On" en appelant WirelessPhy::command(int argc, const char*const* argv) de WirelessPhy.cc à partir du script Tcl. Pour faire cela, disons pour Node_(0), une fois que le noeud est défini dans le script Tcl, faites:

set        Netif_0        [$Node_(0) set netif_(0)]

Notez que la variable netif_ est un tableau et nous utilisons donc netif_(0) pour obtenir le descripteur de la première interface réseau. netif_(1) et netif(2)... peuvent être utilisés de la même manière pour les deuxième et troisième interfaces réseau, si le nœud a été configuré avec plusieurs interfaces.

Une fois que les descripteurs sont ramenés au niveau local, nous pouvons utiliser n’importe quelle commande définie dans WirelessPhy et utiliser $Netif_0 NodeOff pour désactiver le nœud afin de désactiver l’interface réseau.

1
Tiken