![]() ![]() ![]() | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
kouki | 投稿日時: 2012/5/24 12:30 |
新米 ![]() ![]() 登録日: 2012/3/16 居住地: 投稿: 4 |
IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得 Qualnetを最近始めた者です。
現在Qualnetでsensor_networksのmac_802_15_4をいじっています。 そこで関数Mac802_15_4BeaconTxHandler内で、 親ノードがビーコンをブロードキャストで送信 した時に、宛先ではなくて送信先のノードIDを全て 取得しprintfで表示したいのですがうまくいきません。 ノードアドレスではなく、ノードIDを取得したいと考えています。 network_ip内で構造体NetworkForwardingTableRow内に NodeAddress nextHopAddressを見つけ、これが送信先 ノードIDのアドレスだと思うのですが、ここから 具体的にどのようなことをすれば送信先ノードIDを 表示できるのかわからないので、ご教示頂けると助かります。 |
hiro | 投稿日時: 2012/5/24 12:52 |
長老 ![]() ![]() 登録日: 2005/7/16 居住地: 投稿: 452 |
Re: IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得 MAPPING_GetNodeIdFromInterfaceAddress でよいのでは?
QualNet-5.2-APIReferenceGuide.pdf をじーっと眺めていると 答えが見つかることが多いです。 |
kouki | 投稿日時: 2012/5/24 15:22 |
新米 ![]() ![]() 登録日: 2012/3/16 居住地: 投稿: 4 |
Re: IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得 hiroさんありがとうございます。
ご解答を参考にさせていただき、APIを見つつ以下のようにプログラムを追加しました。 NetworkForwardingTableRow* row; row = (NetworkForwardingTableRow*) node->networkData.networkVar; NodeAddress nextHopAddr; nextHopAddr = row->nextHopAddress; MAPPING_GetNodeIdFromInterfaceAddress(node, nextHopAddr); printf("NodeID = %ld , NextHopNodeID = %ld\n",node->nodeId,nextHopAddr); このようにMac802_15_4BeaconTxHandler内に追加したのですが、 nextHopAddrは全てのノードにおいて0と表示されました。 ネットワークトポロジーはリニア型で、 1⇒2⇒3⇒4⇒5というように繋がっているので、 NodeID = 1 , NextHopNodeID = 2 NodeID = 2 , NextHopNodeID = 3 NodeID = 3 , NextHopNodeID = 4 NodeID = 4 , NextHopNodeID = 5 と出力されるのが正しいのですが、そうはなりませんでした。 また、ノード1がPAN COORで2,3,4がCOOR、5がDEVICEで5から1へCBRでデータ送信をしています。 デバイス間は離して、ノード1の無線通信範囲内にノード2以外は入らないようにするということをし、他のノードでも同様に配置しています。 ここで思ったのですが、まずIEEE802.15.4において親ノードがビーコンを ブロードキャストで送信し、それに対して子ノードがユニキャストで 返事をして、受け取ったビーコンの長さに応じてデータの送受信 を互いに開始するということを繰り返します。 そしてMac802_15_4BeaconTxHandlerはTxとあるように、ビーコンの 送信側の処理なのですが、このときビーコン送信側はブロードキャスト で自分の無線通信範囲内のノードのみにビーコンを送るので、 nextHopAddressではなく、宛先アドレスのdestAddressではないかと 思いました。 そこで以下のように改変しました。 NetworkForwardingTableRow* row; row = (NetworkForwardingTableRow*) node->networkData.networkVar; NodeAddress destAddr; destAddr = row->destAddress; MAPPING_GetNodeIdFromInterfaceAddress(node, destAddr); printf("NodeID = %ld , DestNodeID = %ld\n",node->nodeId,destAddr); そうしたら出力結果は Current Sim Time[s] = 0.000000000 Real Time[s] = 1 Completed 0% NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 3 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 3 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 3 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 3 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 3 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 3 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 NodeID = 2 , DestNodeID = 0 NodeID = 3 , DestNodeID = 0 NodeID = 1 , DestNodeID = 0 中略 NodeID = 2 , DestNodeID = 33 NodeID = 3 , DestNodeID = 53 NodeID = 4 , DestNodeID = 52 NodeID = 1 , DestNodeID = 17 NodeID = 2 , DestNodeID = 33 NodeID = 3 , DestNodeID = 53 NodeID = 4 , DestNodeID = 52 NodeID = 1 , DestNodeID = 17 NodeID = 2 , DestNodeID = 33 NodeID = 3 , DestNodeID = 53 NodeID = 4 , DestNodeID = 52 NodeID = 1 , DestNodeID = 17 NodeID = 2 , DestNodeID = 33 NodeID = 3 , DestNodeID = 53 NodeID = 4 , DestNodeID = 52 NodeID = 1 , DestNodeID = 17 NodeID = 2 , DestNodeID = 33 NodeID = 3 , DestNodeID = 53 NodeID = 4 , DestNodeID = 52 NodeID = 1 , DestNodeID = 17 NodeID = 2 , DestNodeID = 33 NodeID = 3 , DestNodeID = 53 NodeID = 4 , DestNodeID = 52 NodeID = 1 , DestNodeID = 18 NodeID = 2 , DestNodeID = 34 NodeID = 3 , DestNodeID = 53 中略 NodeID = 1 , DestNodeID = 21 NodeID = 2 , DestNodeID = 46 NodeID = 3 , DestNodeID = 74 NodeID = 4 , DestNodeID = 86 NodeID = 1 , DestNodeID = 21 NodeID = 2 , DestNodeID = 46 NodeID = 3 , DestNodeID = 74 NodeID = 4 , DestNodeID = 86 NodeID = 1 , DestNodeID = 21 NodeID = 2 , DestNodeID = 46 NodeID = 3 , DestNodeID = 74 NodeID = 4 , DestNodeID = 86 NodeID = 1 , DestNodeID = 21 NodeID = 2 , DestNodeID = 46 NodeID = 3 , DestNodeID = 74 NodeID = 4 , DestNodeID = 86 NodeID = 1 , DestNodeID = 21 NodeID = 2 , DestNodeID = 46 NodeID = 3 , DestNodeID = 74 NodeID = 4 , DestNodeID = 86 NodeID = 1 , DestNodeID = 21 NodeID = 2 , DestNodeID = 46 NodeID = 3 , DestNodeID = 74 となりました。 最初は全てのノードでDestNodeIDが0となり、0から徐々に増えていき 最終的には NodeID = 1 , DestNodeID = 21 NodeID = 2 , DestNodeID = 46 NodeID = 3 , DestNodeID = 74 NodeID = 4 , DestNodeID = 86 となりました。 こうなった理由や正しい値を出す方法を探しておりますが、 引き続きご教示頂けるとありがたいです。 |
hiro | 投稿日時: 2012/5/24 15:41 |
長老 ![]() ![]() 登録日: 2005/7/16 居住地: 投稿: 452 |
Re: IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得 えっ?
MAPPING_GetNodeIdFromInterfaceAddress は、 関数の戻り値としてNodeIdが帰ってくる関数ですけど... 色んな場所で使つかってるので、 どのような使い方をしているのか、 一度確認してみてはいかがでしょうか。 例えば、 ./libraries/developer/src/app_cbr.cpp とか、 ./main/mac.cpp とか。 |
kouki | 投稿日時: 2012/5/24 20:55 |
新米 ![]() ![]() 登録日: 2012/3/16 居住地: 投稿: 4 |
Re: IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得 hiroさん再びありがとうございます。
なるほど、勘違いをしていたようでお恥ずかしい限りです。 APIの読み込みや他のファイルの確認不足だったようです、ご指摘ありがとうございます。 あれから他のファイルを参考にして以下のようにしました。 NetworkForwardingTableRow* ip; ip = (NetworkForwardingTableRow*) node->networkData.networkVar; NodeAddress nextHopAddr = ip->nextHopAddress; NodeId nextNodeId = MAPPING_GetNodeIdFromInterfaceAddress(node, nextHopAddr); printf("NodeID = %ld , nextNodeID = %ld\n",node->nodeId,nextNodeId); それで出力結果ですが、nextNodeID = -1が延々と出てきました。 nextHopAddrを出力してみると0と出ることから、 nextHopAddressがうまく参照出来ていないんだと思います。 今までずっと色々試したり海外フォーラムを覗いたりしたのですが、 ちょっと行き詰ってしまいどうしたらよいのかわからないです。 |
hiro | 投稿日時: 2012/5/25 13:27 |
長老 ![]() ![]() 登録日: 2005/7/16 居住地: 投稿: 452 |
Re: IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得 最初に戻ってしまいますが、ちょっと確認させて下さい。
Mac802_15_4BeaconTxHandlerはBeaconの送信を行う。 送信はBroadcastで行われる。 ここまではわかりました。 > 親ノードがビーコンをブロードキャストで送信した時に、 > 宛先ではなくて送信先のノードIDを全て取得しprintfで表示したい。 Beaconの受け取り側を送信時に知りたい、ということですか? 受け取れるか/受け取れないかは、受信側の都合で決まるので、 送信時にはわかりません。 受信側で受け取ったよ、とprintfするのは何故ダメなのでしょうか。 |
hiro | 投稿日時: 2012/5/25 14:13 |
長老 ![]() ![]() 登録日: 2005/7/16 居住地: 投稿: 452 |
Re: IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得 QualNet 5.2の場合ですけど。
実際のForwardingTableを手繰っていくと、 Node構造体は、
NetworkData構造体は、
NetworkDataIp構造体は、
NetworkForwardingTable構造体は、
NetworkForwardingTableRow構造体は、
となりますが、 Nodeが複数インタフェイスの場合を考慮しなければダメです。 めんどくさいですね。 困った時のQualNet-5.2-APIReferenceGuide.pdf登場。 NetworkPrintForwardingTable(Node *node)という、便利そうなものが... この関数で、自分自身のForwardingTableが出力されるので、 まずはこの関数を使って確認してみて下さい。 ついでに、NetworkPrintForwardingTable(Node *node)の中を見ると、
なんて具合です。 このあたりを上手に解説した文書があると良いですね。 |
kouki | 投稿日時: 2012/5/28 16:34 |
新米 ![]() ![]() 登録日: 2012/3/16 居住地: 投稿: 4 |
Re: IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得 hiroさん
重ね重ねありがとうございます。 hiroさんが教えて下さったアドバイスやQualnetでのコーディングの探り方 は大変勉強になりました、本当にありがとうございます。 Beaconの送信時に受信するノードを判別するというのは仰るとおり、 確かに変ですね。 私が考えていた処理を少し見直してみようとおもいます。 NetworkPrintForwardingTableが突破口となりそうなので、その辺を 探りつつ理解していこうと思います。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |