Как установить узел для сна в 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
отключить узел, чтобы деактивировать сетевой интерфейс.