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 2018/10/12 13:43:53 UTC

[incubator-plc4x] branch master updated (8aff258 -> ebc6604)

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

cdutz pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git.


    from 8aff258  PLC4X-61 - Installation fails plc4j-protocoll-ethernetip needs license
     new 70163d3  - Further updates to the DeltaV POC code ....
     new ebc6604  - Added an option to run the POC via maven.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 plc4j/protocols/delta-v/pom.xml                    |  59 ++
 .../java/org/apache/plc4x/java/deltav/PoC.java     | 679 +++++++++++++++++----
 .../messages/items/DefaultLongFieldItemTest.java   | 114 ++++
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       |   2 +-
 4 files changed, 725 insertions(+), 129 deletions(-)
 create mode 100644 plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItemTest.java


[incubator-plc4x] 02/02: - Added an option to run the POC via maven.

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ebc6604c4943268fbed348922fe90f86c275d949
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Oct 12 15:43:47 2018 +0200

    - Added an option to run the POC via maven.
---
 plc4j/protocols/delta-v/pom.xml | 46 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

diff --git a/plc4j/protocols/delta-v/pom.xml b/plc4j/protocols/delta-v/pom.xml
index bf114cb..e339d86 100644
--- a/plc4j/protocols/delta-v/pom.xml
+++ b/plc4j/protocols/delta-v/pom.xml
@@ -70,7 +70,51 @@
       <version>6.2.4</version>
       <scope>test</scope>
     </dependency>
-
   </dependencies>
 
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>exec-maven-plugin</artifactId>
+        <version>1.6.0</version>
+        <configuration>
+          <classpathScope>test</classpathScope>
+          <mainClass>org.apache.plc4x.java.deltav.PoC</mainClass>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <!--
+
+    This profile starts the application with a provided pcapng file instead of capturing real traffic.
+
+    Run With
+    mvn exec:java -P dummy -Dpcapng.file.path="/path/to/mycool.pcapng"
+
+  -->
+  <profiles>
+    <profile>
+      <id>dummy</id>
+
+      <properties>
+        <pcapng.file.path>hurz.pcapng</pcapng.file.path>
+      </properties>
+
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>exec-maven-plugin</artifactId>
+            <version>1.6.0</version>
+            <configuration combine.children="append">
+              <arguments>${pcapng.file.path}</arguments>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
 </project>
\ No newline at end of file


[incubator-plc4x] 01/02: - Further updates to the DeltaV POC code ....

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 70163d387da47b9115fd45cc5ea4279213508b6c
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Oct 11 15:22:38 2018 +0200

    - Further updates to the DeltaV POC code ....
---
 plc4j/protocols/delta-v/pom.xml                    |  15 +
 .../java/org/apache/plc4x/java/deltav/PoC.java     | 679 +++++++++++++++++----
 .../messages/items/DefaultLongFieldItemTest.java   | 114 ++++
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       |   2 +-
 4 files changed, 681 insertions(+), 129 deletions(-)

diff --git a/plc4j/protocols/delta-v/pom.xml b/plc4j/protocols/delta-v/pom.xml
index 77375c2..bf114cb 100644
--- a/plc4j/protocols/delta-v/pom.xml
+++ b/plc4j/protocols/delta-v/pom.xml
@@ -56,6 +56,21 @@
       <artifactId>commons-codec</artifactId>
       <version>1.11</version>
     </dependency>
+
+    <!-- Elasticsearch dependencies -->
+    <dependency>
+      <groupId>org.elasticsearch</groupId>
+      <artifactId>elasticsearch</artifactId>
+      <version>6.2.4</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.elasticsearch.plugin</groupId>
+      <artifactId>transport-netty4-client</artifactId>
+      <version>6.2.4</version>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/plc4j/protocols/delta-v/src/test/java/org/apache/plc4x/java/deltav/PoC.java b/plc4j/protocols/delta-v/src/test/java/org/apache/plc4x/java/deltav/PoC.java
index d08eaa4..0635acb 100644
--- a/plc4j/protocols/delta-v/src/test/java/org/apache/plc4x/java/deltav/PoC.java
+++ b/plc4j/protocols/delta-v/src/test/java/org/apache/plc4x/java/deltav/PoC.java
@@ -16,33 +16,54 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
+
 package org.apache.plc4x.java.deltav;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import org.apache.commons.codec.binary.Hex;
+import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
+import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
+import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.client.IndicesAdminClient;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.elasticsearch.common.xcontent.XContentType;
+import org.elasticsearch.node.InternalSettingsPreparer;
+import org.elasticsearch.node.Node;
+import org.elasticsearch.node.NodeValidationException;
+import org.elasticsearch.plugins.Plugin;
+import org.elasticsearch.transport.Netty4Plugin;
 import org.pcap4j.core.*;
 import org.pcap4j.packet.UdpPacket;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
+import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 
 public class PoC {
 
-    private static final Logger valueLogger = LoggerFactory.getLogger(PoC.class);
+    private static final Logger logger = LoggerFactory.getLogger(PoC.class);
 
     private static final int SNAPLEN = 65536;
     private static final int READ_TIMEOUT = 10;
 
     private PcapHandle receiveHandle;
+    private Client esClient;
+
+    private List<String> missingNames = new LinkedList<>();
+    private Map<String, String> testpointNames = new HashMap<>();
+    private Map<String, Map<Short, String>> testpointFieldNames = new HashMap<>();
+    private Map<String, Map<Short, Object>> testpointFieldValues = new HashMap<>();
 
     private PoC(String inputPath) throws Exception {
         if(inputPath == null) {
@@ -74,9 +95,6 @@ public class PoC {
         String filterString = "udp port 18507";
         receiveHandle.setFilter(filterString, BpfProgram.BpfCompileMode.OPTIMIZE);
 
-        Map<String, String> names = new HashMap<>();
-        Map<String, Object> values = new HashMap<>();
-
         byte[] timeBytes = ByteBuffer.allocate(8).putLong(System.currentTimeMillis()).array();
         System.out.println("Current Time: " + Hex.encodeHexString(timeBytes));
 
@@ -283,20 +301,260 @@ public class PoC {
                             break;
                         }
                         case 0x1B02:
-                            System.out.println("Hurz");
+                            // 1b 02 00 00 00 00 00 07 03 ac 01 d6 00 04 00 00
+                            // 00 06 00 01 00 00 00 00 00 00 00 00 00 00 00 00
+                            // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                            // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                            // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                            // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                            // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                            // 00 00 00 00 00 00 00 00 01 00 00 00 00 00 32 01
+                            // 39 04 90 17 b9. 02 00 13 47 00 4b 00 22 00 49 00
+                            // 6e 00 69 00 74 00 69 00 61 00 6c 00 69 00 73 00
+                            // 69 00 65 00 72 00 75 00 6e 00 67 00 20 00 2e 00
+                            // 2e 00 2e 00 2e 00 2e 00 20 00 62 00 69 00 74 00
+                            // 74 00 65 00 20 00 77 00 61 00 72 00 74 00 65 00
+                            // 6e 00 00. 03 00 14 00 00 00 1f. 02 00 15 03 00 00.
+                            // 02 00 16 47 00 1d 00 0b 00 57 00 41 00 52 00 54
+                            //---------^
+                            //Last block started: 1 bytes before error and had a size of: 9
+                            //Unexpected code: 47
+                            //
+                            //
+                            // 00 45 00 4e 00 20 00 2e 00 2e 00 2e 00 20 00 00
+                            // 01
                         case 0x0403: {
-                            System.out.println("----------------------------------------------------------------------------------------");
-                            //                        System.out.println(Hex.encodeHexString(udpPacket.getPayload().getRawData()).replaceAll("(.{2})", "$1 ").replaceAll("(.{48})", "$1\n"));
-                            //                        System.out.println("----------------------");
                             // Skip the rest of the header.
                             if(payloadType == 0x1B02) {
-                                buf.skipBytes(123);
+                                buf.skipBytes(118); // 0x76
+
+                                // Opening some detail dialog.
+                                // 1b 02 00 00 00 00 00 07 03 ac 01 d6 00 04 00 00
+                                // 00 06 00 01 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00
+                                // - 01 00 00 00 00 00 32 01 39 04 90 17 b9
+                                // 02 00 13 47 00 4b 00 22 00 49 00 6e 00 69 00 74 00 69 00 61 00 6c 00 69 00 73 00 69 00 65 00 72 00 75 00 6e 00 67 00 20 00 2e 00 2e 00 2e 00 2e 00 2e 00 20 00 62 00 69 00 74 00 74 00 65 00 20 00 77 00 61 00 72 00 74 00 65 00 6e 00 00
+                                // 03 00 14 00 00 00 1f
+                                // 02 00 15 03 00 00
+                                // 02 00 16 47 00 1d 00 0b 00 57 00 41 00 52 00 54 00 45 00 4e 00 20 00 2e 00 2e 00 2e 00 20 00 00
+                                // - 01
+                                //
+                                // 1b 02 00 00 00 00 00 07 03 ad 01 d7 00 04 00 00
+                                // 00 06 00 01 00 06 00 94 00 06 01 37 00 06 02 00
+                                // 00 06 02 f5 00 06 03 98 00 06 04 4d 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00
+                                // - 07 00 00 00 00 00 3f 01 46 04 9d 17 c6
+                                // 02 00 00 76 00 66 05 01 01 00 00 00 06 00 46 00 45 00 48 00 4c 00 45 00 52 00 00 00 3b 00 3b 01 0d 00 00 2a f2 70 c7 be 79 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 01 63 00 7c 0d a6 a2
+                                // 02 00 02 01 00
+                                // 02 00 03 05 01
+                                // 02 00 04 01 01
+                                // 02 00 05 01 00
+                                // - 01 00 00 00 00 00 40 01 47 04 9e 17 c7
+                                // 02 00 00 08 42 48 d5 53
+                                // 02 00 01 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // 02 00 02 01 00
+                                // 02 00 03 76 00 58 05 01 01 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 04 47 00 0b 00 02 00 54 00 49 00 00
+                                // 02 00 05 05 01
+                                // 02 00 06 01 00
+                                // 02 00 07 01 00
+                                // - 01 00 00 00 00 00 41 01 48 04 9f 17 c8
+                                // 02 00 00 01 00
+                                // 02 00 01 01 01
+                                // 02 00 02 08 00 00 00 00
+                                // 02 00 03 24 00 0e 41 a0 00 00 00 00 00 00 05 45 01
+                                // 02 00 04 76 00 7e 05 01 01 00 00 00 07 00 4d 00 49 00 4e 00 5f 00 41 00 4c 00 4d 00 00 00 32 00 32 01 0d 00 00 2a f2 70 c7 21 f3 00 0a 00 4d 00 49 00 4e 00 5f 00 53 00 43 00 48 00 41 00 4c 00 54 00 00 00 36 00 36 00 03 00 00 2a f2 70 c7 21 f6 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 05 01 00
+                                // 02 00 06 47 00 0b 00 02 00 46 00 49 00 00
+                                // 02 00 07 05 01
+                                // - 01 00 00 00 00 00 42 01 49 04 a0 17 c9
+                                // 02 00 00 76 00 58 05 01 01 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 01 08 42 c8 00 00
+                                // 02 00 02 63 00 00 19 c9 9c
+                                // 02 00 03 48 80 01
+                                // 02 00 04 01 00
+                                // 02 00 05 21 80 42 49 1c 72
+                                // 02 00 06 01 00
+                                // 02 00 07 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // 02 00 08 47 00 0d 00 03 00 54 00 49 00 43 00 00
+                                // 02 00 09 08 00 00 00 00
+                                // 02 00 0a 01 00
+                                // 02 00 0b 08 42 49 1c 72
+                                // 02 00 0c 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // 02 00 0d 21 c3 42 17 aa ab
+                                // 02 00 0e 63 00 00 19 9c 7b
+                                // 02 00 0f 01 00
+                                // 02 00 10 05 01
+                                // - 01 00 00 00 00 00 43 01 4a 04 a1 17 ca
+                                // 02 00 00 05 01
+                                // 02 00 01 76 00 58 05 01 01 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 02 01 00
+                                // 02 00 03 01 00
+                                // 02 00 04 08 42 49 1c 72
+                                // 02 00 05 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // 02 00 06 01 00
+                                // 02 00 07 47 00 0b 00 02 00 54 00 49 00 00
+                                // - 01 00 00 00 00 00 44 01 4b 04 a2 17 cb
+                                // 02 00 00 76 00 7e 05 01 01 00 00 00 0a 00 4d 00 41 00 58 00 5f 00 53 00 43 00 48 00 41 00 4c 00 54 00 00 00 2e 00 2e 00 03 00 00 2a f2 71 9b 0f 2c 00 07 00 4d 00 41 00 58 00 5f 00 41 00 4c 00 4d 00 00 00 29 00 29 00 03 00 00 2a f2 71 9b 0f 2b ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 01 01 00
+                                // 02 00 02 21 80 3c ce e0 00
+                                // 02 00 03 01 00
+                                // 02 00 04 05 01
+                                // 02 00 05 01 01
+                                // 02 00 06 01 01
+                                // 02 00 07 01 00
+                                // - 01 00 00 00 00 00 45 01 4c 04 a3 17 cc
+                                // 02 00 00 01 00
+                                // 02 00 01 01 00
+                                // 02 00 02 05 01
+                                // - 01
+                                //
+                                // 1b 02 00 00 00 00 00 07 03 ae 01 d8 00 04 00 00
+                                // 00 06 00 01 00 06 00 be 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 <!-- No testpoint id?!?
+                                // 02 00 00 00 00 00 4b 01 52 04 a9 17 d2 02 00 00 01 00
+                                // 02 00 01 76 00 86 05 01 01 00 00 00 0a 00 56 00 45 00 52 00 52 00 49 00 45 00 47 00 45 00 4c 00 54 00 00 00 54 00 54 00 04 00 00 2a f2 71 97 40 42 00 0b 00 4d 00 49 00 4e 00 5f 00 41 00 5f 00 41 00 4c 00 4d 00 5f 00 59 00 00 00 35 00 35 00 03 00 00 2a f2 71 96 46 47 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 02 01 00
+                                // 02 00 03 01 00
+                                // 02 00 04 21 80 00 00 00 00
+                                // 02 00 05 05 01
+                                // 02 00 06 01 00
+                                // 02 00 07 01 01
+                                // - 01 00 00 00 00 00 4c 01 53 04 aa 17 d3
+                                // 02 00 00 07 00 00 00 00
+                                // 02 00 01 05 01
+                                // 02 00 02 76 00 58 05 01 01 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 03 01 01
+                                // 02 00 04 01 01
+                                // 02 00 05 01 00
+                                // 02 00 06 01 00
+                                // 01 b2
+                                // 29
+                                //
+                                // 1b 02 00 00 00 00 00 07 03 af 01 d9 00 04 00 00
+                                // 00 06 00 01 00 06 00 af 00 06 01 42 00 06 02 3d
+                                // 00 06 02 d0 00 06 03 63 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00
+                                // - 06 00 00 00 00 00 45 01 4c 04 a3 17 cc
+                                // 02 00 03 76 00 86 05 01 01 00 00 00 0a 00 56 00 45 00 52 00 52 00 49 00 45 00 47 00 45 00 4c 00 54 00 00 00 54 00 54 00 04 00 00 2a f2 70 d0 7b d3 00 0b 00 4d 00 49 00 4e 00 5f 00 41 00 5f 00 41 00 4c 00 4d 00 5f 00 59 00 00 00 35 00 35 00 03 00 00 2a f1 c7 5e 3e a7 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 04 01 00
+                                // 02 00 05 01 01
+                                // 02 00 06 21 80 00 00 00 00
+                                // 02 00 07 01 00
+                                // - 01 00 00 00 00 00 46 01 4d 04 a4 17 cd
+                                // 02 00 00 63 01 7c 0d a6 d7
+                                // 02 00 01 01 00
+                                // 02 00 02 05 01
+                                // 02 00 03 76 00 66 05 01 01 00 00 00 06 00 46 00 45 00 48 00 4c 00 45 00 52 00 00 00 52 00 52 01 0d 00 00 2a f1 c7 f0 48 88 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 04 01 01
+                                // 02 00 05 01 00
+                                // - 01 00 00 00 00 00 47 01 4e 04 a5 17 ce
+                                // 02 00 00 01 00
+                                // 02 00 01 47 00 0d 00 03 00 54 00 49 00 43 00 00
+                                // 02 00 02 76 00 58 05 01 01 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 03 01 00
+                                // 02 00 04 63 01 00 19 c9 9c
+                                // 02 00 05 08 42 4c 00 00
+                                // 02 00 06 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // 02 00 07 21 c0 42 95 fe c7
+                                // 02 00 08 08 42 48 00 00
+                                // 02 00 09 01 00
+                                // 02 00 0a 05 01
+                                // 02 00 0b 48 80 01
+                                // 02 00 0c 63 01 00 19 9c 7b
+                                // 02 00 0d 01 00
+                                // 02 00 0e 21 80 42 49 1c 72
+                                // 02 00 0f 01 00
+                                // 02 00 10 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // 02 00 11 21 80 42 95 fe c7
+                                // - 01 00 00 00 00 00 48 01 4f 04 a6 17 cf
+                                // 02 00 00 01 00
+                                // 02 00 01 05 01
+                                // 02 00 02 76 00 66 05 01 01 00 00 00 06 00 46 00 45 00 48 00 4c 00 45 00 52 00 00 00 52 00 52 01 0d 00 00 2a f2 70 c7 30 06 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 03 01 00
+                                // 02 00 04 01 00
+                                // 02 00 05 63 00 7c 0d a6 d7
+                                // - 01 00 00 00 00 00 49 01 50 04 a7 17 d0
+                                // 02 00 00 01 00
+                                // 02 00 01 76 00 66 05 01 01 00 00 00 06 00 46 00 45 00 48 00 4c 00 45 00 52 00 00 00 52 00 52 01 0d 00 00 2a f1 c8 bc f6 68 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 02 01 00
+                                // 02 00 03 01 00
+                                // 02 00 04 05 01
+                                // 02 00 05 63 00 7c 0d a6 d7
+                                // - 01 00 00 00 00 00 4a 01 51 04 a8 17 d1
+                                // 02 00 00 01 00
+                                // 02 00 01 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // 02 00 02 47 00 0b 00 02 00 54 00 49 00 00
+                                // 02 00 03 05 01
+                                // 02 00 04 76 00 58 05 01 01 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                // 02 00 05 07 00 00 00 00
+                                // 02 00 06 01 00
+                                // 02 00 07 21 80 42 48 00 00
+                                // - 01
+                                //
+                                // 1b 02 00 00 00 00 00 07 01 ed 00 16 00 04 00 00
+                                // 00 06 00 01 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00
+                                // - 01 00 00 00 00 00 40 01 47 04 9e 17 c7
+                                // 03 00 08 00 00 00 1f
+                                // - 01
+                                //
+                                // 1b 02 00 00 00 00 00 07 01 ee 00 17 00 04 00 00
+                                // 00 06 00 01 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00
+                                // - 01 00 00 00 00 00 40 01 47 04 9e 17 c7
+                                // 02 00 09 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // - 01
+                                //
+                                // 1b 02 00 00 00 00 00 07 01 ef 00 18 00 04 00 00
+                                // 00 06 00 01 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+                                // 00 00 00 00 00 00 00 00
+                                // - 01 00 00 00 00 00 40 01 47 04 9e 17 c7
+                                // 02 00 0a 24 00 0e 43 48 00 00 c2 20 00 00 03 e9 01
+                                // - 01
                             } else {
-                                buf.skipBytes(31);
+                                buf.skipBytes(0x1A);
+//                                outputPacket(buf);
                             }
-                            byte[] blockId = new byte[4];
-                            buf.readBytes(blockId);
-                            buf.skipBytes(4);
+                            buf.skipBytes(5);
+                            byte[] testpointId = new byte[8];
+                            buf.readBytes(testpointId, 4, 4);
+                            buf.readBytes(testpointId, 0, 4);
+                            String testpoint = Hex.encodeHexString(testpointId);
 
                             int endOfLastBlock = buf.readerIndex();
                             int lastBlockSize = 0;
@@ -304,22 +562,25 @@ public class PoC {
                                 // First check the code of the next block ...
                                 switch (code) {
                                     case (byte) 0x01: {
+                                        // First make sure the current testpoints state is flushed to the db.
+                                        flushTestpointValues(testpoint);
+                                        // 0x01 blocks for 0x1B02 messages contain 4 bytes more.
                                         if(payloadType == 0x1B02) {
                                             buf.skipBytes(4);
                                         }
-                                        buf.readBytes(blockId);
-                                        buf.skipBytes(4);
-                                        outputDetectedBlock("-- Switch Context (" +  Hex.encodeHexString(blockId) + ")", buf, endOfLastBlock);
+                                        if(buf.readableBytes() < 8) {
+                                            return;
+                                        }
+                                        // Now switch to the next testpoint.
+                                        buf.readBytes(testpointId, 4, 4);
+                                        buf.readBytes(testpointId, 0, 4);
+                                        testpoint = Hex.encodeHexString(testpointId);
                                         break;
                                     }
                                     case (byte) 0x02: {
                                         short fieldId = buf.readShort();
                                         byte type = buf.readByte();
-                                        String id = Hex.encodeHexString(blockId) + "-" + fieldId;
-                                        String name = names.getOrDefault(id, id);
-                                        if(!names.containsKey(id)) {
-                                            System.out.println("Missing variable");
-                                        }
+
                                         // Now inspect the block content ...
                                         switch (type) {
                                             case (byte) 0x01: {
@@ -336,20 +597,28 @@ public class PoC {
                                                     default:
                                                         System.out.println("Unknown second byte for boolean value 0x" + Hex.encodeHexString(new byte[]{booleanByteValue}));
                                                 }
-                                                outputDetectedBlock(name + " (BOOL)", booleanValue, null, buf, endOfLastBlock);
-                                                if (!values.containsKey(id)) {
-                                                    valueLogger.info(String.format("Variable with id: %s set to: %b", id, booleanValue));
-                                                    values.put(id, booleanValue);
-                                                } else if (!values.get(id).equals(booleanValue)) {
-                                                    boolean oldValue = (boolean) values.get(id);
-                                                    valueLogger.info(String.format("Variable with id: %s changed from: %b to: %b", id, oldValue, booleanValue));
-                                                    values.put(id, booleanValue);
-                                                }
+                                                updateValue(testpoint, fieldId, booleanValue);
                                                 break;
                                             }
                                             case (byte) 0x03: {
-                                                buf.skipBytes(5);
-                                                outputDetectedBlock(name + " (Unknown)", buf, endOfLastBlock);
+                                                // Note:
+                                                // - Name suggests a time-related field "A/ALA_T9002_Y/RESTZEIT"
+                                                //
+                                                // Found Blocks:
+                                                // 02 00 15 03 00 00
+                                                buf.skipBytes(2);
+//                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown)", buf, endOfLastBlock);
+                                                break;
+                                            }
+                                            case (byte) 0x04: {
+                                                // Notes:
+                                                // - Refers to variable "C/MERROR_MOD"
+                                                // - seems to be a 4 byte integer value.
+                                                // Found Blocks:
+                                                // 02 00 19 04 00 00 01 08
+                                                // 02 00 19 04 00 00 00 00
+                                                buf.skipBytes(4);
+//                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown)", buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0x05: {
@@ -358,37 +627,27 @@ public class PoC {
                                                 //
                                                 // Found Block:
                                                 // 02 00 0c 05: 00
-                                                // 02 00 0c 05: 00
-                                                // 02 00 0c 05: 00
                                                 buf.skipBytes(1);
-                                                outputDetectedBlock(name + " (Unknown (BA))", buf, endOfLastBlock);
+//                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown (BA))", buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0x06: {
                                                 // Possibly Parse 16 bit int?
                                                 short shortValue = buf.readShort();
-                                                outputDetectedBlock(name + " ((U)INT)", shortValue, null, buf, endOfLastBlock);
+                                                updateValue(testpoint, fieldId, shortValue);
                                                 break;
                                             }
                                             case (byte) 0x07: {
                                                 // Possibly Parse 32 bit int?
                                                 int intValue = buf.readInt();
-                                                outputDetectedBlock(name + " ((U)DINT)", intValue, null, buf, endOfLastBlock);
+                                                updateValue(testpoint, fieldId, intValue);
                                                 break;
                                             }
                                             case (byte) 0x08: {
                                                 // Parse float
                                                 float floatValue = buf.readFloat();
-                                                floatValue = Math.round(floatValue * 100.0f) / 100.0f;
-                                                outputDetectedBlock(name + " (REAL)", floatValue, null, buf, endOfLastBlock);
-                                                if (!values.containsKey(id)) {
-                                                    valueLogger.info(String.format("Variable with id: %s set to: %f", id, floatValue));
-                                                    values.put(id, floatValue);
-                                                } else if (!values.get(id).equals(floatValue)) {
-                                                    float oldValue = (float) values.get(id);
-                                                    valueLogger.info(String.format("Variable with id: %s changed from: %f to: %f", id, oldValue, floatValue));
-                                                    values.put(id, floatValue);
-                                                }
+                                                //floatValue = Math.round(floatValue * 100.0f) / 100.0f;
+                                                updateValue(testpoint, fieldId, floatValue);
                                                 break;
                                             }
                                             case (byte) 0x21: {
@@ -396,16 +655,8 @@ public class PoC {
                                                 byte param = buf.readByte();
                                                 decodeParam(param);
                                                 float floatValue = buf.readFloat();
-                                                floatValue = Math.round(floatValue * 100.0f) / 100.0f;
-                                                outputDetectedBlock(name + " (REAL(P))", floatValue, param, buf, endOfLastBlock);
-                                                if (!values.containsKey(id)) {
-                                                    valueLogger.info(String.format("Variable with id: %s set to: %f with params %s", id, floatValue, Hex.encodeHexString(new byte[]{param})));
-                                                    values.put(id, floatValue);
-                                                } else if (!values.get(id).equals(floatValue)) {
-                                                    float oldValue = (float) values.get(id);
-                                                    valueLogger.info(String.format("Variable with id: %s changed from: %f to: %f with params %s", id, oldValue, floatValue, Hex.encodeHexString(new byte[]{param})));
-                                                    values.put(id, floatValue);
-                                                }
+                                                //floatValue = Math.round(floatValue * 100.0f) / 100.0f;
+                                                updateValue(testpoint, fieldId, floatValue);
                                                 break;
                                             }
                                             case (byte) 0x22: {
@@ -424,15 +675,7 @@ public class PoC {
                                                     default:
                                                         System.out.println("Unknown second byte for boolean value 0x" + Hex.encodeHexString(new byte[]{booleanByteValue}));
                                                 }
-                                                outputDetectedBlock(name + " (BOOL(P))", booleanValue, param, buf, endOfLastBlock);
-                                                if (!values.containsKey(id)) {
-                                                    valueLogger.info(String.format("Variable with id: %s set to: %b with params %s", id, booleanValue, Hex.encodeHexString(new byte[]{param})));
-                                                    values.put(id, booleanValue);
-                                                } else if (!values.get(id).equals(booleanValue)) {
-                                                    boolean oldValue = (boolean) values.get(id);
-                                                    valueLogger.info(String.format("Variable with id: %s changed from: %b to: %b with params %s", id, oldValue, booleanValue, Hex.encodeHexString(new byte[]{param})));
-                                                    values.put(id, booleanValue);
-                                                }
+                                                updateValue(testpoint, fieldId, booleanValue);
                                                 break;
                                             }
                                             case (byte) 0x24: {
@@ -456,17 +699,18 @@ public class PoC {
                                                 long val2 = buf.readUnsignedInt();
                                                 long val3 = buf.readUnsignedInt();
                                                 byte flag = buf.readByte();
-                                                outputDetectedBlock(name + " (Trend Scaling) - " + val1 + ", " + val2 + ", " + val3 + ", " + flag, buf, endOfLastBlock);
+//                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Trend Scaling) - " + val1 + ", " + val2 + ", " + val3 + ", " + flag, buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0x25: {
                                                 buf.skipBytes(6);
-                                                outputDetectedBlock(name + " (Unknown)", buf, endOfLastBlock);
+                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown)", buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0x47: {
                                                 // NOTE:
                                                 // - Name of the variable "A/ALA_T9002_Y/SCHRITTTEXT_ALT", "A/ALA_T9002_Y/SCHRITTTEXT"
+                                                // - Seems the most important variable name however is "GF_NAME" which seems to give the testpoint it's name
                                                 // - Seems to be a text-value
                                                 // - The longer UTF-16 Text seems to start at byte 4 and ends at 0x0000
                                                 // - The shorter Text seems to come after some bytes after the longer text and again end with 0x0000
@@ -478,9 +722,10 @@ public class PoC {
                                                 // 00 6c 00 69 00 73 00 69 00 65 00 72 00 75 00 6e
                                                 // 00 67 00 20 00 2e 00 2e 00 2e 00 2e 00 2e 00 20
                                                 // 00 62 00 69 00 74 00 74 00 65 00 20 00 77 00 61
-                                                // 00 72 00 74 00 65 00 6e 00 00 02 00 67 47 00 1d
-                                                // 00 0b 00 57 00 41 00 52 00 54 00 45 00 4e 00 20
-                                                // 00 2e 00 2e 00 2e 00 20 00 00
+                                                // 00 72 00 74 00 65 00 6e 00 00
+                                                //
+                                                // 02 00 67 47 00 1d 00 0b 00 57 00 41 00 52 00 54
+                                                // 00 45 00 4e 00 20 00 2e 00 2e 00 2e 00 20 00 00
                                                 // Decoded:
                                                 // K"Initialisierung ..... bitte wartenȀ杇WARTEN ...
                                                 //
@@ -490,11 +735,28 @@ public class PoC {
                                                 // Name: DYN_BESCH1
                                                 // 02 00 02 47 00 0b 00 02 00 56 00 4c 00 00
                                                 //
-                                                short val = buf.readShort();
-                                                while (val != 0x0000) {
-                                                    val = buf.readShort();
+                                                // Name: DYN_BESCH1
+                                                // 02 00 04 47 00 07 00 00 00 00
+                                                //
+                                                // It seems the parameter provides the complete length of the block in bytes
+                                                // (including the final 0x0000 and the type and size indicator.
+                                                short numBytes = (short) (buf.readShort() - 7);
+                                                // This seems to be some sort of flag ...
+                                                short flag = buf.readShort();
+                                                byte[] bytes = new byte[numBytes];
+                                                buf.readBytes(bytes);
+                                                // Should be the trailing 0x0000
+                                                buf.skipBytes(2);
+                                                String text = new String(bytes, StandardCharsets.UTF_16);
+                                                if(flag == (short) 9) {
+                                                    if(!testpointNames.containsKey(testpoint)) {
+                                                        testpointNames.put(testpoint, text);
+                                                    }
+                                                    if(!testpointNames.get(testpoint).equals(text)) {
+                                                        System.out.println("Guess I was wrong");
+                                                    }
                                                 }
-                                                outputDetectedBlock(name + " (Unknown)", buf, endOfLastBlock);
+//                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Typed Text)", text, null, buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0x48: {
@@ -508,7 +770,7 @@ public class PoC {
                                                 // 02 00 10 48: 80 00
                                                 byte[] tmp = new byte[2];
                                                 buf.readBytes(tmp);
-                                                outputDetectedBlock(name + " (Unknown)", buf, endOfLastBlock);
+                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown)", buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0x49: {
@@ -520,29 +782,24 @@ public class PoC {
                                                 byte param = buf.readByte();
                                                 decodeParam(param);
                                                 int intValue = buf.readInt();
-                                                if (!values.containsKey(id)) {
-                                                    valueLogger.info(String.format("Variable with id: %s set to: %d with params %s", id, intValue, Hex.encodeHexString(new byte[]{param})));
-                                                    values.put(id, intValue);
-                                                } else if (!values.get(id).equals(intValue)) {
-                                                    int oldValue = (int) values.get(id);
-                                                    valueLogger.info(String.format("Variable with id: %s changed from: %d to: %d with params %s", id, oldValue, intValue, Hex.encodeHexString(new byte[]{param})));
-                                                    values.put(id, intValue);
-                                                }
-                                                outputDetectedBlock(name + " ((U)DINT(P))", intValue, param, buf, endOfLastBlock);
+                                                updateValue(testpoint, fieldId, intValue);
                                                 break;
                                             }
                                             case (byte) 0x5B: {
                                                 // No idea what this type is.
                                                 buf.readShort();
-                                                outputDetectedBlock(name + " (Unknown)", buf, endOfLastBlock);
+                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown)", buf, endOfLastBlock);
+                                                break;
                                             }
                                             case (byte) 0x63: {
                                                 // NOTE:
                                                 // - Name of the variable "IST_FW_KURZ"
+                                                // - Looks like a 4-byte value followed by a (P)aram byte
+                                                // Found blocks:
+                                                // 02 00 06 63: 64 00 19 b9 88
                                                 byte[] tmp = new byte[5];
                                                 buf.readBytes(tmp);
-                                                //                                            System.out.println(String.format("Got 0x63 type for id %s with content: %s", blockId, Hex.encodeHexString(tmp)));
-                                                outputDetectedBlock(name + " (Unknown)", buf, endOfLastBlock);
+//                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown)", buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0x75: {
@@ -551,11 +808,17 @@ public class PoC {
                                                 // - Exactly 3 blocks of this type with extremely similar content is being sent every 60 seconds for the ids: 17, 16 and 34
                                                 //                            001600280d0100000000280015f360000000000100
                                                 //                            001600280d0100000000280015f360000000000100
+                                                // Found blocks:
+                                                // BIN_ALM
+                                                // 02 00 3a 75 00 16 00 18 0d 01 00 00 18 00 18 00 15 f3 60 00 15 e4 10 00 01
+                                                //
+                                                // STOERUNG
+                                                // 02 00 3b 75 00 16 00 39 0f 01 00 00 39 00 39 00 15 f3 60 00 00 00 00 01 00
+
                                                 int size = "001600280d0100000000280015f360000000000100".length() / 2; //21
                                                 byte[] tmp = new byte[size];
                                                 buf.readBytes(tmp);
-                                                //                                            System.out.println(String.format("Got 0x75 type for id %s with content: %s", blockId, Hex.encodeHexString(tmp)));
-                                                outputDetectedBlock(name + " (Unknown)", buf, endOfLastBlock);
+//                                                 outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown)", buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0x76: {
@@ -564,19 +827,58 @@ public class PoC {
                                                 // - Possibly a data-structure is returned which contains all information about a modules alarms
                                                 //   The last 4 bytes (maybe more) seem to be an always increasing value
                                                 //   (Maybe some sort of timestamp)
-                                                short length = (short) (buf.readShort() - 3);
-                                                byte[] tmp = new byte[length];
-                                                buf.readBytes(tmp);
-                                                String hexBlock = Hex.encodeHexString(tmp).replaceAll("(.{32})", "$1\n");
-                                                //                                            System.out.println(String.format("Got 0x76 type for id %s with content: \n%s", blockId, hexBlock));
-                                                outputDetectedBlock(name + " (Unknown (Alarms))", buf, endOfLastBlock);
+                                                // Found blocks:
+                                                // 02 00 04 76 00 7a 05 01 01 00 00 00 08 00 53 00
+                                                // 54 00 4f 00 45 00 52 00 55 00 4e 00 47 00 00 00
+                                                // 39 00 39 01 0f 00 00 2a f4 8e c7 c6 36 00 07 00
+                                                // 42 00 49 00 4e 00 5f 00 41 00 4c 00 4d 00 00 00
+                                                // 18 00 18 00 03 00 00 2a f4 8e c3 e5 2e ff ff 00
+                                                // 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00
+                                                // 00 00 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00
+                                                // 00 00 00 00 ff 00 00 00 00 00 00 00 00
+                                                //
+                                                // 02 00 04 76 00 58 05 01 01 00 00 ff ff 00 00 00
+                                                // 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00
+                                                // 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00
+                                                // 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00
+                                                // 00 00 ff 00 00 00 00 00 00 00 00 ff ff 00 00 00
+                                                // 00 00 ff 00 00 00 00 00 00 00 00
+
+                                                short blockLength = (short) (buf.readShort() - 3);
+                                                buf.skipBytes(blockLength);
+                                                /*int start = buf.readerIndex();
+                                                buf.skipBytes(5);
+                                                short textLength = buf.readShort();
+                                                if(textLength != (short) 0xFFFF) {
+                                                    byte[] tmp = new byte[textLength * 2];
+                                                    buf.readBytes(tmp);
+                                                    String text1 = new String(tmp, StandardCharsets.UTF_16);
+                                                } else {
+                                                    outputPacket(buf);
+                                                }
+                                                buf.skipBytes(2);
+                                                buf.skipBytes(14);
+                                                textLength = buf.readShort();
+                                                if(textLength != (short) 0xFFFF) {
+                                                    byte[] tmp = new byte[textLength * 2];
+                                                    buf.readBytes(tmp);
+                                                    buf.skipBytes(2);
+                                                    String text2 = new String(tmp, StandardCharsets.UTF_16);
+                                                } else {
+                                                    outputPacket(buf);
+                                                }
+
+                                                int curPos = buf.readerIndex();
+                                                buf.skipBytes(blockLength - (curPos - start));
+                                                */
+//                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown (Alarms))", buf, endOfLastBlock);
                                                 break;
                                             }
                                             case (byte) 0xF6: {
                                                 // TODO: Potentially obsolete ...
                                                 // Only seen in 0x0102 blocks
                                                 buf.skipBytes(4);
-                                                outputDetectedBlock(name + " (Unknown)", buf, endOfLastBlock);
+                                                outputDetectedBlock(getTestpointName(testpoint, fieldId) + " (Unknown)", buf, endOfLastBlock);
                                                 break;
                                             }
                                             default: {
@@ -865,37 +1167,29 @@ public class PoC {
                             // ff ff
                             // 04
 
-
-
                             // Skip the header part.
-                            buf.skipBytes(118);
-                            for (byte code = buf.readByte(); buf.readableBytes() > 2; code = buf.readByte()) {
-                                switch (code) {
-                                    case (byte) 0x04: {
-                                        // Skip the 0x04 block and continue reading the variables.
-                                        buf.skipBytes(3);
-                                        byte[] blockId = new byte[4];
-                                        buf.readBytes(blockId);
-                                        buf.skipBytes(4);
-                                        // The first block is part of the id of an address.
-                                        for (short fieldId = buf.readShort(); fieldId != (short) 0xFFFF; fieldId = buf.readShort()) {
-                                            // This is followed by a short value providing the length of the following
-                                            // string.
-                                            short length = buf.readShort();
-                                            // Then comes the string, each character encoded as two bytes.
-                                            byte[] bytes = new byte[length * 2];
-                                            buf.readBytes(bytes);
-                                            buf.skipBytes(2);
-                                            String address = new String(bytes, StandardCharsets.UTF_16);
+                            buf.skipBytes(0x76);
+                            while(buf.readableBytes() > 12) {
+                                byte[] testpointId = new byte[8];
+                                buf.readBytes(testpointId);
+                                buf.skipBytes(4);
 
-                                            // Save the name for later.
-                                            names.put(Hex.encodeHexString(blockId) + "-" + fieldId, address);
-                                        }
-                                        break;
-                                    }
-                                    default: {
-                                        System.out.println("Error");
+                                // The first block is part of the id of an address.
+                                for (short fieldId = buf.readShort(); fieldId != (short) 0xFFFF; fieldId = buf.readShort()) {
+                                    // This is followed by a short value providing the length of the following
+                                    // string.
+                                    short length = buf.readShort();
+                                    // Then comes the string, each character encoded as two bytes.
+                                    byte[] bytes = new byte[length * 2];
+                                    buf.readBytes(bytes);
+                                    buf.skipBytes(2);
+                                    String address = new String(bytes, StandardCharsets.UTF_16);
+
+                                    String tespoint = Hex.encodeHexString(testpointId);
+                                    if(!testpointFieldNames.containsKey(tespoint)) {
+                                        testpointFieldNames.put(tespoint, new HashMap<>());
                                     }
+                                    testpointFieldNames.get(tespoint).put(fieldId, address);
                                 }
                             }
                             break;
@@ -1105,8 +1399,25 @@ public class PoC {
             } catch (Exception e) {
                 e.printStackTrace();
             }
+
+            if((inputPath != null) && !testpointFieldNames.isEmpty()) {
+                try {
+                    TimeUnit.MILLISECONDS.sleep(10);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
         };
 
+        // Start an Elasticsearch node.
+        Node esNode = startElasticsearchNode();
+        esClient = esNode.client();
+        System.out.println("Started Elasticsearch node on port 9200");
+
+        // Make sure the indexes exist prior to writing to them.
+        prepareIndexes(esClient);
+
+        // Start the packet capturing.
         ExecutorService pool = Executors.newScheduledThreadPool(2);
         pool.execute(() -> {
             try {
@@ -1117,6 +1428,117 @@ public class PoC {
         });
     }
 
+    private static class MyNode extends Node {
+        private MyNode(Settings preparedSettings, Collection<Class<? extends Plugin>> classpathPlugins) {
+            super(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), classpathPlugins);
+        }
+    }
+
+    private Node startElasticsearchNode() {
+        try {
+            Node node = new MyNode(Settings.builder()
+                .put("transport.type", "netty4")
+                .put("http.type", "netty4")
+                .put("http.enabled", "true")
+                .put("path.home", "elasticsearch-data")
+                .build(), Collections.singletonList(Netty4Plugin.class));
+            node.start();
+            return node;
+        } catch (NodeValidationException e) {
+            throw new RuntimeException("Could not start Elasticsearch node.", e);
+        }
+    }
+
+    private void prepareIndexes(Client esClient) {
+        IndicesAdminClient indicesAdminClient = esClient.admin().indices();
+
+        // Check if the factory-data index exists and create it, if it doesn't.
+        IndicesExistsRequest factoryDataIndexExistsRequest =
+            indicesAdminClient.prepareExists("delta-v-testpoints").request();
+        if(!indicesAdminClient.exists(factoryDataIndexExistsRequest).actionGet().isExists()) {
+            CreateIndexRequest createIndexRequest = new CreateIndexRequest("delta-v-testpoints");
+            createIndexRequest.mapping("Testpoint",
+                "{\n" +
+                    "            \"properties\": {\n" +
+                    "                \"time\": {\n" +
+                    "                    \"type\": \"date\"\n" +
+                    "                },\n" +
+                    "                \"testpoint\": {\n" +
+                    "                    \"type\": \"keyword\"\n" +
+                    "                }\n" +
+                    "            }\n" +
+                    "        }", XContentType.JSON);
+            CreateIndexResponse createIndexResponse = indicesAdminClient.create(createIndexRequest).actionGet();
+            if(!createIndexResponse.isAcknowledged()) {
+                throw new RuntimeException("Could not create index 'delta-v-messstellen'");
+            }
+        }
+    }
+
+    private String getTestpointName(String testpointId, Short fieldId) {
+        if(testpointFieldNames.containsKey(testpointId)) {
+            return testpointFieldNames.get(testpointId).get(fieldId);
+        }
+        return "-unknown-";
+    }
+
+    private Object getTestpointValue(String testpointId, Short fieldId) {
+        if(testpointFieldValues.containsKey(testpointId)) {
+            return testpointFieldValues.get(testpointId).get(fieldId);
+        }
+        return null;
+    }
+
+    /**
+     * Updates a single field value for a given testpoint.
+     *
+     * @param testpointId id of the testpoint the field belongs to.
+     * @param fieldId id of the field.
+     * @param newValue value the field is set to.
+     */
+    private void updateValue(String testpointId, Short fieldId, Object newValue) {
+        if(!testpointFieldValues.containsKey(testpointId)) {
+            testpointFieldValues.put(testpointId, new HashMap<>());
+        }
+        testpointFieldValues.get(testpointId).put(fieldId, newValue);
+    }
+
+    /**
+     * Writes all current values for a fiven testpoint to the database.
+     *
+     * @param testpointId id of the testpoint.
+     */
+    private void flushTestpointValues(String testpointId) {
+        // If we don't have any values yet, no need to flush
+        if(!testpointFieldValues.containsKey(testpointId)) {
+            return;
+        }
+        // If we don't have a name for the testpoint, we shouldn't flush
+        if(!testpointNames.containsKey(testpointId)) {
+            missingNames.add(testpointId);
+            return;
+        }
+
+        String testpointName = testpointNames.get(testpointId);
+        try {
+            // Prepare the JSON for of the data.
+            XContentBuilder testpointJson = XContentFactory.jsonBuilder()
+                .startObject()
+                .field("time", Calendar.getInstance().getTimeInMillis())
+                .field("testpoint", testpointName);
+            Map<Short, Object> values = testpointFieldValues.get(testpointId);
+            for (Map.Entry<Short, Object> fieldValues : values.entrySet()) {
+                testpointJson.field(getTestpointName(testpointId, fieldValues.getKey()), fieldValues.getValue());
+            }
+            testpointJson.endObject();
+
+            // Store it in Elastic
+            esClient.prepareIndex("delta-v-testpoints", "Testpoint").setSource(testpointJson).get();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
     protected void outputDetectedBlock(String name, ByteBuf byteBuf, int endOfLastBlock) {
         outputDetectedBlock(name, null, null, byteBuf, endOfLastBlock);
     }
@@ -1166,6 +1588,7 @@ public class PoC {
     private void decodeParam(byte param) {
         switch (param) {
             case (byte) 0x00: // 00000000
+            case (byte) 0x08: // 00001000
             case (byte) 0x88: // 10001000
             case (byte) 0x84: // 10000100
             case (byte) 0xC3: // 11000011
diff --git a/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItemTest.java b/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItemTest.java
new file mode 100644
index 0000000..efa6bd7
--- /dev/null
+++ b/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItemTest.java
@@ -0,0 +1,114 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+package org.apache.plc4x.java.base.messages.items;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class DefaultLongFieldItemTest {
+
+    DefaultLongFieldItem SUT;
+
+    @BeforeEach
+    void setUp() {
+        SUT = new DefaultLongFieldItem(0L);
+    }
+
+    @AfterEach
+    void tearDown() {
+    }
+
+    @Test
+    void getObject() {
+    }
+
+    @Test
+    void isValidBoolean() {
+    }
+
+    @Test
+    void getBoolean() {
+    }
+
+    @Test
+    void isValidByte() {
+    }
+
+    @Test
+    void getByte() {
+    }
+
+    @Test
+    void isValidShort() {
+    }
+
+    @Test
+    void getShort() {
+    }
+
+    @Test
+    void isValidInteger() {
+    }
+
+    @Test
+    void getInteger() {
+    }
+
+    @Test
+    void isValidBigInteger() {
+    }
+
+    @Test
+    void getBigInteger() {
+    }
+
+    @Test
+    void isValidLong() {
+    }
+
+    @Test
+    void getLong() {
+    }
+
+    @Test
+    void isValidFloat() {
+    }
+
+    @Test
+    void getFloat() {
+    }
+
+    @Test
+    void isValidDouble() {
+    }
+
+    @Test
+    void getDouble() {
+    }
+
+    @Test
+    void isValidBigDecimal() {
+    }
+
+    @Test
+    void getBigDecimal() {
+    }
+}
\ No newline at end of file
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
index e2963d3..43c6d44 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
@@ -297,7 +297,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     int numBytes = fieldItem.getNumberOfValues() * 4;
                     ByteBuffer buffer = ByteBuffer.allocate(numBytes);
                     for (int i = 0; i < fieldItem.getNumberOfValues(); i++) {
-                        buffer.putInt((int) (double) fieldItem.getDouble(i));
+                        buffer.putInt((int) (long) fieldItem.getLong(i));
                     }
                     byteData = buffer.array();
                     break;