You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/11/04 15:45:32 UTC
[plc4x] 03/03: feat(plc-simulator): add I-AM response to whois
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 6cd52d2087d02ac312d0cf7d7fc52e5241b83021
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Nov 4 16:45:21 2022 +0100
feat(plc-simulator): add I-AM response to whois
---
.../bacnet/protocol/BacnetServerAdapter.java | 168 ++++++++++++---------
1 file changed, 97 insertions(+), 71 deletions(-)
diff --git a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/bacnet/protocol/BacnetServerAdapter.java b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/bacnet/protocol/BacnetServerAdapter.java
index 92dfe3fb4..b04ad7582 100644
--- a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/bacnet/protocol/BacnetServerAdapter.java
+++ b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/bacnet/protocol/BacnetServerAdapter.java
@@ -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);
}
@@ -46,6 +52,8 @@ public class BacnetServerAdapter extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ System.out.println("Got request");
+ System.out.println(msg);
if (!(msg instanceof BVLC)) {
return;
}
@@ -86,92 +94,110 @@ public class BacnetServerAdapter extends ChannelInboundHandlerAdapter {
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();
- }
- });
- ;
}
-
}