1

背景: 仮想デバイスを背後に持つ仮想 BACnet ルーターを作成しようとしています (関連記事を参照)。私のテスト環境は、私のサーバー上で実行されている VM ( 10.2.0.15 ) と、その上で実行されている BACnet エクスプローラーおよび Wireshark で構成されています。私はVS2013でコードを書いており、ローカルマシン( 192.168.56.1 )でもwiresharkを実行しています。

仮想ルーターを起動し、VM から who-is ブロードキャストを送信すると、VM で実行されている Wireshark でコマンドと応答が表示されます。私のローカル マシンでは、wireshark でコマンドのみが表示されますが、応答は表示されません。

これはすべて正常に機能します。ただし、i-am 応答の送信元アドレス (VM の Wireshark および BACnet エクスプローラーの詳細によると) は、VM と私のマシンの間のゲートウェイ (10.2.0.2) のアドレスです。

問題 特定の仮想デバイスを対象とする後続の who-is コマンドがローカル マシンに到達しません。VM で Wireshark を使用して作成されているコマンドを確認できますが、私のコードは要求を認識せず、ローカル マシンの Wireshark も新しいパケットを認識しません。

質問 最初の i-am 応答の送信元アドレスは、ローカル マシンの IP にするか、仮想デバイスに割り当てた IP アドレスにする必要がありますか? 前述のように、ソース アドレスは現在、VM と私のマシンの間のゲートウェイのアドレスです。

これは、who-is コマンドに対する応答の NPDU 部分を作成するために使用しているコードです。間違っていることを誰かが指摘してくれることを願っています。

        bytes[pos++] = BACnetEnums.BACNET_PROTOCOL_VERSION;

        //Control byte determines what fields exist in the rest of the NPDU record
        bytes[pos++] = this.AssembleControl();  //in the case, the response is 0x28

        //Destination Network Info
        //65535 - Broadcast
        bytes[pos++] = 0xff;  //DNET
        bytes[pos++] = 0xff;  //DNET

        //Destination 
        bytes[pos++] = 0x00;  //DLEN
                              //DADDR
        //none since len = 0 and this is being broadcasted back

        bytes[pos++] = 0x00;  //SNET
        bytes[pos++] = 0x00;  //SNET

        bytes[pos++] = 0x06;  //SLEN

        //address should be 10.1.0.xxx, where x is the deviceid
        bytes[pos++] = this.SADR[0];  //10
        bytes[pos++] = this.SADR[1];  //1
        bytes[pos++] = this.SADR[2];  //0
        bytes[pos++] = this.SADR[3];  //varies based on the ID of the device - pulled from database
        bytes[pos++] = 0xBA;
        bytes[pos++] = 0xC0;

        //HopCount
        bytes[pos++] = 0xff;
4

2 に答える 2

0

問題が解決しました

他の誰かが同じ問題を抱えている場合は、UDP ソケットを確認してください。私のコードでは、送信ソケットと受信ソケットを作成し、そのうちの 1 つを非排他に設定しました。残念ながら、そうすると、送信ソケットは受信ポートに着信するパケットをブロックしますが、UDP ブロードキャストは通過できるため、一部の時間は機能しているように見えます。

于 2016-01-12T20:51:57.637 に答える