【问题标题】:Read Properties of devices on a BACNET IP router读取 BACNET IP 路由器上设备的属性
【发布时间】:2021-06-30 06:18:49
【问题描述】:

我在从 BACNET IP 路由器上的设备读取属性时遇到问题。为此,我正在使用 .net 库 https://github.com/ela-compil/BACnet

如果我正在与多个设备交互,每个设备都有自己的 ip 和 id(没有路由器配置),通信正常并且我能够读取属性。但是一旦实现了路由器模式的设备并且所有其他设备都通过这个主路由器进行通信,我就无法再读取属性了。

Main Bacnet router IP 192.168.2.222
Device 1, Ip: 192.168.1.1, ID: 10
Device 2, Ip: 192.168.1.2, ID: 11
My software is on IP 192.168.2.220

要读取我正在使用的属性:

var targetObjId = new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, (uint)10);
var targetBacnetAddress = new BacnetAddress(BacnetAddressTypes.IP, "192.168.1.1");
var rez = await Bacnet_client.ReadPropertyAsync(targetBacnetAddress, targetObjId, BacnetPropertyIds.PROP_OBJECT_LIST);

这将返回:“来自设备的错误:ERROR_CLASS_SERVICES - ERROR_CODE_SERVICE_REQUEST_DENIED”。 如果网络上没有使用路由器,则此代码将起作用并产生结果。所以我在寻址 bacnet 设备时一定做错了什么?

使用 Yabe 浏览器,这一切都有效。因此设备配置设置正确。实际上,当我通过功能/IP 服务/外部设备注册注册外国设备时,会发现路由器后面的设备。

【问题讨论】:

  • 我不熟悉 .net BACnet 堆栈。当向路由器后面的设备发出读取属性请求时,该请求需要有一个“网络”号和一个“目标地址”(DADR)来寻址路由器后面的设备。

标签: c# .net bacnet


【解决方案1】:

从 IP 地址来看,您的设备似乎位于不同的 IP 地址上。这是首先要确认的。 (192.168.1.0 和 192.168.2.0通常是不同的子网,但这取决于您的网络掩码设置)。

因此,要“跨越”并发现其他子网上的设备,可以使用 BBMD 并注册它,就像您在 YABE 中提到的那样,BBMD 会将发现广播 (Who-Is) 分发到远子网。到目前为止,一切顺利。

您混淆了“BACnet 路由器”和 BBMD(BACnet 广播管理设备)的概念。在这种情况下,您应该(正在)使用 BBMD 功能,而不是 BACnet 路由器功能。

以上都没有解决您的直接问题。您似乎正在创建一条直接消息(使用已知 IP 地址,不需要发现,因此不需要使用 BBMD 注册外部设备),但您收到一条错误消息。这似乎是 .Net 实现中的一个问题。 Wireshark 说在端口 47808 上发送/接收了什么?

【讨论】:

    【解决方案2】:

    我猜,一旦您激活了路由器,设备可能必须通过路由器的 IP(v4) 地址(而不是设备的 IP 地址)路由到 - 但添加了适当的 DNET(目标网络#)值和 DADR(目标地址)值的组合来识别您的目标设备/例如试图从中读取属性。

    即IP 地址标识路由器/与(Modbus?)设备通信的设备,DNET 和 DADR 值的配对标识路由器将协助通信的设备(正如 Steven 评论的那样)。

    YABE 似乎令人困惑地将 DADR 值显示为 IP 地址(而不是 MAC 地址,即 EUI-48/MAC-48 格式);你必须修改 YABE 的源代码来解决这个问题;但如果你走那条路,最好将 I-Am 信息跟踪/输出到它的“日志”窗口 - 以便更容易查看/参考。

    例如在调用“NPDU.Decode()”之后 - 向“BacnetAddressTypes”添加了一个新的“IP_MAC”值(覆盖/替换“None”的路由源的默认设置值):

    
        if (source != null &&
            sender.Type == BacnetAddressTypes.IP)
        {
            source.type = BacnetAddressTypes.IP_MAC;
        }
    
    

    然后您可以将处理“case”语句添加到“BacnetAddress.ToString()”方法,以输出更合适的显示。

    当您说“通信正常并且我能够读取属性”时 - 我假设您的意思是当您直接插入设备的(MS-TP?)网络时;否则听起来你不需要路由器(/可能只处理 BACnet/IP 设备)。

    “RoutedSource”是挂在“BacnetAddress”上的成员/属性,其中包含 DNET 和 DADR 值(在“NPDU.Decode()”方法中设置)。

    以防万一您不知道,YABE 将(相关/父)路由器设备树节点下的所有路由到设备显示为路由器的子节点。

    “DADR = 最终目的 MAC 层地址”

    "DLEN = 最终目的 MAC 层地址的 1 字节长度"

    "DNET = 2-octet 最终目的网络号"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      相关资源
      最近更新 更多