Closed yasar456 closed 11 months ago
Code which you provide is bacnet4j itself. Which request does fail for you? Depending on device kind (and supported options) you can use read property multiple request and pack unit, value and status flags in single readout reducing network load.
Thanks for your prompt response.
I already tried to read only Present value and set instance for 1 only, but still got the same error. When trying to get data by connecting with YABE tool , it works fine.
I am not able to figure out the issue. I also tried to set transport.setTimeOut to 60 seconds but no help. Can you suggest what other things that I should look for. Stack Trace is as
com.serotonin.bacnet4j.exception.BACnetTimeoutException
at com.serotonin.bacnet4j.transport.ServiceFutureImpl.result(ServiceFutureImpl.java:75)
at com.serotonin.bacnet4j.transport.ServiceFutureImpl.get(ServiceFutureImpl.java:64)
at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:175)
at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:151)
at com.ll.handlers.BacnetHandler.startPolling(BacnetHandler.java:141)
at com.ll.handlers.BacnetHandler.start(BacnetHandler.java:75)
at com.ll.handlers.BacnetHandler.run(BacnetHandler.java:69)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.DefaultTransport.lambda$expire$1(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.UnackedMessageContext.useConsumer(UnackedMessageContext.java:162) at com.serotonin.bacnet4j.transport.DefaultTransport.expire(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:525) ... 1 more com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.ServiceFutureImpl.result(ServiceFutureImpl.java:75) at com.serotonin.bacnet4j.transport.ServiceFutureImpl.get(ServiceFutureImpl.java:64) at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:175) at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:151) at com.ll.handlers.BacnetHandler.startPolling(BacnetHandler.java:141) at com.ll.handlers.BacnetHandler.start(BacnetHandler.java:75) at com.ll.handlers.BacnetHandler.run(BacnetHandler.java:69) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.DefaultTransport.lambda$expire$1(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.UnackedMessageContext.useConsumer(UnackedMessageContext.java:162) at com.serotonin.bacnet4j.transport.DefaultTransport.expire(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:525) ... 1 more com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.ServiceFutureImpl.result(ServiceFutureImpl.java:75) at com.serotonin.bacnet4j.transport.ServiceFutureImpl.get(ServiceFutureImpl.java:64) at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:175) at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:151) at com.ll.handlers.BacnetHandler.startPolling(BacnetHandler.java:141) at com.ll.handlers.BacnetHandler.start(BacnetHandler.java:75) at com.ll.handlers.BacnetHandler.run(BacnetHandler.java:69) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.DefaultTransport.lambda$expire$1(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.UnackedMessageContext.useConsumer(UnackedMessageContext.java:162) at com.serotonin.bacnet4j.transport.DefaultTransport.expire(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:525) ... 1 more com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.ServiceFutureImpl.result(ServiceFutureImpl.java:75) at com.serotonin.bacnet4j.transport.ServiceFutureImpl.get(ServiceFutureImpl.java:64) at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:175) at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:151) at com.ll.handlers.BacnetHandler.startPolling(BacnetHandler.java:141) at com.ll.handlers.BacnetHandler.start(BacnetHandler.java:75) at com.ll.handlers.BacnetHandler.run(BacnetHandler.java:69) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.DefaultTransport.lambda$expire$1(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.UnackedMessageContext.useConsumer(UnackedMessageContext.java:162) at com.serotonin.bacnet4j.transport.DefaultTransport.expire(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:525) ... 1 more com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.ServiceFutureImpl.result(ServiceFutureImpl.java:75) at com.serotonin.bacnet4j.transport.ServiceFutureImpl.get(ServiceFutureImpl.java:64) at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:175) at com.serotonin.bacnet4j.util.RequestUtils.sendReadPropertyAllowNull(RequestUtils.java:151) at com.ll.handlers.BacnetHandler.startPolling(BacnetHandler.java:141) at com.ll.handlers.BacnetHandler.start(BacnetHandler.java:75) at com.ll.handlers.BacnetHandler.run(BacnetHandler.java:69) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: com.serotonin.bacnet4j.exception.BACnetTimeoutException at com.serotonin.bacnet4j.transport.DefaultTransport.lambda$expire$1(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.UnackedMessageContext.useConsumer(UnackedMessageContext.java:162) at com.serotonin.bacnet4j.transport.DefaultTransport.expire(DefaultTransport.java:957) at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:525) ... 1 more
Eearlier versions of bacnet4j had difficulties with coordination of calls happening from thread which did network related operations. Wrapper library you reported issue for dispatches own requests to separate thread to detach from notification thread used by bacnet4j. I am not sure if that's still a case, but if you experience failure with first call you make it could be a case. Timeout errors you get are related with lack of answer from device, so network level timeout adjustment won't help. Are you sure you use proper device/network/object identifier? BTW you can check with wireshark if device answers for your call, but bacnet4j misses it for some reason.
I am using following code for devices/network/object identifier
try { logger.info("Started Polling"); IpNetworkBuilder builder = new IpNetworkBuilder();
// int port = 47808; // String localBindAddress = "0.0.0.0"; // String broadcastAddress = "192.168.20.195"; // String subnetMask = "192.168.20.0"; // int localNetworkNumber = 0; // boolean reuseAddress = true;
int port = Config.bacnetPort;
String localBindAddress = Config.localBindAddress;
String broadcastAddress = Config.broadcastAddress;
String subnetMask = Config.subnetMask;
int localNetworkNumber = Config.localNetworkNumber;
boolean reuseAddress = Config.isReuseAddress;
IpNetwork ipNetwork = builder.withPort(port).withLocalBindAddress(localBindAddress)
.withSubnet(subnetMask, 24).withLocalNetworkNumber(localNetworkNumber)
.withReuseAddress(reuseAddress).build();
Transport transport = new DefaultTransport(ipNetwork);
LocalDevice localDevice = new LocalDevice(123, transport);
localDevice.getEventHandler().addListener(new DeviceEventAdapter());
localDevice.initialize();
Thread.sleep(20000);
RemoteDeviceDiscoverer devices = localDevice.startRemoteDeviceDiscovery();
Thread.sleep(20000);
List<RemoteDevice> remoteDevices = devices.getRemoteDevices();
logger.info("Number of devices Found {}" ,remoteDevices.size());
Its working fine till this point, but unable to read properties from the object. Though using YABE tool , it works fine
Can you try below code? It uses wrapper code made in this repository, so it wraps in a way bacnet4j logic for you. You will need to declare dependency on org.code-house.bacnet4j:ip:1.3.0-alpha3
module.
public static void main(String[] args) {
BacNetClient client = new BacNetIpClient("<bind ip>", "<broadcast ip>", 1339);
client.start();
Set<Device> devices = client.discoverDevices(2000);
for (Device device : devices) {
if (device.getInstanceNumber() != 178041) {
continue;
}
List<BacNetObject> objects = client.getDeviceObjects(device);
for (BacNetObject object : objects) {
List<String> propertyNames = client.getObjectPropertyNames(object);
for (String property : propertyNames) {
System.out.println(
object + "." + property + "=" + client.getObjectPropertyValue(object, property, new BypassBacnetConverter())
);
}
}
}
client.stop();
}
This should enumerate all objects of a device with all attributes on each object. It might take a while, but this way you will be able to confirm if issue comes from your code or bacnet4j itself.
@yasar456 can you please confirm if issue was solved somewhat different or still remains? Please close issue if it does not bother you any more.
HI, Issue has been resolved. It occurred as I was using YABE tool and my application simultaneously. When I closed YABE, all details were fetched.
I am using the following code and able to successfully get remote devices on network. Getting error as
com.serotonin.bacnet4j.transport.DefaultTransport] [Thread: BACnet4J transport for device 123] Message: Timeout on key Key(address=Address [networkNumber=0, macAddress=[c0,a8,4,29,ba,c0]], linkService=null, invokeId=82, fromServer=true)