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

Commit

Permalink
#4 Moved from NpduResult and BvlcResult to ParserResult<T>
Browse files Browse the repository at this point in the history
  • Loading branch information
baardl committed Apr 10, 2021
1 parent cf051e1 commit a763ce9
Show file tree
Hide file tree
Showing 8 changed files with 92 additions and 33 deletions.
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,25 @@
# bacnet-typelib
Domain objects, mappers and builders for Bacnet.

## Inspiration
Inspired by java.net.HttpClient and HttpRequest/HttpResponse
```
java.net.HttpClient client = HttpClient.newHttpClient();
java.net.HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://openjdk.java.net/"))
.build();
java.net.HttpResponse client.send(..)
or
CompletableFuture<HttpResponse<T>> client.sendAsync
```
Response
```
CompletableFuture<HttpResponse<T>> client.sendAsync
jdk.internal.net.http.HeaderParser
jdk.internal.net.http.HttpRequestImpl
```
Link will be the combination of sendTo Address, and InvokeId. The response will be received from the
sendTo Address, now as sender Address.

Step 1 will have to be more simple though.
17 changes: 17 additions & 0 deletions src/main/java/no/entra/bacnet/BacnetMessageParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package no.entra.bacnet;

import no.entra.bacnet.bvlc.Bvlc;
import no.entra.bacnet.bvlc.BvlcParser;
import no.entra.bacnet.npdu.Npdu;
import no.entra.bacnet.npdu.NpduParser;
import no.entra.bacnet.parseandmap.ParserResult;

public class BacnetMessageParser {

public static BacnetMessage parse(String fullBacnetHexString) {
ParserResult<Bvlc> bvlcResult = BvlcParser.parse(fullBacnetHexString);
String hexString = bvlcResult.getUnparsedHexString();
ParserResult<Npdu> npduRestult = NpduParser.parse(hexString);
return null;
}
}
21 changes: 14 additions & 7 deletions src/main/java/no/entra/bacnet/bvlc/BvlcParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import no.entra.bacnet.octet.Octet;
import no.entra.bacnet.octet.OctetReader;
import no.entra.bacnet.parseandmap.ParserResult;

public class BvlcParser {

public static BvlcResult parse(String bacnetHexString) {
BvlcResult result = null;
public static ParserResult<Bvlc> parse(String bacnetHexString) {
ParserResult result = new ParserResult();
result.setInitialHexString(bacnetHexString);
OctetReader bvlcReader = new OctetReader(bacnetHexString);
if (bvlcReader == null) {
return null;
Expand All @@ -19,23 +21,28 @@ public static BvlcResult parse(String bacnetHexString) {
BvlcFunction function = BvlcFunction.fromOctet(functionOctet);
Octet[] messageLength = bvlcReader.nextOctets(2); //Length is two octets
Bvlc bvlc = new BvlcBuilder(function).withMessageLength(messageLength).build();
result = new BvlcResult(bvlc, bvlcReader.unprocessedHexString());

result.setParsedObject(bvlc); // = new BvlcResult(bvlc, bvlcReader.unprocessedHexString());
result.setUnparsedHexString(bvlcReader.unprocessedHexString());
result.setParsedOk(true);
if (bvlc.getFunction().equals(BvlcFunction.ForwardedNpdu)) {
//Add BBMD forwarding info for messages routed between Bacnet subnets.
result = addForwardingInfo(bvlc, bvlcReader);
result = addForwardingInfo(result, bvlcReader);
}
return result;
}

static BvlcResult addForwardingInfo(Bvlc bvlc, OctetReader bvlcReader) {
BvlcResult result = null;
static ParserResult<Bvlc> addForwardingInfo(ParserResult<Bvlc> result, OctetReader bvlcReader) {

Octet[] originatingAddressOctet = bvlcReader.nextOctets(4); //Specified in spec.
Octet[] port = bvlcReader.nextOctets(2);
Bvlc bvlc = result.getParsedObject();
bvlc.setOriginatingDeviceIp(originatingAddressOctet);
bvlc.setPort(port);
String unprocessedBacnetHexString = bvlcReader.unprocessedHexString();
result = new BvlcResult(bvlc, unprocessedBacnetHexString);
result.setParsedOk(true);
result.setParsedObject(bvlc);
result.setUnparsedHexString(unprocessedBacnetHexString);

return result;
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/no/entra/bacnet/bvlc/BvlcResult.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.entra.bacnet.bvlc;

@Deprecated //Use ParserResult
public class BvlcResult {
private final Bvlc bvlc;
private final String unprocessedHexString;
Expand Down
44 changes: 26 additions & 18 deletions src/main/java/no/entra/bacnet/npdu/NpduParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import no.entra.bacnet.octet.Octet;
import no.entra.bacnet.octet.OctetReader;
import no.entra.bacnet.parseandmap.ParserResult;
import no.entra.bacnet.utils.HexUtils;
import org.slf4j.Logger;

Expand All @@ -10,8 +11,8 @@
public class NpduParser {
private static final Logger log = getLogger(NpduParser.class);

public static NpduResult parse(String bacnetHexString) {
NpduResult result = null;
public static ParserResult<Npdu> parse(String bacnetHexString) {
ParserResult<Npdu> result = new ParserResult<>();
OctetReader npduReader = new OctetReader(bacnetHexString);
if (npduReader == null) {
return null;
Expand All @@ -22,30 +23,32 @@ public static NpduResult parse(String bacnetHexString) {
}
Octet controlOctet = npduReader.next();
Npdu npdu = new NpduBuilder(controlOctet).build();
result.setParsedObject(npdu);

if (npdu.isDestinationAvailable()) {
result = addDestinationSpecifierInfo(npdu, npduReader);
result = addDestinationSpecifierInfo(result, npduReader);
if (result.isParsedOk()) {
npdu = result.getNpdu();
npduReader = new OctetReader(result.getUnprocessedHexString());
npdu = result.getParsedObject();
npduReader = new OctetReader(result.getUnparsedHexString());
}
}
if (npdu.isSourceAvailable()) {
result = addSourceSpecifierInfo(npdu, npduReader);
result = addSourceSpecifierInfo(result, npduReader);
if (result.isParsedOk()) {
npdu = result.getNpdu();
npduReader = new OctetReader(result.getUnprocessedHexString());
npdu = result.getParsedObject();
npduReader = new OctetReader(result.getUnparsedHexString());
}
}
if (result == null) {
String unprocessedHexString = npduReader.unprocessedHexString();
result = new NpduResult(npdu, unprocessedHexString);
}
// if (result == null) {
// String unprocessedHexString = npduReader.unprocessedHexString();
// result = new NpduResult(npdu, unprocessedHexString);
// }
return result;
}

static NpduResult addSourceSpecifierInfo(Npdu npdu, OctetReader npduReader) {
NpduResult result = null;
static ParserResult<Npdu> addSourceSpecifierInfo(ParserResult<Npdu> result, OctetReader npduReader) {
// NpduResult result = null;
Npdu npdu = result.getParsedObject();
Octet[] sourceNetworkAddress = npduReader.nextOctets(2);
npdu.setSourceNetworkAddress(sourceNetworkAddress);
Octet sourceMacLayerAddressNumberOfOctets = npduReader.next();
Expand All @@ -54,20 +57,25 @@ static NpduResult addSourceSpecifierInfo(Npdu npdu, OctetReader npduReader) {
npdu.setSourceMacLayerAddress(sourceMacLayerAddress);
// Octet hopCount = npduReader.next();
// npdu.setHopCount(hopCount);
result.setParsedOk(true);
result.setParsedObject(npdu);
String unprocessedHexString = npduReader.unprocessedHexString();
result = new NpduResult(npdu, unprocessedHexString);
result.setUnparsedHexString(unprocessedHexString);
return result;
}
static NpduResult addDestinationSpecifierInfo(Npdu npdu, OctetReader npduReader) {
NpduResult result = null;
static ParserResult<Npdu> addDestinationSpecifierInfo(ParserResult<Npdu> result, OctetReader npduReader) {
// NpduResult result = null;
Npdu npdu = result.getParsedObject();
Octet[] destinationNetworkAddress = npduReader.nextOctets(2);
npdu.setDestinationNetworkAddress(destinationNetworkAddress);
Octet destinationMacLayerAddress = npduReader.next();
npdu.setDestinationMacLayerAddress(destinationMacLayerAddress);
Octet hopCount = npduReader.next();
npdu.setHopCount(hopCount);
String unprocessedHexString = npduReader.unprocessedHexString();
result = new NpduResult(npdu, unprocessedHexString);
result.setParsedOk(true);
result.setParsedObject(npdu);
result.setUnparsedHexString(unprocessedHexString);
return result;
}

Expand Down
1 change: 1 addition & 0 deletions src/main/java/no/entra/bacnet/npdu/NpduResult.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.entra.bacnet.npdu;

@Deprecated //Use ParserResult<Npdu>
public class NpduResult {
private final Npdu npdu;
private final String unprocessedHexString;
Expand Down
7 changes: 4 additions & 3 deletions src/test/java/no/entra/bacnet/bvlc/BvlcParserTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.entra.bacnet.bvlc;

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

import java.net.UnknownHostException;
Expand All @@ -13,15 +14,15 @@ class BvlcParserTest {

@Test
void parse() throws UnknownHostException {
BvlcResult result = BvlcParser.parse(bacnetHexString);
ParserResult<Bvlc> result = BvlcParser.parse(bacnetHexString);
assertNotNull(result);
Bvlc bvlc = result.getBvlc();
Bvlc bvlc = result.getParsedObject();
assertNotNull(bvlc);
assertEquals(BvlcFunction.ForwardedNpdu, bvlc.getFunction());
assertEquals(24, bvlc.getFullMessageLength());
assertEquals("9.47.81.12", bvlc.getOriginatingDeviceIp());
assertEquals(47808, bvlc.getPort());
assertEquals("0120ffff00ff10080a07ae1a07ae", result.getUnprocessedHexString());
assertEquals("0120ffff00ff10080a07ae1a07ae", result.getUnparsedHexString());

}
}
11 changes: 6 additions & 5 deletions src/test/java/no/entra/bacnet/npdu/NpduParserTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.entra.bacnet.npdu;

import no.entra.bacnet.octet.Octet;
import no.entra.bacnet.parseandmap.ParserResult;
import no.entra.bacnet.utils.HexUtils;
import org.junit.jupiter.api.Test;

Expand All @@ -15,28 +16,28 @@ class NpduParserTest {

@Test
void parse() {
NpduResult result = NpduParser.parse(npduApduHexString);
ParserResult<Npdu> result = NpduParser.parse(npduApduHexString);
assertNotNull(result);
assertTrue(result.isParsedOk());
Npdu npdu = result.getNpdu();
Npdu npdu = result.getParsedObject();
assertNotNull(npdu);
assertEquals("20", npdu.getControl().toString());
Octet[] networkAddress = {fromHexString("ff"), fromHexString("ff")};
assertTrue(Arrays.equals(networkAddress, npdu.getDestinationNetworkAddress()));
assertEquals(fromHexString("00"), npdu.getDestinationMacLayerAddress());
assertEquals(fromHexString("ff"), npdu.getHopCount());

assertEquals("10080a07ae1a07ae", result.getUnprocessedHexString());
assertEquals("10080a07ae1a07ae", result.getUnparsedHexString());
}

@Test
void validateSadr() {
String hexString = "01080961010c1001c40200000cc403c";
//000007100310036002d004e004100450032002f004600430042002e004c006f00630061006c0020004100700070006c00690063006100740069006f006e002e005500520020006e00610074007400730065006e006b002000670075006c0076007600610072006d00650020003100200065007400670072003400330033003300300031002e0044006100670042007600690031002d00310031002e004400610067004200760076";
NpduResult result = NpduParser.parse(hexString);
ParserResult<Npdu> result = NpduParser.parse(hexString);
assertNotNull(result);
assertTrue(result.isParsedOk());
Npdu npdu = result.getNpdu();
Npdu npdu = result.getParsedObject();
assertNotNull(npdu);
Octet[] sadr = npdu.getSourceMacLayerAddress();
int sadrInt = HexUtils.toInt(sadr[0]);
Expand Down

0 comments on commit a763ce9

Please sign in to comment.