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

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

1
задан 10 December 2015 в 21:50

2 ответа

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

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

enter image description here

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

enter image description here

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

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

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

AODV.cc:

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

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

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

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

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

Основа:

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

Я не знаю, как установить узел для сна в scenario.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

MultiInterface:

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

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

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

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

И использовать другой тех 4 функция просто меняют имя функции как ->node_sleep(); кому: ->node_wakeup();.

1
ответ дан 7 December 2019 в 13:52

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

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

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

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

1
ответ дан 7 December 2019 в 13:52

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

Похожие вопросы: