Откройте устройство 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(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 в той же сети. Но он не может найти устройство, расположенное в другой сети. Что-то здесь не так?


person krishna    schedule 26.06.2018    source источник


Ответы (2)


Это на самом деле по замыслу. Процесс обнаружения происходит с использованием широковещательных сообщений Who-Is, которые не маршрутизируются через IP-маршрутизаторы. Таким образом никакие устройства в другой IP-подсети не обнаруживаются. Если вы знаете IP-адрес удаленного устройства, вы можете настроить/запрограммировать IP-адрес напрямую как статический IP-адрес.

Однако есть нечто, называемое BBMD (устройство управления широковещательной передачей BACnet). Один из них должен быть размещен в каждой подсети, каждый из которых настроен с IP-адресом другого BBMD. Устройства BBMD будут перехватывать широковещательные сообщения, связанные с BACnet, в своей подсети, пересылать их на одноранговый узел BBMD в другой подсети, который повторно передает широковещательные сообщения, эффективно соединяя две (или более) подсети.

ИЛИ вы можете настроить/запрограммировать свой клиент как «Внешнее устройство», зарегистрировать его с помощью BBMD в дальней подсети, что приведет к тому же самому.

BBMD довольно распространены. Большинство (все) BACnet/IP-маршрутизаторы BACnet MS/TP имеют эту функциональность. Многие устройства BACnet также позволяют включать эту функцию.

Надеюсь это поможет. Дополнительную информацию см. на http://www.bacnetwiki.com.

person Edward    schedule 26.06.2018

Широковещательные передачи UDP/IP, которые используются как часть службы Who-Is (BACnet), обычно не маршрутизируются по умолчанию и в большинстве случаев не могут быть маршрутизированы — например, соображения безопасности были основной причиной.

Но если маршрутизация включена, вы можете отправлять одноадресный/направленный трафик на рассматриваемое устройство.

(Если я правильно помню, теоретически теперь вы должны иметь возможность отправлять Who-Is как одноадресный / направленный запрос, но даже если я прав, говоря это, весьма вероятно, что большинство устройств будут только прослушивать Услуги Who-Is только через широковещательную рассылку.)

BBMD не являются строго необходимыми и считаются проблемой безопасности, поскольку они могут выдать слишком много информации.

Можно использовать (эффективно) стандартную сетевую маршрутизацию вместо BBMD, когда трафик проходит через несколько разных/целевых VLAN.

(Также имейте в виду, что при совместном использовании частного IP-адреса (v4) по вашему выбору и общедоступного IP-адреса (v4) между клиентом и сервером/обслуживающим устройством могут возникнуть проблемы.)

person DennisVM-D2i    schedule 09.05.2021