读取 BACNET IP 路由器上设备的属性

问题描述

我在从 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 服务/外部设备注册注册外部设备时,实际上发现了路由器后面的设备。

解决方法

从 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 上发送/接收了什么?

,

我猜,一旦您激活路由器,设备可能必须通过路由器的 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' 值(- 覆盖/替换了“无”的路由源的默认设置值):


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

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

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

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

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

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

“DLEN = 最终目的 MAC 层地址的 1 个八位字节长度”

“DNET = 2 个八位字节的最终目标网络号”

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...