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

Commit

Permalink
#4 Found objectId
Browse files Browse the repository at this point in the history
  • Loading branch information
baardl committed Apr 9, 2021
1 parent 83d0d4d commit 3206cc9
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package no.entra.bacnet.services;

import no.entra.bacnet.apdu.SDContextTag;
import no.entra.bacnet.objects.ObjectId;
import no.entra.bacnet.objects.ObjectIdMapper;
import no.entra.bacnet.octet.OctetReader;
import no.entra.bacnet.parseandmap.ParserResult;
import org.slf4j.Logger;

import java.util.ArrayList;
import java.util.List;

import static no.entra.bacnet.apdu.ArrayTag.ARRAY1_END;
import static org.slf4j.LoggerFactory.getLogger;

/*
Single object multiple properties
{
"objectId": "analog-value, 0",
"results": [
Expand Down Expand Up @@ -38,6 +44,8 @@
}
]
}
HexString: 0c008000001e294d4e7514005549315f5a6f6e6554656d70657261747572654f291c4e750f00416e616c6f672056616c756520304f29754e915f4f29554e4441b3332c4f1f
With Error
{
"objectId": "device, 8",
Expand Down Expand Up @@ -65,6 +73,7 @@
}
]
}
HexString: 0c020000081e294d4e75060046574643554f291c4e751800465720536572696573204261636e6574204465766963654f29755e910291205f29555e910291205f1f
With Array
{
Expand All @@ -86,22 +95,54 @@
}
]
}
HexString: 30460e0c020000081e294c39014ec4020000084f294c39024ec4008000004f294c39034e1f
*/
public class ReadObjectPropertiesResultParser {

public static ReadObjectPropertiesResult parse(String hexString) throws BacnetParserException {
ObjectId objectId = null;// TODO: 08.04.2021
List<ReadPropertyResult> readPropertyResults = new ArrayList<>();//TODO
//0c008000001e294d4e7514005549315f5a6f6e6554656d70657261747572654f291c4e750f00416e616c6f672056616c756520304f29754e915f4f29554e4441b3332c4f1f
private static final Logger log = getLogger(ReadObjectPropertiesResultParser.class);
public static ParserResult<ReadObjectPropertiesResult> parse(String hexString) throws BacnetParserException {
ParserResult<ReadObjectPropertiesResult> parserResult = new ParserResult<>();
ReadObjectPropertiesResult readObjectPropertiesResult = null;
parserResult.setInitialHexString(hexString);
ObjectId objectId = null;
List<ReadPropertyResult> readPropertyResults = new ArrayList<>();
OctetReader objectPropertiesReader = new OctetReader(hexString);
ParserResult<ObjectId> objectIdResult = ObjectIdMapper.parse(hexString);
objectId = objectIdResult.getParsedObject();
int numberOfOctetsRead = objectIdResult.getNumberOfOctetsRead();
objectPropertiesReader.next(numberOfOctetsRead); //Discard and move pointer
while (objectPropertiesReader.hasNext()) {
if (!objectPropertiesReader.hasNext() || !objectPropertiesReader.next().equals(SDContextTag.TAG0LENGTH4)) {
parserResult.setUnparsedHexString(objectPropertiesReader.unprocessedHexString());
parserResult.setErrorMessage("PropertyResult must start with SD-ContextTag 0 (0c).");
parserResult.setParsedOk(false);
throw new BacnetParserException("PropertyResult must start with SD-ContextTag 0. (0c)", parserResult);
}
String objectIdHexString = objectPropertiesReader.next(4);
ParserResult<ObjectId> objectIdResult = ObjectIdMapper.parse(objectIdHexString);
if (objectIdResult.isParsedOk()) {
objectId = objectIdResult.getParsedObject();
readObjectPropertiesResult = new ReadObjectPropertiesResult(objectId);
parserResult.setParsedObject(readObjectPropertiesResult);

int numberOfOctetsRead = objectIdResult.getNumberOfOctetsRead();
objectPropertiesReader.next(numberOfOctetsRead); //Discard and move pointer
while (objectPropertiesReader.hasNext()) {
try {
String unprocessedHexString = objectPropertiesReader.unprocessedHexString();
if (unprocessedHexString.startsWith(ARRAY1_END.toString())) {
break;
}
ParserResult<ReadPropertyResult> propertyParserResult = ReadPropertyResultParser.parse(unprocessedHexString);
if (parserResult.isParsedOk()) {
readPropertyResults.add(propertyParserResult.getParsedObject());
numberOfOctetsRead = parserResult.getNumberOfOctetsRead();
objectPropertiesReader.next(numberOfOctetsRead);
}
} catch (BacnetParserException e) {
log.trace("Could not parse ReadObjectPropertiesResult from hexString: {}. Unparsed: {} ", hexString, e.getParserResult().getUnparsedHexString());
break;
}
}
} else {
parserResult.setParsedOk(false);
parserResult.setErrorMessage("Could not parse ObjectId");
parserResult.setUnparsedHexString(objectIdResult.getUnparsedHexString());
}
//Iterate over list of
return null;
return parserResult;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package no.entra.bacnet.services;

import no.entra.bacnet.objects.ObjectId;
import no.entra.bacnet.objects.ObjectType;
import no.entra.bacnet.parseandmap.ParserResult;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

/*
Single object multiple properties
{
Expand Down Expand Up @@ -89,6 +94,22 @@
class ReadObjectPropertiesResultParserTest {

@Test
void parse() {
void parse() throws BacnetParserException {
String hexString = "0c008000001e294d4e7514005549315f5a6f6e6554656d70657261747572654f291c4e750f00416e616c6f672056616c756520304f29754e915f4f29554e4441b3332c4f1f";
ParserResult<ReadObjectPropertiesResult> parserResult = ReadObjectPropertiesResultParser.parse(hexString);
assertNotNull(parserResult);
assertTrue(parserResult.isParsedOk());
ReadObjectPropertiesResult propertiesResult = parserResult.getParsedObject();
assertNotNull(propertiesResult);
ObjectId objectId = new ObjectId(ObjectType.AnalogValue, 0);
assertEquals(objectId, propertiesResult.getObjectId());
}

@Test
void unparsableHexString() {
String hexString = "0000";
assertThrows(BacnetParserException.class, () -> {
ReadObjectPropertiesResultParser.parse(hexString);
});
}
}

0 comments on commit 3206cc9

Please sign in to comment.