I'm trying to connect to a BACNet device. The code I wrote for this looks somewhat like:

public static void main(String[] args) throws ServiceException {

        Integer deviceId = 1234;
        String port = 0xBAC0, localBindAddress = "192.168.0.145";

        IpNetworkBuilder builder = new IpNetworkBuilder();
        builder.port(Integer.decode(port));
        builder.localBindAddress(localBindAddress);

        IpNetwork network = builder.build();
        LocalDevice localDevice = new LocalDevice(deviceId, new DefaultTransport(network));
        try {
            localDevice.initialize();
        } catch (Exception e) {
            throw new ServiceException("Unable to initialize localDevice", e);
        }

        localDevice.getEventHandler().addListener(new DeviceEventAdapter() {
            @Override
            public void iAmReceived(RemoteDevice remoteDevice) {
                logger.debug("iAm Received from device: {}, NetworkNumber: {}",
                        remoteDevice.getInstanceNumber(),
                        remoteDevice.getAddress().getNetworkNumber()
                );

                Runnable task = () -> {
                    try {
                        DiscoveryUtils.getExtendedDeviceInformation(localDevice, remoteDevice);
                        SequenceOf<ObjectIdentifier> oids = RequestUtils.getObjectList(localDevice, remoteDevice);

                        for (ObjectIdentifier oid : oids) {
                            String name = ((CharacterString) RequestUtils.getProperty(localDevice, remoteDevice, oid,
                                    PropertyIdentifier.objectName)).getValue();
                            logger.info("Found object oid={}, name={} in device {}",
                                    oid,
                                    name,
                                    remoteDevice.getInstanceNumber()
                            );
                        }

                        while(true) {
                            for (ObjectIdentifier oid : oids) {
                                Encodable value = RequestUtils.getProperty(
                                        localDevice,
                                        remoteDevice,
                                        oid,
                                        PropertyIdentifier.presentValue
                                );
                                logger.info("{}={}", oid, value);
                            }
                            try {
                                Thread.sleep(5_000L);
                            } catch (InterruptedException e) {
                            }
                        }
                    } catch (BACnetException e) {
                        logger.error("Error getting values from remoteDevice", e);
                    }
                };
                new Thread(task).start();
            }
        });

        localDevice.sendGlobalBroadcast(new WhoIsRequest());
    }

The logging shows the following devices:
iAm Received from device: 400, NetworkNumber: 0
iAm Received from device: 401, NetworkNumber: 17436
iAm Received from device: 402, NetworkNumber: 17436
iAm Received from device: 404, NetworkNumber: 17436
iAm Received from device: 500, NetworkNumber: 17436
iAm Received from device: 501, NetworkNumber: 17436
iAm Received from device: 502, NetworkNumber: 17436
iAm Received from device: 0, NetworkNumber: 0
iAm Received from device: 141, NetworkNumber: 0
iAm Received from device: 200, NetworkNumber: 0
iAm Received from device: 201, NetworkNumber: 16924
iAm Received from device: 202, NetworkNumber: 16924

When connection with an explorer I see that the 17436 network is behind the 400 device and the 16924 network behind the 200 device.

I get the following errors when running this code.

  • com.serotonin.bacnet4j.exception.BACnetTimeoutException: Unable to find router to network 17436
  • java.lang.RuntimeException: Invalid arguments: router address not provided for remote recipient Address [networkNumber=17436, macAddress=[1c,44,91,1,0,0]]

I bind the localDevice to to the BAC0 port on a specific ip adress on the machine this code is running on. The machine has 2 interfaces and the default gateway points to a machine on the other interface.

I tried using port BAC1, however if I do that, I don't see the IAmReceived messages anymore. So the polling task will not start.

Has anyone an idea what I'm doing wrong and how I can connect to that (foreign?) device?