Please Note This forum exists for community support for the Mango product family and the Radix IoT Platform. Although Radix IoT employees participate in this forum from time to time, there is no guarantee of a response to anything posted here, nor can Radix IoT, LLC guarantee the accuracy of any information expressed or conveyed. Specific project questions from customers with active support contracts are asked to send requests to support@radixiot.com.

Radix IoT Website Mango 3 Documentation Website Mango 4 Documentation Website

  • Hello ,
    I try to read encodable value in a array with

    
    ReadPropertyRequest(ObjectIdentifier objectIdentifier, PropertyIdentifier propertyIdentifier,
                UnsignedInteger propertyArrayIndex)
    
    

    For an ack requred in notification class i get

    [list]
    com.serotonin.bacnet4j.exception.ErrorAPDUException: ErrorAPDU(choice=12, errorClass=Property, errorCode=Property is not an array)
    at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:434)
    at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:415)
    at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:408)
    at com.sauter_controls.jbacnet.Test.read(Test.java:432)
    at com.sauter_controls.jbacnet.Test.startTest(Test.java:312)
    at com.sauter_controls.jbacnet.Test.<init>(Test.java:94)
    at com.sauter_controls.jbacnet.Test.main(Test.java:75)
    Exception in thread "main" java.lang.NullPointerException
    at com.sauter_controls.jbacnet.Test.read(Test.java:445)
    at com.sauter_controls.jbacnet.Test.startTest(Test.java:312)
    at com.sauter_controls.jbacnet.Test.<init>(Test.java:94)
    at com.sauter_controls.jbacnet.Test.main(Test.java:75)
    [/list]

    For an priority array in Analog output i get

    [list]

    com.serotonin.bacnet4j.exception.BACnetErrorException: Property: Property is not a list
    at com.serotonin.bacnet4j.type.Encodable.readEncodable(Encodable.java:307)
    at com.serotonin.bacnet4j.service.acknowledgement.ReadPropertyAck.<init>(ReadPropertyAck.java:88)
    at com.serotonin.bacnet4j.service.acknowledgement.AcknowledgementService.createAcknowledgementService(AcknowledgementService.java:46)
    at com.serotonin.bacnet4j.apdu.ComplexACK.parseServiceData(ComplexACK.java:191)
    at com.serotonin.bacnet4j.npdu.ip.IpMessageControl.waitForAck(IpMessageControl.java:681)
    at com.serotonin.bacnet4j.npdu.ip.IpMessageControl.send(IpMessageControl.java:300)
    at com.serotonin.bacnet4j.npdu.ip.IpMessageControl.send(IpMessageControl.java:280)
    at com.serotonin.bacnet4j.npdu.ip.IpMessageControl.send(IpMessageControl.java:237)
    at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:425)
    at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:415)
    at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:408)
    at com.sauter_controls.jbacnet.Test.read(Test.java:432)
    at com.sauter_controls.jbacnet.Test.startTest(Test.java:312)
    at com.sauter_controls.jbacnet.Test.<init>(Test.java:94)
    at com.sauter_controls.jbacnet.Test.main(Test.java:75)

    [/list]

    In the class encodable is that ok ?

    
    
            if (propertyArrayIndex != null && !def.isSequence())
            	//return readWrapped(queue, def.getClazz(), contextId);
                throw new BACnetErrorException(ErrorClass.property, ErrorCode.propertyIsNotAList);
    
    
    

    My code :

    
    		int deviceID = dataForTestAliases.getDev().getInstanceNumber();
    		int objectID = dataForTestAliases.getRo().getObjectIdentifier().getInstanceNumber();
    		int property = dataForTestAliases.getProperty();
    		String index = dataForTestAliases.getIndex();
    		PropertyIdentifier pid = new PropertyIdentifier(property);
    		Encodable value ;
    		ReadPropertyAck readAck = null;
    		try {
    			if (!index.equals("NONE")){	
    				readAck = (ReadPropertyAck) bnet.getLocalDevice().send(dataForTestAliases.getDev(), 
    					new ReadPropertyRequest(dataForTestAliases.getRo().getObjectIdentifier(), pid,
    							new UnsignedInteger(Integer.parseInt(dataForTestAliases.getIndex()))));
    			}
    			else {
    				
    				readAck = (ReadPropertyAck) bnet.getLocalDevice().send(dataForTestAliases.getDev(), 
    						new ReadPropertyRequest(dataForTestAliases.getRo().getObjectIdentifier(), pid));
    			}
    		} catch (BACnetException e2) {
    			// TODO Auto-generated catch block
    			e2.printStackTrace();
    		}
    		value = readAck.getValue();
    

    Thanks for your help


  • I can't tell what properties you are trying to read, so i can't validate what you are trying to do. Can you provide object types (you said one was AnalogOutput), property identifiers, and property indices?


  • 
    #alias		device	device ip				obj-type	instance	property	index	format	priority
    dp1			525		192.168.10.149:47808	0			1019		85			NONE	real	8
    dp2			525		192.168.10.149:47808	0			1113		85			NONE	real	8
    dp3 		525		192.168.10.149:47808	1			1000		85			NONE	real	8
    dp3_prio8 	525		192.168.10.149:47808	1			1000		87			8		real	8
    noti1_size	525		192.168.10.149:47808	15			1			1			0		unsigned	8
    noti1_1		525		192.168.10.149:47808	15			1			1			1		unsigned	8
    noti1_2		525		192.168.10.149:47808	15			1			1			2		unsigned	8
    noti1_3		525		192.168.10.149:47808	15			1			1			3		unsigned	8
    

    dp3_prio8 is the analog output index 8
    noti1 the notification class (all index)


  • For "dp3_prio8", a priority array is an object, not a sequence. It's a tricky thing i guess because the object happens to be a type of a sequence (accessed as an array), but i suppose you need to request the object without an index, cast to a PriorityArray, and then pull the value you want out of it.

    For "noti1", similar problem. The property is a bit string, not a sequence. Solution is similar to above.


  • but i suppose you need to request the object without an index

    I need just one value , the value Priorityarray.get(index)

    Bacnet4j should be able to do that ?


  • Like this:

    
            ReadPropertyRequest req = new ReadPropertyRequest(new ObjectIdentifier(ObjectType.analogOutput, 1234),
                    PropertyIdentifier.priorityArray);
            ReadPropertyAck ack = localDevice.send(remoteDevice, req);
            PriorityArray priorityArray = (PriorityArray) ack.getValue();
            int priority = priorityArray.get(16).getIntegerValue().intValue();
    
    

  • Note that it is the remote device that is imposing this, not BACnet4J (unless BACnet4J is the implementation in the remote device). The error message about "Property is not an array/list" is being returned by the equipment, which is why you need to do it this way.


  • Please see the attached file that show the equipement answer.

    The error is created by the stack, because of the PriorityArray is not a sequence

     add(ObjectType.analogOutput, PropertyIdentifier.priorityArray, PriorityArray.class, false, true,  new PriorityArray());
    
    

    Attachment: download link


  • Ah, i see. Can you send me the full byte stream and i'll take a look.


  • Yes Monday (or tomorrow) i can send you the full byte stream (I have not the station here sorry)

    Thanks for help and good week-end !


  • No problem. If you can please include the request byte stream as well, that may be useful.


  • This is my wireshark capture

    see #21 in this capture.

    Thanks

    Attachment: download link


  • K. I think it should be better now. This was an issue only with PriorityArray i believe. Changes have been checked into CVS. Please let me know if it helps.


  • Thanks it's help !