web-dev-qa-db-ja.com

ns2でノードをスリープ状態に設定する方法

「ns-2」でノードをスリープ状態にしたいだけで、プロトコルを検索して、スリープに関する多くのオブジェクトと機能を見つけましたが、他のプロトコルでそれらを使用してノードをスリープ状態に設定できませんでした。
それらを使用すると、セグメンテーションフォールトまたは浮動小数点を取得し、これらのエラーの意味を知っていますが、それらを解決する方法を見つけることができません。
「SMAC」からsleep()関数を使用するときのように。
Googleで検索しましたが、1週間経っても解決策が見つかりませんでした...!ここで私を助けてくれませんか...?

1
Jenova

私は数ヶ月前に解決策を見つけましたが、私のこの質問を見たので答えましょうと言ったので、そのようなトラブルをすべて経験するまで答えを見つけることができなかった私のような人々は、それを解決する方法を簡単に見つけることができます...

まず、ns2のプロトコルのコードを紹介します。
2つのメインファイルでプロトコルが作成されました(1つのファイルのみのプロトコルもありますが、ほとんどのプロトコルについては話している)。そのうちの1つには_.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のメカニズムがどのように機能するかがわかったので、スリープノードから始めましょう。
まず、ns2には、ノードを「オフ」、「オン」、「スリープ」、「アイドル」に切り替えるための4つの関数があります。これらの違いはそれほど大きくありません。
ご存じのとおり、「オフ」機能はノードをオフにしますが、プロトコルに基づいて何かをブロードキャストします。

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

そして、次のようにオンにすることができます:

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

ベースは次のとおりです。

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

Scenario.tclでノードをスリープ状態に設定する方法はわかりませんが、プロトコルのコードでそれを行うことができます。
今、ノードをスリープ状態に設定するために、いくつかのことができます...

  • ノードをエネルギーモデルからスリープ状態に設定する
  • ノードをワイヤレス物理からスリープ状態に設定する

最初に_energymodel.cc_を試し、うまくいかなかった場合はもう1つを使用します。
ノードを_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およびinterと入力します。終了したら、scenario.tclをシミュレートしてください。

シミュレーションが開始され、namファイルが表示されている場合、ノードが最初のパケットを取得すると、それらの形状はbalck circleから黒い円の青い六角形
それ以降、ノードはデータパケットを送受信してはなりません。

この方法でうまくいかなかった場合は、もう1つのオプションを使用します。
_/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();
_

そして、これら4つの関数の別の1つを使用するには、->node_sleep();のような関数の名前を->node_wakeup();に変更するだけです。

1
Jenova