【问题标题】:BACnet Virtual Devices - never respond to a direct commandBACnet 虚拟设备 - 从不响应直接命令
【发布时间】:2016-01-12 14:33:18
【问题描述】:

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

当我启动虚拟路由器并从 VM 发送 who-is 广播时,我在 vm 上运行的 wireshark 上看到命令和响应。在我的本地机器上,我只看到了 wireshark 中的命令,但没有看到响应。

所有这些都可以正常工作。但是,i-am 响应的源地址(根据 VM 上的 wireshark 以及 BACnet explorer 的详细信息)是 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;

【问题讨论】:

    标签: c# bacnet


    【解决方案1】:

    问题已解决

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

    【讨论】:

      【解决方案2】:

      值得一提的相关评论 - 对于虚拟设备;您可能需要指定 DNET # & DADR - 目标网络号和目标 (V-MAC) 地址。并且一些设备可能对拥有/接收 DADR/MAC 地址作为正确/特定长度(字节数,例如,对左侧/前导填充零字节的数量很挑剔)很挑剔。

      【讨论】:

        猜你喜欢
        • 2014-12-18
        • 2019-07-27
        • 2016-11-24
        • 1970-01-01
        • 2021-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多