como definir um nó para dormir em ns2

1

Eu só quero definir um nó para dormir em "ns-2" e eu procurei em protocolos e eu encontrei um monte de objetos e funções sobre o sono, mas eu não poderia usá-los em outros protocolos para definir um nó para dormir.
Quando eu usá-los eu recebo falha de segmentação ou ponto flutuante e eu sei o que esses erros significam, mas não consigo encontrar uma maneira de resolvê-los. Como quando eu uso a função sleep () de "SMAC".
Eu procurei no google e depois de uma semana eu ainda não encontrei nenhuma solução ...! vocês poderiam me ajudar aqui ...?

    
por Jenova 20.10.2015 / 09:46

2 respostas

1

Eu encontrei a solução meses atrás, mas eu vi essa minha pergunta, então eu disse: vamos responder assim, pessoas como eu que não conseguiram encontrar a resposta até passar por todo esse problema, poderiam facilmente descobrir como resolvê-la ...

Bem, primeiro de tudo, deixe-me apresentar-lhe os códigos do protocolo no ns2.
Um protocolo foi criado com 2 arquivos principais (existem alguns protocolos com apenas um arquivo também, mas eu estou falando sobre a maioria deles) no ns2 que um deles tem .cc type que contém o nome do protocolo (como o AODV. cc) para definição e o outro tem o tipo .h para declaração e também contém o nome do protocolo (como AODV.h).


Pode haver outros arquivos, incluindo o protocolo, mas o principal é protocolname.cc .


Precisamos alterar / adicionar algumas funções no protocolname.cc para que possamos simular nosso próprio protocolo.

Por exemplo:
Precisamos usar o clustering para nosso protocolo:
AODV.h:

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

AODV.cc:

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

Agora sabemos como funciona o mecanismo do ns2. Portanto, vamos começar com os nós do sono.
Primeiro de tudo, há 4 funções no ns2 para transformar um nó em 'off', 'on', 'sleep', 'inativo'. A diferença entre estes não é tão grande. Como você sabe, a função 'off' desativa um nó, mas ainda transmite algo baseado em seu protocolo.

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

E você pode ativá-lo como:

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

A base é:

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

Eu não sei como definir um nó para dormir em scenario.tcl, mas você pode fazer isso nos códigos do seu protocolo.
Agora, para definir um nó para dormir, poderíamos fazer várias coisas ...

  • configurando nós para dormir do modelo de energia
  • configurando nós para dormir da física sem fio

Primeiro, tentaremos energymodel.cc e, se não funcionar, usaremos a outra.
Para definir um nó para dormir em energymodel.cc , podemos usar esse código na função void Mac802_11::recv em 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);
    }
}

Substitua myNode pelo número da interface que você deseja desativá-lo.
Se você não estiver usando MultiInterface para sua simulação, então o número de interfaces será igual ao número de seus nós.

exemplo:
Normal:

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

MultiInterface:

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

Abra um terminal e cd no seu diretório ns2, por exemplo, se você tiver ns-allinone-2.35 , cd to /ns-allinone-2.35/ns-2.35/ e agora digite make e inter. Depois que terminar tente simular o seu cenário.tcl.

Agora, se a sua simulação começar e você vir o arquivo nam, quando os nós obtiverem o primeiro pacote, a forma deles deve mudar de balck circle para círculo preto hexágono azul . br> A partir de então, os nós não devem enviar ou receber qualquer pacote de dados.

Se esse caminho não funcionar agora, é hora de usar a outra opção.
Vá para /ns-2.35/mac/ e abra wireless-phy.cc.
Você verá que no final do arquivo ele contém nossa função 4 que precisamos.
podemos simplesmente usar essas funções no wireless-phy.cc para definir um nó para dormir ou desligar apenas chamando essas funções. Mas podemos precisar usá-las em outra camada como no mac.
Para usar essas funções em mac-802_11.cc , simplesmente use o código abaixo em qualquer lugar que você quiser em mac-802_11.cc e adicione wireless-phy.cc aos seus cabeçalhos 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();

E para usar outra dessas 4 funções basta alterar o nome da função como ->node_sleep(); to ->node_wakeup(); .

    
por Jenova 09.12.2015 / 21:46
1

Um nó pode ser "Desativado" e "Ativado" invocando WirelessPhy::command(int argc, const char*const* argv) de WirelessPhy.cc do script Tcl. Para fazer isso, digamos para Node_(0) , uma vez que o nó é definido no script Tcl, faça:

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

Observe que a variável netif_ é uma matriz e, portanto, usamos netif_(0) para obter o identificador para a primeira interface de rede. netif_(1) e netif(2) ... pode ser usado da mesma forma para as segundas e terceiras interfaces de rede, se o nó foi configurado com várias interfaces.

Quando as alças forem trazidas para o escopo local, podemos usar qualquer comando que seja definido em WirelessPhy e podemos usar $Netif_0 NodeOff para desativar o nó para desativar a interface de rede.

    
por Tiken 12.04.2016 / 04:57