BACnet虚拟设备 - 永远不会响应直接命令

时间:2016-01-12 14:33:18

标签: c# bacnet

一些背景知识 我正在尝试创建一个虚拟BACnet路由器,后面有虚拟设备(see related post)。我的测试环境包括在我的服务器上运行的VM(10.2.0.15),其中运行BACnet资源管理器和Wireshark。我在VS2013中编写代码,并在本地计算机上运行wireshark(192.168.56.1)。

当我启动虚拟路由器并从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;

2 个答案:

答案 0 :(得分:0)

解决了问题

如果其他人遇到同样的问题,请检查您的UDP套接字。在我的代码中,我创建了一个发送套接字和一个接收套接字,并将其中一个设置为非独占。不幸的是,在这样做时,发送套接字将阻止任何进入接收端口的数据包 - 但是,它会让UDP广播通过,以便它看起来在部分时间内工作。

答案 1 :(得分:0)

一个值得评论的相关评论-对于虚拟设备;您可能需要指定DNET#和DADR-目标网络号和目标(V-MAC)地址。而且有些设备可能对将DADR / MAC地址设置为正确的/特定的长度感到困惑。