Некоторый фон: Я пытаюсь создать виртуальный BACnet маршрутизатор с виртуальными устройствами за ним (see related post). Моя тестовая среда состоит из виртуальной машины (10.2.0.15), запущенной на моем сервере, с помощью проводника BACnet и Wireshark. Я пишу код в VS2013, а также запускает wirehark на моей локальной машине (192.168.56.1).BACnet Virtual Devices - никогда не отвечать на прямые команды
Когда я запускаю виртуальный роутер и посылаю, кто-то передается от виртуальной машины, я вижу команду и ответы на проводе, работающем на vm. На моей локальной машине я вижу только команду в wirehark, но не ответы.
Все это прекрасно работает. Однако исходный адрес ответов i-am (в соответствии с wirehark на виртуальной машине, а также в деталях проводника BACnet) - это адрес шлюза (10.2.0.2) между VM и моей машиной.
Проблема Последующие команды who-oriented, предназначенные для определенного виртуального устройства, никогда не попадают на мою локальную машину. Я могу видеть, что команда создается с помощью wirehark на vm, но мой код никогда не видит запроса, и ни один проводник на моей локальной машине не видит новый пакет.
Вопрос Если адрес источника начальных ответов я-ат в IP моего локального компьютера или IP-адрес, который я назначенный виртуальное устройство? Как указано выше, адрес источника в настоящее время относится к шлюзу между VM и моей машиной.
Вот код, который я использую, чтобы построить часть ответа NPDU команде who-is. Надеюсь, кто-то может указать, что я делаю неправильно.
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;