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();
.