BACnet 虚拟设备 - 从不响应直接命令
BACnet Virtual Devices - never respond to a direct command
一些背景:
我正在尝试创建一个虚拟 BACnet 路由器,其背后有虚拟设备 (see related post)。我的测试环境由我服务器上的一个 VM ( 10.2.0.15 ) 运行 组成,上面有一个 BACnet explorer 和 Wireshark 运行。我在 VS2013 中编写代码,也在我的本地计算机 ( 192.168.56.1 ) 上 运行 wireshark 中编写代码。
当我启动虚拟路由器并从虚拟机发送 who-is 广播时,我在虚拟机的 wireshark 运行 上看到了命令和响应。在我的本地机器上,我只看到 wireshark 中的命令,但看不到响应。
一切正常。但是,i-am 响应的源地址(根据 VM 上的 wireshark 以及 BACnet 资源管理器详细信息)是 VM 和我的机器之间的网关 (10.2.0.2)。
问题
随后针对特定虚拟设备的 who-is 命令永远不会到达我的本地计算机。我可以看到在虚拟机上使用 wireshark 创建的命令,但我的代码从未看到请求,本地机器上的 wireshark 也看不到新数据包。
问题
初始 i-am 响应的源地址应该是我本地机器的 IP 还是我分配给虚拟设备的 IP 地址?如上所述,源地址目前是虚拟机和我机器之间的网关。
这是我用来构建对 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;
问题已解决
如果其他人遇到同样的问题,请检查您的 UDP 套接字。在我的代码中,我创建了一个发送套接字和一个接收套接字,并将其中之一设置为 non-exclusive。不幸的是,在这样做时,发送套接字将阻止任何进入接收端口的数据包——但是,它将允许 UDP 广播通过,因此它似乎在部分时间工作。
一个值得发表的相关评论——针对虚拟设备;您可能需要指定 DNET # 和 DADR - 目标网络号和目标 (V-MAC) 地址。并且一些设备可能对 having/receiving DADR/MAC 地址作为 right/specific 长度(字节数,例如对 left-hand/leading padding-zero 字节的数量很挑剔)。
一些背景: 我正在尝试创建一个虚拟 BACnet 路由器,其背后有虚拟设备 (see related post)。我的测试环境由我服务器上的一个 VM ( 10.2.0.15 ) 运行 组成,上面有一个 BACnet explorer 和 Wireshark 运行。我在 VS2013 中编写代码,也在我的本地计算机 ( 192.168.56.1 ) 上 运行 wireshark 中编写代码。
当我启动虚拟路由器并从虚拟机发送 who-is 广播时,我在虚拟机的 wireshark 运行 上看到了命令和响应。在我的本地机器上,我只看到 wireshark 中的命令,但看不到响应。
一切正常。但是,i-am 响应的源地址(根据 VM 上的 wireshark 以及 BACnet 资源管理器详细信息)是 VM 和我的机器之间的网关 (10.2.0.2)。
问题 随后针对特定虚拟设备的 who-is 命令永远不会到达我的本地计算机。我可以看到在虚拟机上使用 wireshark 创建的命令,但我的代码从未看到请求,本地机器上的 wireshark 也看不到新数据包。
问题 初始 i-am 响应的源地址应该是我本地机器的 IP 还是我分配给虚拟设备的 IP 地址?如上所述,源地址目前是虚拟机和我机器之间的网关。
这是我用来构建对 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;
问题已解决
如果其他人遇到同样的问题,请检查您的 UDP 套接字。在我的代码中,我创建了一个发送套接字和一个接收套接字,并将其中之一设置为 non-exclusive。不幸的是,在这样做时,发送套接字将阻止任何进入接收端口的数据包——但是,它将允许 UDP 广播通过,因此它似乎在部分时间工作。
一个值得发表的相关评论——针对虚拟设备;您可能需要指定 DNET # 和 DADR - 目标网络号和目标 (V-MAC) 地址。并且一些设备可能对 having/receiving DADR/MAC 地址作为 right/specific 长度(字节数,例如对 left-hand/leading padding-zero 字节的数量很挑剔)。