Как установить узел для сна в NS2

Я просто хочу перевести узел в спящий режим "ns-2", и я искал в протоколах, и я нашел много объектов и функций, связанных со сном, но я не мог использовать их в других протоколах, чтобы перевести узел в спящий режим.
Когда я их использую, я получаю ошибку сегментации или с плавающей точкой, и я знаю, что означают эти ошибки, но я не могу найти способ их решить.
Например, когда я использую функцию sleep() из "SMAC".
Я искал в Google, и через неделю я все еще не нашел никакого решения...! не могли бы вы, ребята, помочь мне здесь...?

2 ответа

Решение

Я нашел решение несколько месяцев назад, но я увидел этот мой вопрос, поэтому я сказал, что давайте ответим на него так, что люди, подобные мне, которые не могли найти ответ, пока не преодолеют все эти неприятности, могут легко найти способ их решения...

Ну, во-первых, позвольте мне познакомить вас с кодами протокола в NS2.
Протокол был создан с 2 основными файлами (есть некоторые протоколы только с одним файлом, но я говорю о большинстве из них) в ns2, который имеет один из них .cc тип, который содержит имя протокола (например, AODV.cc) для определения, а другой имеет .h введите для объявления, а также содержит имя протокола (например, AODV.h).


Могут быть и другие файлы, включая протокол, но главное protocolname.cc,


Нам нужно изменить / добавить некоторые функции в protocolname.cc чтобы мы могли смоделировать наш собственный протокол.

Например:
Нам нужно использовать кластеризацию для нашего протокола:
AODV.h:

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

AODV.cc:

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

Теперь мы знаем, как работает механизм ns2. Итак, давайте начнем с узлов сна.
Прежде всего, в ns2 есть 4 функции для выключения узла, "включения", "сна", "ожидания". Разница между ними не так велика.
Как вы знаете, функция "off" выключает узел, но все равно передает что-то на основе вашего протокола.

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

И вы можете включить его как:

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

База это:

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

Я не знаю, как перевести узел в спящий файл script.tcl, но вы можете сделать это в кодах вашего протокола.
Теперь, чтобы перевести узел в спящий режим, мы могли бы сделать несколько вещей...

  • установка узлов для сна из энергетической модели
  • установка узлов для сна из беспроводной физики

Сначала мы попробуем energymodel.cc и если это не сработает, мы будем использовать другой.
Чтобы перевести узел в спящий режим energymodel.cc мы можем использовать этот код в void Mac802_11::recv функция в 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);
    }
}

замещать myNode с номером интерфейса, который вы хотите отключить.
Если вы не используете MultiInterface для симуляции, то количество интерфейсов будет равно количеству ваших узлов.

пример:
Нормальный:

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

Мультиинтерфейс:

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

Откройте терминал и cd в ваш каталог ns2, например, если у вас есть ns-allinone-2.35, cd в /ns-allinone-2.35/ns-2.35/ а теперь наберите make и интер. После этого попытайтесь смоделировать ваш сценарий.

Теперь, если ваша симуляция начинается, и вы видите файл nam, когда узлы получают первый пакет, их форма должна измениться с бальк-круга на черный круг-синий шестиугольник.
С этого момента узлы не должны отправлять или получать пакеты данных.

Если этот способ не работает сейчас, пришло время использовать другой вариант.
Идти к /ns-2.35/mac/ и откройте wireless-phy.cc.
Вы увидите, что в конце файла он содержит нашу 4 нужную нам функцию.
мы можем просто использовать эти функции в wireless-phy.cc, чтобы перевести узел в спящий или отключенный режим, просто вызвав эти функции. Но нам может понадобиться использовать их на другом уровне, как в Mac.
Чтобы использовать эти функции в mac-802_11.cc просто используйте приведенный ниже код где угодно mac-802_11.cc и добавить wireless-phy.cc к вашим заголовкам 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();

И чтобы использовать еще одну из этих четырех функций, просто измените имя функции, как ->node_sleep(); в ->node_wakeup();,

Узел может быть "выключен" и "включен", вызвав WirelessPhy::command(int argc, const char*const* argv) из WirelessPhy.cc из сценария Tcl. Для этого, скажем, для Node_(0)После того, как узел определен в сценарии Tcl, выполните:

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

Обратите внимание, что переменная netif_ это массив и, следовательно, мы используем netif_(0) чтобы получить дескриптор для первого сетевого интерфейса. netif_(1) а также netif(2)... можно аналогичным образом использовать для второго и третьего сетевых интерфейсов, если узел был настроен с несколькими интерфейсами.

Как только дескрипторы переведены в локальную область, мы можем использовать любую команду, определенную в WirelessPhy и мы можем использовать $Netif_0 NodeOff отключить узел, чтобы деактивировать сетевой интерфейс.

Другие вопросы по тегам