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();
-            }
-        });
-        ;
     }
 
-
 }