My Program subscribes for a analogue value, after this it waits 5 seconds(I receive the COVs in this 5 Seconds), after that I want to unsubscribe, but here I get the error "b ErrorAPDU(choice=5, errorClass=Object, errorCode=covSubscriptionFailed)" also If I try to subscribe for another value, I get this error.
What do I do wrong? I use the bacnet4j-3.2.4-API
public class Test1 {
static LocalDevice localDevice;
public static void main(String[] args) throws Exception {
IpNetwork network = new IpNetworkBuilder().build();
Transport transport = new DefaultTransport(network);
localDevice = new LocalDevice(44444, transport);
try {
localDevice.initialize();
localDevice.getEventHandler().addListener(new Listener());
localDevice.sendGlobalBroadcast(new WhoIsRequest());
Thread.sleep(2 * 1000);
RemoteDevice device = localDevice.getRemoteDevice(2222);
UnsignedInteger subscriberProcessIdentifier = new UnsignedInteger(0);
UnsignedInteger lifetime = new UnsignedInteger(0);
ObjectIdentifier oi = new ObjectIdentifier(ObjectType.analogValue,
0);
SubscribeCOVRequest request = new SubscribeCOVRequest(
subscriberProcessIdentifier, oi, new Boolean(true),
lifetime);
localDevice.send(device, request, new ResponseConsumer() {
@Override
public void success(AcknowledgementService arg0) {
System.out.println("a " + arg0);
}
@Override
public void fail(AckAPDU arg0) {
System.out.println("b " + arg0);
}
@Override
public void ex(BACnetException arg0) {
System.out.println("c " + arg0);
}
});
Thread.sleep(5000);
SubscribeCOVRequest request1 = new SubscribeCOVRequest(
subscriberProcessIdentifier, oi, null, null);
localDevice.send(device, request1, new ResponseConsumer() {
@Override
public void success(AcknowledgementService arg0) {
System.out.println("a " + arg0);
}
@Override
public void fail(AckAPDU arg0) {
System.out.println("b " + arg0);
}
@Override
public void ex(BACnetException arg0) {
System.out.println("c " + arg0);
}
});
try {
new BufferedReader(new InputStreamReader(System.in)).readLine();
} catch (IOException e) {
e.printStackTrace();
}
localDevice.terminate();
} catch (Exception ex) {
ex.printStackTrace();
}
}
static class Listener extends DeviceEventAdapter {
@Override
public void covNotificationReceived(
UnsignedInteger subscriberProcessIdentifier,
RemoteDevice initiatingDevice,
ObjectIdentifier monitoredObjectIdentifier,
UnsignedInteger timeRemaining,
SequenceOf<PropertyValue> listOfValues) {
for (int i = 0; i < listOfValues.getCount(); i++) {
if (!(listOfValues.getValues().get(i).getValue() instanceof StatusFlags)) {
System.out.println("COV_Result: Instance-ID:"
+ monitoredObjectIdentifier.getInstanceNumber()
+ " Value:"
+ listOfValues.getValues().get(i).getValue()
+ " Type: "
+ monitoredObjectIdentifier.getObjectType()
.intValue());
}
}
}
@Override
public void iAmReceived(RemoteDevice d) {
System.out.println("IAm received from " + d);
System.out.println("Segmentation: " + d.getSegmentationSupported());
d.setSegmentationSupported(Segmentation.noSegmentation);
}
}
}
the output of my program is;
IAm received from RemoteDevice(instanceNumber=2222, address=Address [networkNumber=20, macAddress=[ae,8,0,0,0,0]])
Segmentation: both
a null
COV_Result: Instance-ID:0 Value:2784.5 Type: 2
COV_Result: Instance-ID:0 Value:2785.0 Type: 2
COV_Result: Instance-ID:0 Value:2785.5 Type: 2
COV_Result: Instance-ID:0 Value:2786.0 Type: 2
b ErrorAPDU(choice=5, errorClass=Object, errorCode=covSubscriptionFailed)
COV_Result: Instance-ID:0 Value:2786.5 Type: 2
COV_Result: Instance-ID:0 Value:2787.0 Type: 2
EDIT: The "Problem" is that my removeDevice will be overwritten as soon as I receive the first COV. I did a workarround like that:
private RemoteDevice getRemoteDevice() {
return localDevice.getRemoteDeviceCreate(2222, new Address(
19, new OctetString(new byte[] { -82, 8, 0, 0, 0, 0 })));
}
this is executed any time when I send something to the bacnet server. How can I do that propperly?