0

我正在使用 bacnet4j 库来发现远程 BACnet 设备。在同一个网络中,一切都按预期工作。但我找不到位于不同网络中的 BACnet 控制器设备。

String hostAddress="10.8.102.28";
IpNetwork network = new IpNetworkBuilder().withPort(47808).withSubnet(hostAddress, 24).build();
Transport transport = new DefaultTransport(network);
LocalDevice localDevice = new LocalDevice(Integer.decode(this.settings.getDeviceId()), transport);
localDevice.initialize();

//Finding remote device
int remoteId=1234;
RemoteDeviceFuture remoteFuture = RemoteDeviceFinder.findDevice(localDevice, remoteId);
RemoteDevice remoteDevice = null;
try {
        remoteDevice = remoteFuture.get(); //remote device is null here
    } catch (Exception e) {
        LOGGER.error("Remote device with id " + remoteId + " does NOT exist!");
    }

上面的代码片段在同一网络中查找具有给定 remoteId 的远程设备。但它找不到位于不同网络中的设备。这里有什么问题吗?

4

2 回答 2

1

这实际上是设计使然。发现过程使用不通过 IP 路由器路由的广播“Who-Is”消息进行。因此,不会以这种方式发现不同 IP 子网上的任何设备。如果您知道远程设备的 IP 地址,则可以直接将 IP 配置/编程为静态 IP 地址。

但是,有一种叫做 BBMD(BACnet 广播管理设备)的东西。其中一个需要放置在每个子网中,每个子网都配置有另一个 BBMD 的 IP 地址。BBMD 将拦截其子网上的 BACnet 相关广播,将其发送到另一个子网上的对等 BBMD,后者将重新传输广播,有效地桥接两个(或更多)子网。

或者,您可以将您的客户端配置/编程为“外国设备”,让它在远端子网上注册一个 BBMD,这将实现大致相同的效果。

BBMD 相当普遍。大多数(所有)BACnet/IP 到 BACnet MS/TP 路由器都具有该功能。许多 BACnet 设备也允许启用该功能。

希望这可以帮助。有关更多信息,请参见http://www.bacnetwiki.com

于 2018-06-26T16:21:07.777 回答
0

UDP/IP 广播 - 用作“Who-Is” (BACnet) 服务的一部分,默认情况下通常不路由,并且在大多数情况下不允许路由 - 例如,安全问题是主要原因。

但如果路由到位,您可以将单播/定向流量发送到相关设备。

(如果我没记错的话,理论上你现在应该能够将 Who-Is 作为单播/定向请求发送 - 但即使我说得对,大多数设备很可能只会监听仅通过广播提供 Who-Is 服务。)

BBMD 并不是绝对必要的——并且被认为是安全问题,因为它们可以提供太多信息。

可以(有效地)使用沼泽标准网络路由而不是 BBMD - 让流量跨越几个不同/目标 VLAN。

(还要注意在客户端和服务器/服务设备之间混合使用私有 IP(v4)地址 - 您选择的和公共 IP(v4)地址,您可能会遇到问题。)

于 2021-05-09T15:14:22.593 回答