我正在使用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的远程设备。但是它找不到位于不同网络中的设备。这里有什么问题吗?
答案 0 :(得分: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。
答案 1 :(得分:0)
UDP/IP 广播 - 作为“Who-Is”(BACnet)服务的一部分使用,通常默认情况下不会路由,并且在大多数情况下不允许路由 - 例如安全问题是主要原因。
但如果路由到位,您可以向相关设备发送单播/定向流量。
(如果我没记错的话,理论上您现在应该能够将 Who-Is 作为单播/定向请求发送 - 但即使我说的是对的,很可能大多数设备只会仅通过广播收听 Who-Is 服务。)
BBMD 并不是绝对必要的 - 并且被视为安全问题,因为它们可以提供太多信息。
可以使用(有效的)bog 标准网络路由而不是 BBMD - 让流量跨越几个不同的/目标 VLAN。
(还要注意在客户端和服务器/服务设备之间混合使用私有 IP(v4)地址 - 您选择的,和公共 IP(v4)地址,您可能会遇到问题。)< /p>