背景: 仮想デバイスを背後に持つ仮想 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;