2016-01-12 4 views
1

Некоторый фон: Я пытаюсь создать виртуальный 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; 

ответ

0

Проблема решаемая

В случае, если кто-то имеет такую ​​же проблему, проверьте UDP сокетов. В моем коде я создал сокет отправки и приемный сокет и установил один из них в неэксклюзивный. К сожалению, при этом отправляющий сокет блокирует любые входящие пакеты на порте приема, однако он будет пропускать широковещательные передачи UDP, чтобы они работали часть времени.

Смежные вопросы