Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用bacnet4j发现不同网络中的BACnet设备_Java_Controller_Bacnet_Bacnet4j - Fatal编程技术网

Java 使用bacnet4j发现不同网络中的BACnet设备

Java 使用bacnet4j发现不同网络中的BACnet设备,java,controller,bacnet,bacnet4j,Java,Controller,Bacnet,Bacnet4j,我正在使用bacnet4j库来发现远程BACnet设备。在同一个网络中,一切都按预期工作。但是我找不到位于不同网络中的BACnet控制器设备 String hostAddress="10.8.102.28"; IpNetwork network = new IpNetworkBuilder().withPort(47808).withSubnet(hostAddress, 24).build(); Transport transport = new DefaultTransport(networ

我正在使用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的远程设备。但它无法找到位于不同网络中的设备。这里有什么不对劲吗?

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

然而,有一种称为BBMD(BACnet广播管理设备)的设备。其中一个需要放置在每个子网上,每个子网上都配置了另一个BBMD的IP地址。BBMD将截获其子网上与BACnet相关的广播,将其发送到另一个子网上的对等BBMD,后者将重新传输广播,从而有效地桥接两个(或更多)子网

或者,您可以将您的客户端配置为“外部设备”,并将其注册到远端子网上的BBMD,这将实现大致相同的效果

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


希望这有帮助。有关更多信息,请参阅。

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

但是,如果路由已就位,您可以向相关设备发送单播/定向流量

(如果我没记错的话,理论上你现在应该能够以单播/定向请求的形式发送Who Is,但即使我说的没错,大多数设备很可能只通过广播收听Who Is服务。)

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

可以(有效地)使用bog标准网络路由,而不是BBMD——让流量跨越几个不同的/目标VLAN

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