• D
    davyv

    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?

    posted in BACnet4J general discussion read more