Skip to content
This repository has been archived by the owner on Jun 14, 2024. It is now read-only.

Commit

Permalink
#4 Found DeviceId from response.
Browse files Browse the repository at this point in the history
  • Loading branch information
baardl committed Apr 7, 2021
1 parent 2e57a95 commit 5bbb3d2
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 6 deletions.
4 changes: 4 additions & 0 deletions src/main/java/no/entra/bacnet/apdu/SDContextTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ public class SDContextTag {
public static final Octet TAG3LENGTH2 = new Octet("3a");
public static final Octet TAG3LENGTH3 = new Octet("3b");
public static final Octet TAG3LENGTH4 = new Octet("3c");
public static final Octet TAG4START = new Octet("4e");
public static final Octet TAG4END = new Octet("4f");
public static final Octet TAG5START = new Octet("5e");
public static final Octet TAG5END = new Octet("5f");

public SDContextTag(Octet contextTag) {
this.contextTag = contextTag;
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/no/entra/bacnet/objects/ObjectProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import no.entra.bacnet.properties.PropertyIdentifier;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

Expand All @@ -14,4 +15,27 @@ public ObjectProperties(ObjectId objectId, Set<PropertyIdentifier> propertyIdent
this.objectId = objectId;
this.propertyIdentifiers = propertyIdentifiers;
}

public ObjectId getObjectId() {
return objectId;
}

public Set<PropertyIdentifier> getPropertyIdentifiers() {
return propertyIdentifiers;
}

public Map<PropertyIdentifier, Object> getProperties() {
return properties;
}

public void setProperties(Map<PropertyIdentifier, Object> properties) {
this.properties = properties;
}

public void addProperty(PropertyIdentifier propertyIdentifier, Object value) {
if (properties == null) {
properties = new HashMap<>();
}
properties.put(propertyIdentifier, value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import no.entra.bacnet.apdu.Apdu;
import no.entra.bacnet.apdu.ApduType;
import no.entra.bacnet.apdu.ApplicationTag;
import no.entra.bacnet.apdu.SDContextTag;
import no.entra.bacnet.bvlc.Bvlc;
import no.entra.bacnet.bvlc.BvlcBuilder;
Expand All @@ -14,15 +15,23 @@
import no.entra.bacnet.objects.ObjectProperties;
import no.entra.bacnet.octet.Octet;
import no.entra.bacnet.octet.OctetReader;
import no.entra.bacnet.properties.PropertyIdentifier;
import no.entra.bacnet.properties.PropertyReference;
import org.slf4j.Logger;

import java.util.HashSet;
import java.util.Set;

import static no.entra.bacnet.apdu.ArrayTag.ARRAY1_END;
import static no.entra.bacnet.apdu.ArrayTag.ARRAY1_START;
import static no.entra.bacnet.apdu.SDContextTag.TAG4START;
import static no.entra.bacnet.utils.HexUtils.intToHexString;
import static no.entra.bacnet.utils.HexUtils.toInt;
import static no.entra.bacnet.utils.StringUtils.hasValue;
import static org.slf4j.LoggerFactory.getLogger;

public class ReadPropertyMultipleService implements Service, BacnetRequest, BacnetResponse {
private static final Logger log = getLogger(ReadPropertyMultipleService.class);

private Integer invokeId = null;
private Set<ObjectProperties> objectProperties = null;
Expand Down Expand Up @@ -119,33 +128,88 @@ public static ReadPropertyMultipleService parse(String hexString) {
//List of PropertyReferences
ObjectIdMapperResult<ObjectId> idMapperResult = ObjectIdMapper.parse(hexString);
ReadPropertyMultipleService service = new ReadPropertyMultipleService();
service.setObjectId(idMapperResult.getParsedObject());
ObjectId objectId = idMapperResult.getParsedObject();
int numberOfOctetsRead = idMapperResult.getNumberOfOctetsRead();
OctetReader listReader = new OctetReader(hexString);
listReader.next(numberOfOctetsRead); //Discard
Octet startList = listReader.next();
if (startList.equals(ARRAY1_START)) {
/*
//PropertyReference/ObjectList
//PresentValue
String unprocessedHexString = listReader.unprocessedHexString();
while (unprocessedHexString != null && !unprocessedHexString.isEmpty()) {
while (hasValue(unprocessedHexString)) {
Octet contextTag = listReader.next();
int arrayIndex = -1;
if (contextTag.equals(SDContextTag.TAG2LENGTH1)) {
Octet propertyIdentifierOctet = listReader.next();
PropertyIdentifier propertyIdentifier = PropertyIdentifier.fromOctet(propertyIdentifierOctet);
if (propertyIdentifier.equals(PropertyIdentifier.ObjectList)) {
Octet arrayIndexTag = listReader.next();

if (arrayIndexTag.equals(SDContextTag.TAG3LENGTH1)) {
Octet indexNumber = listReader.next();
arrayIndex = toInt(indexNumber);
} else if (arrayIndexTag.equals(SDContextTag.TAG3LENGTH2)) {
arrayIndex = toInt(listReader.nextOctets(2));
}
if (arrayIndex > -1) {
PropertyReference propertyReference = new PropertyReference(propertyIdentifier, arrayIndex);
service.addPropertyReference(propertyReference);
service.setObjectId(objectId);
log.trace("Added: {}", propertyReference );
}
}
if (listReader.unprocessedHexString().startsWith(TAG4START.toString())) {
listReader.next();
ApplicationTag applicationTag = new ApplicationTag(listReader.next());
Object value = null;
if (applicationTag.findType() == 2) {
//integer
int length = applicationTag.findLength();
value = toInt(listReader.nextOctets(length));

ObjectProperties objectProperties = new ObjectProperties(objectId,Set.of(propertyIdentifier));
objectProperties.addProperty(propertyIdentifier, value);
service.addObjectProperty(objectProperties);
}
} else if (listReader.unprocessedHexString().startsWith(TAG4START.toString())) {
//Handle Error
}
}
unprocessedHexString = listReader.unprocessedHexString();
/*
PropertyResult propertyResult = parseProperty(unprocessedHexString);
if (propertyResult != null ) {
if (propertyResult.getProperty() != null) {
Property property = propertyResult.getProperty();
String key = property.getKey();
Object value = property.getValue();
accessResult.setResultByKey(key, value);
log.trace("{}:{}", key, value);
// accessResult.setResultByKey(key, value);
}
unprocessedHexString = propertyResult.getUnprocessedHexString();
}
*/
}

*/
}
return service;
}

private void addObjectProperty(ObjectProperties objectProperty) {
if (objectProperties == null) {
objectProperties = new HashSet<>();
}
objectProperties.add(objectProperty);
}

void addPropertyReference(PropertyReference propertyReference) {
if (propertyReferences == null) {
propertyReferences = new HashSet<>();
}
propertyReferences.add(propertyReference);
}


}
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package no.entra.bacnet.device;

import no.entra.bacnet.objects.ObjectProperties;
import no.entra.bacnet.properties.PropertyIdentifier;
import no.entra.bacnet.services.ReadPropertyMultipleService;
import no.entra.bacnet.services.ReadPropertyMultipleServiceBuilder;
import org.junit.jupiter.api.Test;

import java.util.Map;
import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

Expand Down Expand Up @@ -37,5 +42,14 @@ void findCountOfObjectsResponse() {
assertNotNull(countOfObjectsResponse);
DeviceId deviceId = new DeviceId(8);
assertEquals(deviceId, countOfObjectsResponse.getObjectId());
Set<ObjectProperties> objectProperties = countOfObjectsResponse.getObjectProperties();
assertNotNull(objectProperties);
assertEquals(1, objectProperties.size());
ObjectProperties objectProperty = objectProperties.iterator().next();
Set<PropertyIdentifier> propertyIdentifiers = objectProperty.getPropertyIdentifiers();
assertEquals(PropertyIdentifier.ObjectList, propertyIdentifiers.iterator().next());
Map<PropertyIdentifier, Object> properties = objectProperty.getProperties();
assertEquals(Integer.valueOf(361), properties.get(PropertyIdentifier.ObjectList));

}
}

0 comments on commit 5bbb3d2

Please sign in to comment.