You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2019/07/04 12:02:31 UTC

[plc4x] 03/03: - Added KNX parsing of "Additional Information". - Added initial support for parsing of cEMI packages.

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 0d8267f94479d41a1cea7549b1ddd30d4f3763ce
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Jul 4 14:02:21 2019 +0200

    - Added KNX parsing of "Additional Information".
    - Added initial support for parsing of cEMI packages.
---
 .../protocol/test/ProtocolTestsuiteRunner.java     |  7 ++-
 .../resources/protocols/knxnetip/knxnetip.mspec    | 72 +++++++++++++++++++---
 .../org/apache/plc4x/java/knxnetip/IOTest.java     |  2 +-
 .../{KNXNetIpTestsuite.java => KNXNetIpTest.java}  |  4 +-
 .../test/resources/testsuite/KNXNetIPTestsuite.xml | 21 ++++---
 5 files changed, 87 insertions(+), 19 deletions(-)

diff --git a/plc4j/utils/protocol-test-utils/src/main/java/org/apache/plc4x/protocol/test/ProtocolTestsuiteRunner.java b/plc4j/utils/protocol-test-utils/src/main/java/org/apache/plc4x/protocol/test/ProtocolTestsuiteRunner.java
index 7853aba..f85d3af 100644
--- a/plc4j/utils/protocol-test-utils/src/main/java/org/apache/plc4x/protocol/test/ProtocolTestsuiteRunner.java
+++ b/plc4j/utils/protocol-test-utils/src/main/java/org/apache/plc4x/protocol/test/ProtocolTestsuiteRunner.java
@@ -32,6 +32,8 @@ import org.dom4j.*;
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
 import org.dom4j.io.SAXReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.xmlunit.builder.DiffBuilder;
 import org.xmlunit.diff.Diff;
 
@@ -41,7 +43,7 @@ import java.util.*;
 
 public class ProtocolTestsuiteRunner {
 
-    private static final Namespace TEST_NAMESPACE = new Namespace("test", "https://plc4x.apache.org/schemas/testsuite.xsd");
+    private static final Logger LOGGER = LoggerFactory.getLogger(ProtocolTestsuiteRunner.class);
 
     private final String testsuiteDocument;
 
@@ -50,7 +52,7 @@ public class ProtocolTestsuiteRunner {
     }
 
     @TestFactory
-    public List<DynamicTest> getTestsuiteTests() throws ProtocolTestsuiteException {
+    public Iterable<DynamicTest> getTestsuiteTests() throws ProtocolTestsuiteException {
         ProtocolTestsuite testSuite = parseTestsuite(ProtocolTestsuiteRunner.class.getResourceAsStream(testsuiteDocument));
         List<DynamicTest> dynamicTests = new LinkedList<>();
         for(Testcase testcase : testSuite.getTestcases()) {
@@ -86,6 +88,7 @@ public class ProtocolTestsuiteRunner {
 
                 testcases.add(new Testcase(name, description, raw, rootType, xmlElement));
             }
+            LOGGER.info(String.format("Found %d testcases.", testcases.size()));
             return new ProtocolTestsuite(testsuiteName.getTextTrim(), testcases);
         } catch (DocumentException e) {
             throw new ProtocolTestsuiteException("Error parsing testsuite xml", e);
diff --git a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
index 419840d..30ffe2a 100644
--- a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
+++ b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
@@ -69,18 +69,20 @@
         ]
         ['0x0310' DeviceConfigurationRequest [uint 16 'totalLength']
             [field DeviceConfigurationRequestDataBlock 'deviceConfigurationRequestDataBlock']
-            [field CEMI                                'cEMI' ['totalLength - (6 + deviceConfigurationRequestDataBlock.lengthInBytes)']]
+            [field CEMI                                'cemi' ['totalLength - (6 + deviceConfigurationRequestDataBlock.lengthInBytes)']]
         ]
         ['0x0311' DeviceConfigurationAck
             [field DeviceConfigurationAckDataBlock 'deviceConfigurationAckDataBlock']
         ]
         ['0x0420' TunnelingRequest [uint 16 'totalLength']
             [field TunnelingRequestDataBlock 'tunnelingRequestDataBlock']
-            [field CEMI                      'cEMI' ['totalLength - (6 + tunnelingRequestDataBlock.lengthInBytes)']]
+            [field CEMI                      'cemi' ['totalLength - (6 + tunnelingRequestDataBlock.lengthInBytes)']]
         ]
         ['0x0421' TunnelingResponse
             [field TunnelingResponseDataBlock 'tunnelingResponseDataBlock']
         ]
+        ['0x0530' RoutingIndication
+        ]
     ]
 ]
 
@@ -193,7 +195,7 @@
 
 [type 'DeviceStatus'
     [reserved uint 7 '0x00']
-    [field    bit  1 'programMode']
+    [field    bit    'programMode']
 ]
 
 [type 'ProjectInstallationIdentifier'
@@ -219,6 +221,29 @@
 [discriminatedType 'CEMI' [uint 8 'size']
     [discriminator uint 8 'messageCode']
     [typeSwitch 'messageCode'
+        ['0x10' CEMILRawReq
+        ]
+        ['0x11' CEMILDataReq
+        ]
+        ['0x13' CEMILPollDataReq
+        ]
+
+        ['0x25' CEMILPollDataCon
+        ]
+        ['0x29' CEMILDataInd
+        ]
+        ['0x2B' CEMILBusmonInd
+            [field      uint 8                    'additionalInformationLength']
+            [arrayField CEMIAdditionalInformation 'additionalInformation' length 'additionalInformationLength']
+            [arrayField uint 8                    'rawFrame'              count  'size - (additionalInformationLength + 2)']
+        ]
+        ['0x2D' CEMILRawInd
+        ]
+        ['0x2E' CEMILDataCon
+        ]
+        ['0x2F' CEMILRawCon
+        ]
+
         ['0xFC' CEMIMPropReadReq
             [field uint 16 'interfaceObjectType']
             [field uint  8 'objectInstance']
@@ -233,11 +258,44 @@
             [field uint  4 'numberOfElements']
             [field uint 12 'startIndex']
         ]
-        ['0x2B' CEMILBusmonInd
-            [field      uint 8 'additionalInformationLength']
-            [arrayField uint 8 'additionalInformation' count 'additionalInformationLength']
-            [arrayField uint 8 'rawFrame'              count 'size - (additionalInformationLength + 2)']
+    ]
+]
+
+[discriminatedType 'CEMIAdditionalInformation'
+    [discriminator uint 8 'additionalInformationType']
+    [typeSwitch 'additionalInformationType'
+        ['0x03' CEMIAdditionalInformationBusmonitorInfo
+            [implicit uint 8 'len' '1']
+            [field    bit    'frameErrorFlag']
+            [field    bit    'bitErrorFlag']
+            [field    bit    'parityErrorFlag']
+            [field    bit    'unknownFlag']
+            [field    bit    'lostFlag']
+            [field    uint 3 'sequenceNumber']
+        ]
+        ['0x04' CEMIAdditionalInformationRelativeTimestamp
+            [implicit uint 8  'len' '2']
+            [field RelativeTimestamp 'relativeTimestamp']
         ]
     ]
 ]
 
+[type 'CEMIControlField1'
+    [field    bit    'standardFrame']
+    [reserved uint 1 '0x00']
+    [field    bit    'doNotRepeat']
+    [field    bit    'broadcast']
+    [field    uint 2 'priority']
+    [field    bit    'ackRequested']
+    [field    bit    'error']
+]
+
+[type 'CEMIControlField2'
+    [field    bit    'groupAddress']
+    [field    uint 3 'hopCount']
+    [field    uint 3 'extendedFrameFormat']
+]
+
+[type 'RelativeTimestamp'
+    [field    uint 16 'timestamp']
+]
diff --git a/sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/IOTest.java b/sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/IOTest.java
index 8ce22ad..e43ecfa 100644
--- a/sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/IOTest.java
+++ b/sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/IOTest.java
@@ -33,7 +33,7 @@ public class IOTest {
 
     @Test
     public void testXml() throws Exception {
-        byte[] rData = Hex.decodeHex("0610020500180801c0a82a46c4090801c0a82a46c40a0203");
+        byte[] rData = Hex.decodeHex("06100420001c046b00002b0703010504024502bc360a1e0ce100810d");
         ObjectMapper mapper = new XmlMapper().enableDefaultTyping();
         ReadBuffer rBuf = new ReadBuffer(rData);
         KNXNetIPMessage packet = new KNXNetIPMessageIO().parse(rBuf);
diff --git a/sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/KNXNetIpTestsuite.java b/sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/KNXNetIpTest.java
similarity index 90%
rename from sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/KNXNetIpTestsuite.java
rename to sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/KNXNetIpTest.java
index bb6fcde..b968eeb 100644
--- a/sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/KNXNetIpTestsuite.java
+++ b/sandbox/test-java-knxnetip-driver/src/test/java/org/apache/plc4x/java/knxnetip/KNXNetIpTest.java
@@ -21,9 +21,9 @@ package org.apache.plc4x.java.knxnetip;
 
 import org.apache.plc4x.protocol.test.ProtocolTestsuiteRunner;
 
-public class KNXNetIpTestsuite extends ProtocolTestsuiteRunner {
+public class KNXNetIpTest extends ProtocolTestsuiteRunner {
 
-    public KNXNetIpTestsuite() {
+    public KNXNetIpTest() {
         super("/testsuite/KNXNetIPTestsuite.xml");
     }
 
diff --git a/sandbox/test-java-knxnetip-driver/src/test/resources/testsuite/KNXNetIPTestsuite.xml b/sandbox/test-java-knxnetip-driver/src/test/resources/testsuite/KNXNetIPTestsuite.xml
index 759de02..ffe965b 100644
--- a/sandbox/test-java-knxnetip-driver/src/test/resources/testsuite/KNXNetIPTestsuite.xml
+++ b/sandbox/test-java-knxnetip-driver/src/test/resources/testsuite/KNXNetIPTestsuite.xml
@@ -460,13 +460,19 @@
         <cemi className="org.apache.plc4x.java.knxnetip.CEMILBusmonInd">
           <additionalInformationLength>7</additionalInformationLength>
           <additionalInformation>
-            <additionalInformation>3</additionalInformation>
-            <additionalInformation>1</additionalInformation>
-            <additionalInformation>5</additionalInformation>
-            <additionalInformation>4</additionalInformation>
-            <additionalInformation>2</additionalInformation>
-            <additionalInformation>69</additionalInformation>
-            <additionalInformation>2</additionalInformation>
+            <additionalInformation className="org.apache.plc4x.java.knxnetip.CEMIAdditionalInformationBusmonitorInfo">
+              <frameErrorFlag>false</frameErrorFlag>
+              <bitErrorFlag>false</bitErrorFlag>
+              <parityErrorFlag>false</parityErrorFlag>
+              <unknownFlag>false</unknownFlag>
+              <lostFlag>false</lostFlag>
+              <sequenceNumber>5</sequenceNumber>
+            </additionalInformation>
+            <additionalInformation className="org.apache.plc4x.java.knxnetip.CEMIAdditionalInformationRelativeTimestamp">
+              <relativeTimestamp>
+                <timestamp>17666</timestamp>
+              </relativeTimestamp>
+            </additionalInformation>
           </additionalInformation>
           <rawFrame>
             <rawFrame>188</rawFrame>
@@ -481,6 +487,7 @@
           </rawFrame>
         </cemi>
       </TunnelingRequest>
+
     </xml>
   </testcase>