Japan QualNet Community Forums Japan QualNet Community Forums
Welcome Guest 
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/05/17:13/16
2024/05/16:22/24

2024/03/18より397/1407
人気モジュール
No.1: フォーラム 99
No.2: QualNet概要 3
No.3: ニュース 2
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット79
No.2:Unknown OS1
No.3:Windows XP1

No.1:どっかの巡回ロボット70
No.2:Majestic-12巡回ロボット6
No.3:Google巡回ロボット3

日曜日からの合計
メイン
   Link (MAC) Layer Settings
     IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
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構造体は、
struct Node {
...
    NetworkData networkData;
...
};


NetworkData構造体は、
struct NetworkData {
    NetworkDataIp* networkVar;
...
};


NetworkDataIp構造体は、
struct NetworkDataIp {
...
     NetworkForwardingTable forwardTable;
...
};


NetworkForwardingTable構造体は、
typedef struct {
    int size;
    int allocatedSize;
    NetworkForwardingTableRow *row;
} NetworkForwardingTable;


NetworkForwardingTableRow構造体は、
typedef struct {
    NodeAddress destAddress;
    NodeAddress destAddressMask;
    int interfaceIndex;
    NodeAddress nextHopAddress;
    int cost;
    NetworkRoutingProtocolType protocolType;
    NetworkRoutingAdminDistanceType adminDistance;
    BOOL interfaceIsEnabled;
} NetworkForwardingTableRow;

となりますが、
Nodeが複数インタフェイスの場合を考慮しなければダメです。

めんどくさいですね。

困った時のQualNet-5.2-APIReferenceGuide.pdf登場。

NetworkPrintForwardingTable(Node *node)という、便利そうなものが...
この関数で、自分自身のForwardingTableが出力されるので、
まずはこの関数を使って確認してみて下さい。

ついでに、NetworkPrintForwardingTable(Node *node)の中を見ると、
NetworkPrintForwardingTable(Node *node) {
    NetworkDataIp *ip = (NetworkDataIp *) node->networkData.networkVar;
    NetworkForwardingTable *rt = &ip->forwardTable;
...
    for (i = 0; i < rt->size; i++) {
        char address[20];
        IO_ConvertIpAddressToString(rt->row[i].destAddress, address);
        IO_ConvertIpAddressToString(rt->row[i].destAddressMask, address);
        printf("%5u", rt->row[i].interfaceIndex);
        IO_ConvertIpAddressToString(rt->row[i].nextHopAddress, address);
        printf("%5u      ", rt->row[i].protocolType);
...


なんて具合です。

このあたりを上手に解説した文書があると良いですね。
kouki
投稿日時: 2012/5/28 16:34
新米
登録日: 2012/3/16
居住地:
投稿: 4
Re: IEEE802.15.4にてビーコンを送信している送信先ノードIDの取得
hiroさん

重ね重ねありがとうございます。
hiroさんが教えて下さったアドバイスやQualnetでのコーディングの探り方
は大変勉強になりました、本当にありがとうございます。


Beaconの送信時に受信するノードを判別するというのは仰るとおり、
確かに変ですね。
私が考えていた処理を少し見直してみようとおもいます。


NetworkPrintForwardingTableが突破口となりそうなので、その辺を
探りつつ理解していこうと思います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT