さて、私のプロジェクトを完了した後、私はそれをどのように行ったかを共有したいと思います。私はまだ学んでいますが、はい、私はそれをこのようにしました。
シナリオはワイヤレスです。
NSではノードの生成は簡単です。
set ノード(0)[$nsノード]
set ノード(1)[$nsノード]
ここで、ノードは配列です。
ノードの位置を設定します。
$ ノード(0)はX_20.0を設定します
$ nodes(0)set Y_ 100.0
ある種の数式を使用して、ノードのトポロジーを生成できます。つまり、それらの位置付け。ns2-directory / tcl / ex/wireless-flooding.tclを見てください。
ノードごとにエージェントを生成し、ノードに接続します。
set agent(0)[new Agent / MyAgent]
$ nodes(0)attach-agent $ agent(0)$ MESSAGE_PORT
プロトコルの論理的な動作はすべてエージェントで行われるため、MyAgentのcppクラスを作成します。また、Makefileに追加します。
クラスMyAgent:public Agent {
// recv()関数をオーバーライドします。
//このクラスのオブジェクトがtclファイルで何らかの作業を行うように要求されるたびに呼び出される、このクラスのコマンド関数を追加します。
//PINGおよびPING_REPLYから取得したネイバーのアドレスを保存するためstd::vector myNeighbors;
}
次に、すべてのエージェントがPINGメッセージをブロードキャストし、PING_REPLYメッセージで送信者に返信します。
これは、パラメータaddr_=-1を指定してアドレスns_addr_tを送信することで実行できます。
ns_addr_t naddr;
naddr.addr_ = -1
これらのメッセージは異なるタイプのパケットであり、次のようなcppクラスで再度作成されます。
列挙型{PING、PING_REPLY};
クラスHdrPing{
タイプタイプ;
//getterおよびsetter関数とoffsetなどの他の変数。
}
分散プロトコルの作成方法とまったく同じように、メッセージの受信に関するロジックを作成するために、Agentのrecv()をオーバーライドします。
void MyAgent :: recv(Packet * p、Handle * h){
switch(HdrPing :: access(p)-> type){
case PING:
// send PING_REPLY back to sender and add the source of the packet p
// to my neighbor list.
// we can get it from ipHdr->saddr(), which is source address in the
// IP header of the packet.
break;
case PING_REPLY:
// add the sender of messge to my neighbor list.
break;
// other types of messages are also programmed here.
}//スイッチを閉じる
}
このようにして、私は私の隣人が誰であるかを知ることができます。
より多くの種類のメッセージとより多くの機能を追加できます。