Skip to content

Commit

Permalink
feat(plc-simulator): add I-AM response to whois
Browse files Browse the repository at this point in the history
  • Loading branch information
sruehl committed Nov 4, 2022
1 parent 3577f8b commit 6cd52d2
Showing 1 changed file with 97 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ public class BacnetServerAdapter extends ChannelInboundHandlerAdapter {

private Context context;

// TODO: make configurable
private static int DEVICE_INSTANCE = 4711;

// TODO: make configurable
private static int DEVICE_ID = 815;

public BacnetServerAdapter(Context context) {
LOGGER.info("Creating adapter with context {}", context);
}
Expand All @@ -46,6 +52,8 @@ public void channelInactive(ChannelHandlerContext ctx) throws Exception {

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("Got request");
System.out.println(msg);
if (!(msg instanceof BVLC)) {
return;
}
Expand Down Expand Up @@ -86,92 +94,110 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
BVLCOriginalUnicastNPDU bvlcOriginalUnicastNPDU = (BVLCOriginalUnicastNPDU) bvlc;
// TODO: get messageTypeField
APDU apdu = bvlcOriginalUnicastNPDU.getNpdu().getApdu();
if (!(apdu instanceof APDUConfirmedRequest)) {
// TODO: write useful error
ctx.writeAndFlush(new BVLCOriginalUnicastNPDU(
if (apdu instanceof APDUUnconfirmedRequest) {
APDUUnconfirmedRequest apduUnconfirmedRequest = (APDUUnconfirmedRequest) apdu;
BACnetUnconfirmedServiceRequest serviceRequest = apduUnconfirmedRequest.getServiceRequest();
if (serviceRequest instanceof BACnetUnconfirmedServiceRequestWhoIs) {
BACnetUnconfirmedServiceRequestWhoIs baCnetUnconfirmedServiceRequestWhoIs = (BACnetUnconfirmedServiceRequestWhoIs) serviceRequest;
if (baCnetUnconfirmedServiceRequestWhoIs.getDeviceInstanceRangeLowLimit() != null) {
if (DEVICE_INSTANCE < baCnetUnconfirmedServiceRequestWhoIs.getDeviceInstanceRangeLowLimit().getActualValue().longValue()) {
// Ignoring because we out if limit
return;
}
}
if (baCnetUnconfirmedServiceRequestWhoIs.getDeviceInstanceRangeHighLimit() != null) {
if (DEVICE_INSTANCE > baCnetUnconfirmedServiceRequestWhoIs.getDeviceInstanceRangeHighLimit().getActualValue().longValue()) {
// Ignoring because we out if limit
return;
}
}
BVLCOriginalUnicastNPDU response = new BVLCOriginalUnicastNPDU(
new NPDU(
(short) 1,
new NPDUControl(false, false, false, false, NPDUNetworkPriority.NORMAL_MESSAGE),
null,
null,
null,
null,
null,
null,
null,
null,
new APDUUnconfirmedRequest(
new BACnetUnconfirmedServiceRequestIAm(
StaticHelper.createBACnetApplicationTagObjectIdentifier(BACnetObjectType.DEVICE.getValue(), DEVICE_INSTANCE),
StaticHelper.createBACnetApplicationTagUnsignedInteger(1024),
StaticHelper.creatBACnetSegmentationTagged(BACnetSegmentation.NO_SEGMENTATION),
StaticHelper.createBACnetVendorIdApplicationTagged(BACnetVendorId.MAPPED.getVendorId()),
0
),
0
),
0
),
0
);
System.out.println("Writing response");
System.out.println(response);
ctx.writeAndFlush(response).addListener((ChannelFutureListener) f -> {
if (!f.isSuccess()) {
f.cause().printStackTrace();
}
});
} else {
throw new Exception(apdu.getClass() + " not set supported");
}
} else if (apdu instanceof APDUConfirmedRequest) {
APDUConfirmedRequest apduConfirmedRequest = (APDUConfirmedRequest) apdu;
// TODO: just handle read for now
BVLCOriginalUnicastNPDU response = new BVLCOriginalUnicastNPDU(
new NPDU(
(short) 1,
new NPDUControl(true, false, false, false, NPDUNetworkPriority.NORMAL_MESSAGE),
0,
(short) 0,
new NPDUControl(false, false, false, false, NPDUNetworkPriority.NORMAL_MESSAGE),
null,
0,
(short) 0,
null,
(short) 0,
null,
new APDUError(
(short) 0,
BACnetConfirmedServiceChoice.READ_PROPERTY,
new BACnetErrorGeneral(new Error(
new ErrorClassTagged(new BACnetTagHeader((byte) 0, TagClass.APPLICATION_TAGS, (byte) 1, (short) 0, (short) 0, 0, 0L), ErrorClass.COMMUNICATION, 0, (short) 0, TagClass.APPLICATION_TAGS),
new ErrorCodeTagged(new BACnetTagHeader((byte) 0, TagClass.APPLICATION_TAGS, (byte) 1, (short) 0, (short) 0, 0, 0L), ErrorCode.VENDOR_PROPRIETARY_VALUE, 0, (short) 0, TagClass.APPLICATION_TAGS)
)),
null,
null,
null,
null,
null,
new APDUComplexAck(
false,
false,
apduConfirmedRequest.getInvokeId(),
null,
null,
new BACnetServiceAckReadProperty(
StaticHelper.createBACnetContextTagObjectIdentifier((byte) 0, 2, 1L),
StaticHelper.createBACnetPropertyIdentifierTagged((byte) 1, 85),
null,
new BACnetConstructedDataAnalogValuePresentValue(
StaticHelper.createBACnetOpeningTag((short) 3),
StaticHelper.createBACnetTagHeaderBalanced(true, (short) 3, 3L),
StaticHelper.createBACnetClosingTag((short) 3),
StaticHelper.createBACnetApplicationTagReal(101L),
null,
null
),
0L
),
null,
null,
0
),
0
),
0
)).addListener((ChannelFutureListener) f -> {
);
System.out.println("Writing response");
System.out.println(response);
ctx.writeAndFlush(response).addListener((ChannelFutureListener) f -> {
if (!f.isSuccess()) {
f.cause().printStackTrace();
}
});
return;
}
APDUConfirmedRequest apduConfirmedRequest = (APDUConfirmedRequest) apdu;
// TODO: implement me
System.out.println("Got request");
System.out.println(msg);
BVLCOriginalUnicastNPDU response = new BVLCOriginalUnicastNPDU(
new NPDU(
(short) 1,
new NPDUControl(false, false, false, false, NPDUNetworkPriority.NORMAL_MESSAGE),
null,
null,
null,
null,
null,
null,
null,
null,
new APDUComplexAck(
false,
false,
apduConfirmedRequest.getInvokeId(),
null,
null,
new BACnetServiceAckReadProperty(
StaticHelper.createBACnetContextTagObjectIdentifier((byte) 0, 2, 1L),
StaticHelper.createBACnetPropertyIdentifierTagged((byte) 1, 85),
null,
new BACnetConstructedDataAnalogValuePresentValue(
StaticHelper.createBACnetOpeningTag((short) 3),
StaticHelper.createBACnetTagHeaderBalanced(true, (short) 3, 3L),
StaticHelper.createBACnetClosingTag((short) 3),
StaticHelper.createBACnetApplicationTagReal(101L),
null,
null
),
0L
),
null,
null,
0
),
0
),
0
);
System.out.println("Writing response");
System.out.println(response);
ctx.writeAndFlush(response).addListener((ChannelFutureListener) f -> {
if (!f.isSuccess()) {
f.cause().printStackTrace();
}
});
;
}


}

0 comments on commit 6cd52d2

Please sign in to comment.