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

2 ответа

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам