ArrayIndexOutOfBoundsException in CommandPriorityTest
-
Hi everyone,
i could run almost all examples, but i really need run this one 'CommandPriorityTest.java', i want to set the present value of my object.So i try to run, and gives me this error:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:343) at com.bacnet.webservice.CommandPriorityTest.main(CommandPriorityTest.java:46)
Here's my code:
/* Copyright (C) 2006-2009 Serotonin Software Technologies Inc. @author Matthew Lohbihler */ package com.bacnet.webservice; import com.serotonin.bacnet4j.LocalDevice; import com.serotonin.bacnet4j.RemoteDevice; import com.serotonin.bacnet4j.RemoteObject; import com.serotonin.bacnet4j.service.acknowledgement.ReadPropertyAck; import com.serotonin.bacnet4j.service.confirmed.ReadPropertyRequest; import com.serotonin.bacnet4j.service.confirmed.WritePropertyRequest; import com.serotonin.bacnet4j.service.unconfirmed.WhoHasRequest; import com.serotonin.bacnet4j.service.unconfirmed.WhoIsRequest; import com.serotonin.bacnet4j.type.Encodable; import com.serotonin.bacnet4j.type.enumerated.PropertyIdentifier; import com.serotonin.bacnet4j.type.primitive.CharacterString; import com.serotonin.bacnet4j.type.primitive.Null; import com.serotonin.bacnet4j.type.primitive.Real; import com.serotonin.bacnet4j.type.primitive.UnsignedInteger; /** * @author Matthew Lohbihler */ public class CommandPriorityTest { private static LocalDevice localDevice; private static RemoteDevice remoteDevice; private static RemoteObject remoteObject; public static void main(String[] args) throws Exception { String objectName = "Command Priority Test"; localDevice = new LocalDevice(101, "255.255.255.255"); // the only thing i change is the device id localDevice.initialize(); // Who is localDevice.sendBroadcast(2068, null, new WhoIsRequest()); Thread.sleep(1000); // Who has localDevice.sendBroadcast(2068, null, new WhoHasRequest(null, new CharacterString(objectName))); // Wait a bit for responses to come in. Thread.sleep(1000); // Find the device remoteDevice = localDevice.getRemoteDevices().get(0); // localDevice.getExtendedDeviceInformation(remoteDevice); // List<ObjectIdentifier> oids = ((SequenceOf<ObjectIdentifier>)localDevice.sendReadPropertyAllowNull( // remoteDevice, remoteDevice.getObjectIdentifier(), PropertyIdentifier.objectList)).getValues(); // for () // remoteDevice.setObject(new RemoteObject()) // Find the object. for (RemoteObject o : remoteDevice.getObjects()) { if (o.getObjectName().equals(objectName)) { remoteObject = o; break; } } getPresentValue(); getPriorityArray(); setPresentValue(new Real(16), 16); getPresentValue(); getPriorityArray(); setPresentValue(new Real(15), 15); getPresentValue(); getPriorityArray(); setPresentValue(new Null(), 16); getPresentValue(); getPriorityArray(); setPresentValue(new Real(16), 16); getPresentValue(); getPriorityArray(); setPresentValue(new Real(10), 10); getPresentValue(); getPriorityArray(); setPresentValue(new Null(), 10); getPresentValue(); getPriorityArray(); setPresentValue(new Null(), 15); getPresentValue(); getPriorityArray(); setPresentValue(new Null(), 16); getPresentValue(); getPriorityArray(); localDevice.terminate(); } private static void getPresentValue() throws Exception { ReadPropertyRequest rpr = new ReadPropertyRequest(remoteObject.getObjectIdentifier(), PropertyIdentifier.presentValue); ReadPropertyAck ack = (ReadPropertyAck)localDevice.send(remoteDevice, rpr); System.out.println("Present value: "+ ack.getValue()); } private static void getPriorityArray() throws Exception { ReadPropertyRequest rpr = new ReadPropertyRequest(remoteObject.getObjectIdentifier(), PropertyIdentifier.priorityArray); ReadPropertyAck ack = (ReadPropertyAck)localDevice.send(remoteDevice, rpr); System.out.println("Priority array: "+ ack.getValue()); } private static void setPresentValue(Encodable value, int priority) throws Exception { WritePropertyRequest wpr = new WritePropertyRequest(remoteObject.getObjectIdentifier(), PropertyIdentifier.presentValue, null, value, new UnsignedInteger(priority)); localDevice.send(remoteDevice, wpr); } }
Any idea ?
Best regards,
Valter Henrique. -
This test class works under the expectation that the device you want to communicate with will respond to a WhoIs request (or at least be the first to respond) within one second. Below, at lines 36 and 40 WhoIs and WhoHas requests are sent respectively. Responses to these cause the responder to be automatically registered in the list of known remote devices. If nothing has responded, you will the the error that you have gotten.
If you want a cleaner message, you can check if the list in question is empty, print out a messages like "no devices responded", and return.
-
@mlohbihler, i have a supervisory that is composed by a FX 20 and a FX 06 both from Johnson Controls, i connected my FX 20 in my router, so i can connect with it acessing 192.168.1.149 inside my LAN.
So i wonder how i can change the value from my device ?
I can read those values, but i don't know how to change them.If you can help me, i appreciate.
I could run some example and paste it here to help us.
Best regards,
Valter Henrique. -
@mlohbihler, i follow your suggestion and happens what you say, no remote devices responds.
I think in my case is just local devices .
Well, this is my code if could help anyone:/* Copyright (C) 2006-2009 Serotonin Software Technologies Inc. @author Matthew Lohbihler */ package com.bacnet.ready; import com.serotonin.bacnet4j.LocalDevice; import com.serotonin.bacnet4j.RemoteDevice; import com.serotonin.bacnet4j.RemoteObject; import com.serotonin.bacnet4j.service.acknowledgement.ReadPropertyAck; import com.serotonin.bacnet4j.service.confirmed.ReadPropertyRequest; import com.serotonin.bacnet4j.service.confirmed.WritePropertyRequest; import com.serotonin.bacnet4j.service.unconfirmed.WhoHasRequest; import com.serotonin.bacnet4j.service.unconfirmed.WhoIsRequest; import com.serotonin.bacnet4j.type.Encodable; import com.serotonin.bacnet4j.type.enumerated.PropertyIdentifier; import com.serotonin.bacnet4j.type.primitive.CharacterString; import com.serotonin.bacnet4j.type.primitive.Null; import com.serotonin.bacnet4j.type.primitive.Real; import com.serotonin.bacnet4j.type.primitive.UnsignedInteger; /** * @author Matthew Lohbihler */ public class CommandPriorityTest { private static LocalDevice localDevice; private static RemoteDevice remoteDevice; private static RemoteObject remoteObject; public static void main(String[] args) throws Exception { String objectName = "Command Priority Test"; localDevice = new LocalDevice(101, "192.168.1.255"); localDevice.initialize(); // Who is localDevice.sendBroadcast(47808, null, new WhoIsRequest()); Thread.sleep(1000); // Who has localDevice.sendBroadcast(47808, null, new WhoHasRequest(null, new CharacterString(objectName))); // Wait a bit for responses to come in. Thread.sleep(1000); // Find the device if (localDevice.getRemoteDevices().isEmpty()) { System.out.println("No devices responded"); } else { remoteDevice = localDevice.getRemoteDevices().get(0); // localDevice.getExtendedDeviceInformation(remoteDevice); // List<ObjectIdentifier> oids = ((SequenceOf<ObjectIdentifier>)localDevice.sendReadPropertyAllowNull( // remoteDevice, remoteDevice.getObjectIdentifier(), PropertyIdentifier.objectList)).getValues(); // for () // remoteDevice.setObject(new RemoteObject()) // Find the object. for (RemoteObject o : remoteDevice.getObjects()) { if (o.getObjectName().equals(objectName)) { remoteObject = o; break; } } getPresentValue(); getPriorityArray(); setPresentValue(new Real(16), 16); getPresentValue(); getPriorityArray(); setPresentValue(new Real(15), 15); getPresentValue(); getPriorityArray(); setPresentValue(new Null(), 16); getPresentValue(); getPriorityArray(); setPresentValue(new Real(16), 16); getPresentValue(); getPriorityArray(); setPresentValue(new Real(10), 10); getPresentValue(); getPriorityArray(); setPresentValue(new Null(), 10); getPresentValue(); getPriorityArray(); setPresentValue(new Null(), 15); getPresentValue(); getPriorityArray(); setPresentValue(new Null(), 16); getPresentValue(); getPriorityArray(); } localDevice.terminate(); } private static void getPresentValue() throws Exception { ReadPropertyRequest rpr = new ReadPropertyRequest(remoteObject.getObjectIdentifier(), PropertyIdentifier.presentValue); ReadPropertyAck ack = (ReadPropertyAck) localDevice.send(remoteDevice, rpr); System.out.println("Present value: " + ack.getValue()); } private static void getPriorityArray() throws Exception { ReadPropertyRequest rpr = new ReadPropertyRequest(remoteObject.getObjectIdentifier(), PropertyIdentifier.priorityArray); ReadPropertyAck ack = (ReadPropertyAck) localDevice.send(remoteDevice, rpr); System.out.println("Priority array: " + ack.getValue()); } private static void setPresentValue(Encodable value, int priority) throws Exception { WritePropertyRequest wpr = new WritePropertyRequest(remoteObject.getObjectIdentifier(), PropertyIdentifier.presentValue, null, value, new UnsignedInteger(priority)); localDevice.send(remoteDevice, wpr); } }