• B
    bf89

    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?

    posted in BACnet4J general discussion read more