Я просто хочу установить узел для сна в "не уточнено 2", и я искал в протоколах, и я нашел много объектов и функций о сне, но я не мог использовать их в других протоколах для установки узла для сна.
Когда я использую их, я получаю отказ Сегментации или Плавающую точку, и я знаю то, что означают эти ошибки, но я не могу найти способ решить их.
Как то, когда я использую сон () функция от "SMAC".
Я искал в Google и после недели, я все еще не нашел решения...! могли Вы парни, помогите мне здесь...?
Я нашел решение несколько месяцев назад, но я видел этот мой вопрос, таким образом, я сказал, давайте ответим на это так, люди как я, который не мог найти ответ до прохождения через всей этой проблемы, могли легко узнать, как решить его...
Хорошо, в первую очередь, позвольте мне представить Вас кодам протокола в 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 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();
.
Узел может быть "Выключен" и "Включен" путем вызова 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
для выключения узла для деактивации Сетевого интерфейса.