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

[plc4x] 17/19: Test of wireshark frames.

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

ldywicki pushed a commit to branch feature/socketcan
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 5d1e10c2c024a0424a8ee8b0d9669c1b71bd2f27
Author: Ɓukasz Dywicki <lu...@code-house.org>
AuthorDate: Mon Sep 7 13:18:29 2020 +0200

    Test of wireshark frames.
---
 .../src/main/resources/protocols/can/canopen.mspec | 243 +++++++++++++++---
 .../plc4x/java/can/helper/CANOpenHelper.java       |  15 +-
 .../java/can/protocol/CANOpenProtocolLogic.java    |  26 +-
 .../plc4x/java/can/CANOpenWiresharkTest.java       |  30 +++
 .../testsuite/CANOpenPayloadTestSuite.xml          | 130 +++++-----
 .../testsuite/CANOpenWiresharkTestSuite.xml        | 278 +++++++++++++++++++++
 6 files changed, 616 insertions(+), 106 deletions(-)

diff --git a/protocols/can/src/main/resources/protocols/can/canopen.mspec b/protocols/can/src/main/resources/protocols/can/canopen.mspec
index bb825f3..e5e0fe1 100644
--- a/protocols/can/src/main/resources/protocols/can/canopen.mspec
+++ b/protocols/can/src/main/resources/protocols/can/canopen.mspec
@@ -36,7 +36,7 @@
 ]
 
 [enum uint 8 'NMTStateRequest'
-    ['0x01' OPERATIONAL]
+    ['0x01' START]
     ['0x02' STOP]
     ['0x80' PRE_OPERATIONAL]
     ['0x81' RESET_NODE]
@@ -58,7 +58,7 @@
             [simple uint 7 'node']
         ]
         ['CANOpenService.TIME' CANOpenTimeSynchronization
-            [simple TimeOfDay 'timeOfDay']
+            [simple CANOpenTime 'timeOfDay']
         ]
         ['CANOpenService.RECEIVE_PDO_1' CANOpenPDOPayload
             [simple CANOpenPDO 'pdo' ['1', 'true']]
@@ -84,12 +84,12 @@
         ['CANOpenService.TRANSMIT_PDO_4' CANOpenPDOPayload
             [simple CANOpenPDO 'pdo' ['1', 'false']]
         ]
-        ['CANOpenService.TRANSMIT_SDO' CANOpenSDORequest
-            [enum SDOCommand 'command']
+        ['CANOpenService.RECEIVE_SDO' CANOpenSDORequest
+            [enum SDORequestCommand 'command']
             [simple SDORequest 'request' ['command']]
         ]
-        ['CANOpenService.RECEIVE_SDO' CANOpenSDOResponse
-            [enum SDOCommand 'command']
+        ['CANOpenService.TRANSMIT_SDO' CANOpenSDOResponse
+            [enum SDOResponseCommand 'command']
             [simple SDOResponse 'response' ['command']]
         ]
         ['CANOpenService.HEARTBEAT' CANOpenHeartbeatPayload
@@ -98,82 +98,243 @@
     ]
 ]
 
-[type 'SDORequest' [SDOCommand 'command']
+[type 'SDORequest' [SDORequestCommand 'command']
     [typeSwitch 'command'
-        ['SDOCommand.INITIALIZE_DOWNLOAD' SDOInitializeDownloadRequest
+        ['SDORequestCommand.SEGMENT_DOWNLOAD' SDOSegmentDownloadRequest
+            [simple bit 'toggle']
+            [implicit uint 3 'size' '7 - COUNT(data)']
+            [simple bit 'last']
+            [array int 8 'data' COUNT '7 - size']
+            [padding uint 8 'alignment' '0x00' '7 - COUNT(data)']
+        ]
+        ['SDORequestCommand.INITIATE_DOWNLOAD' SDOInitiateDownloadRequest
             [reserved uint 1 '0x00']
-            [implicit uint 2 'size' 'expedited && indicated ? 4 - COUNT(data) : 0']
+            [implicit uint 2 'size' 'STATIC_CALL("org.apache.plc4x.java.can.helper.CANOpenHelper.count", expedited, indicated, payload)']
             [simple bit 'expedited']
             [simple bit 'indicated']
-            [simple Multiplexer 'address']
-            [array int 8 'data' COUNT '(expedited && indicated) ? 4 - size : 0']
-            [padding uint 8 'alignment' '0x00' '4 - (COUNT(data))']
+            [simple IndexAddress 'address']
+            [simple SDOInitiateUploadResponsePayload 'payload' ['expedited', 'indicated', 'size']]
+        ]
+        ['SDORequestCommand.INITIATE_UPLOAD' SDOInitiateUploadRequest
+            [reserved uint 5 '0x00']
+            [simple IndexAddress 'address']
+            [reserved int 32 '0x00'] // padding
+        ]
+        ['SDORequestCommand.SEGMENT_UPLOAD' SDOSegmentUploadRequest
+            [simple bit 'toggle']
+            [reserved uint 4 '0x00']
+            [reserved int 56 '0x00'] // padding
+        ]
+        ['SDORequestCommand.ABORT' SDOAbortRequest
+            [simple SDOAbort 'abort']
+        ]
+        ['SDORequestCommand.BLOCK' SDOBlockRequest
+            [simple SDOBlockData 'block']
         ]
-        ['SDOCommand.SEGMENT_DOWNLOAD' SDOSegmentDownloadRequest
+    ]
+]
+
+[type 'SDOBlockData'
+    [simple uint 5 'flags']
+    [array int 8 'data' COUNT '7']
+]
+
+[type 'SDOResponse' [SDOResponseCommand 'command']
+    [typeSwitch 'command'
+        ['SDOResponseCommand.SEGMENT_UPLOAD' SDOSegmentUploadResponse
             [simple bit 'toggle']
             [implicit uint 3 'size' '7 - COUNT(data)']
             [simple bit 'last']
-            [array int 8 'data' COUNT '7 - data']
-            [padding uint 8 'alignment' '0x00' '7 - (COUNT(data))']
+            [array int 8 'data' COUNT '7 - size']
+            [padding uint 8 'alignment' '0x00' '7 - COUNT(data)']
+        ]
+        ['SDOResponseCommand.SEGMENT_DOWNLOAD' SDOSegmentDownloadResponse
+            [simple bit 'toggle']
+            [reserved uint 4 '0x00'] // fill first byte
+            [reserved int 56 '0x00'] // padding
+        ]
+        ['SDOResponseCommand.INITIATE_UPLOAD' SDOInitiateUploadResponse
+            [reserved uint 1 '0x00']
+            [implicit uint 2 'size' 'STATIC_CALL("org.apache.plc4x.java.can.helper.CANOpenHelper.count", expedited, indicated, payload)']
+            [simple bit 'expedited']
+            [simple bit 'indicated']
+            [simple IndexAddress 'address']
+            [simple SDOInitiateUploadResponsePayload 'payload' ['expedited', 'indicated', 'size']]
         ]
-        ['SDOCommand.INITIALIZE_UPLOAD' SDOInitializeUploadRequest
+        ['SDOResponseCommand.INITIATE_DOWNLOAD' SDOInitiateDownloadResponse
             [reserved uint 5 '0x00']
-            [simple Multiplexer 'address']
+            [simple IndexAddress 'address']
             [reserved int 32 '0x00'] // padding
         ]
+        ['SDOResponseCommand.ABORT' SDOAbortResponse
+            [simple SDOAbort 'abort']
+        ]
+        ['SDOResponseCommand.BLOCK' SDOBlockResponse
+            [simple SDOBlockData 'block']
+        ]
     ]
 ]
 
-[type 'SDOResponse' [SDOCommand 'command']
-    [typeSwitch 'command'
-        ['SDOCommand.SEGMENT_UPLOAD' SDOSegmentUploadResponse
-            [reserved uint 5 '0x00']
-            [simple Multiplexer 'address']
-            [reserved int 32 '0x00'] // padding
+[type 'SDOInitiateUploadResponsePayload' [bit 'expedited', bit 'indicated', uint 2 'size']
+    [typeSwitch 'expedited', 'indicated'
+        ['true', 'true' SDOInitiateExpeditedUploadResponse [uint 2 'size']
+            [array int 8 'data' COUNT '4 - size']
+            [padding uint 8 'alignment' '0x00' '4 - COUNT(data)']
         ]
-        ['SDOCommand.INITIALIZE_DOWNLOAD' SDOInitializeDownloadResponse
-            [simple bit 'toggle']
-            [reserved uint 4 '0x00']
-            [reserved int 32 '0x00'] // padding
+        ['false', 'true' SDOInitiateSegmentedUploadResponse
+            [simple uint 32 'bytes']
         ]
-        ['SDOCommand.INITIALIZE_UPLOAD' SDOInitializeUploadResponse
-            [simple SDOSegment 'segment']
+        ['false', 'false' SDOInitiateSegmentedReservedResponse
+            [reserved int 32 '0x00']
         ]
     ]
 ]
 
+[type 'SDOAbort'
+    [reserved uint 5 '0x00']
+    [simple IndexAddress 'address']
+    [simple uint 32 'code']
+]
+
 [type 'SDOSegment'
     [reserved uint 1 '0x00']
     [implicit uint 2 'size' 'expedited && indicated ? 4 - COUNT(data) : 0']
     [simple bit 'expedited']
     [simple bit 'indicated']
-    [simple Multiplexer 'address']
+    [simple IndexAddress 'address']
     [array int 8 'data' COUNT '(expedited && indicated) ? 4 - size : 0']
     [padding uint 8 'alignment' '0x00' '4 - (COUNT(data))']
 ]
 
-[type 'Multiplexer'
+[type 'IndexAddress'
     [simple uint 16 'index']
     [simple uint 8 'subindex']
 ]
 
-[enum uint 3 'SDOCommand'
-    ['0x00' SEGMENT_DOWNLOAD]
-    ['0x01' INITIALIZE_DOWNLOAD]
-    ['0x02' INITIALIZE_UPLOAD]
-    ['0x03' SEGMENT_UPLOAD]
-    ['0x04' ABORT]
-    ['0x05' BLOCK_UPLOAD]
-    ['0x06' BLOCK_DOWNLOAD]
+[enum uint 3 'SDORequestCommand'
+    ['0x00' SEGMENT_DOWNLOAD  ]
+    ['0x01' INITIATE_DOWNLOAD ]
+    ['0x02' INITIATE_UPLOAD   ]
+    ['0x03' SEGMENT_UPLOAD    ]
+    ['0x04' ABORT             ]
+    ['0x05' BLOCK             ]
+]
+
+[enum uint 3 'SDOResponseCommand'
+    ['0x00' SEGMENT_UPLOAD    ]
+    ['0x01' SEGMENT_DOWNLOAD  ]
+    ['0x02' INITIATE_UPLOAD   ]
+    ['0x03' INITIATE_DOWNLOAD ]
+    ['0x04' ABORT             ]
+    ['0x06' BLOCK             ]
 ]
 
 [type 'CANOpenPDO' [uint 2 'index', bit 'receive']
     [array int 8 'data' COUNT '8']
 ]
 
-[type 'TimeOfDay'
-    // CiA 301 - section 7.1.6.5
+[type 'CANOpenTime'
+    // CiA 301 - section 7.1.6.5 and 7.1.6.6
     [simple uint 28 'millis']
     [reserved int 4 '0x00']
     [simple uint 16 'days']
+]
+
+[enum 'CANOpenDataType' [uint 8 'numBits']
+    [BOOLEAN     [ '1'] ]
+    [UNSIGNED8   [ '8'] ]
+    [UNSIGNED16  ['16'] ]
+    [UNSIGNED24  ['24'] ]
+    [UNSIGNED32  ['32'] ]
+    [UNSIGNED40  ['40'] ]
+    [UNSIGNED48  ['48'] ]
+    [UNSIGNED56  ['56'] ]
+    [UNSIGNED64  ['64'] ]
+    [INTEGER8    [ '8'] ]
+    [INTEGER16   ['16'] ]
+    [INTEGER24   ['24'] ]
+    [INTEGER32   ['32'] ]
+    [INTEGER40   ['40'] ]
+    [INTEGER48   ['48'] ]
+    [INTEGER56   ['56'] ]
+    [INTEGER64   ['64'] ]
+    [REAL32      ['32'] ]
+    [REAL64      ['64'] ]
+
+    // compound/complex types
+    [OCTET_STRING     [ '8'] ]
+    [VISIBLE_STRING   [ '8'] ]
+    [UNICODE_STRING   ['16'] ]
+    [TIME_OF_DAY      ['48'] ]
+    [TIME_DIFFERENCE  ['48'] ]
+]
+
+[dataIo 'DataItem' [CANOpenDataType 'dataType']
+    [typeSwitch 'dataType'
+        ['CANOpenDataType.BOOLEAN' Boolean
+            [simple bit 'value']
+        ]
+        ['CANOpenDataType.UNSIGNED8' Integer
+            [simple uint 8 'value']
+        ]
+        ['CANOpenDataType.UNSIGNED16' Integer
+            [simple uint 16 'value']
+        ]
+        ['CANOpenDataType.UNSIGNED24' Long
+            [simple uint 24 'value']
+        ]
+        ['CANOpenDataType.UNSIGNED32' Long
+            [simple uint 32 'value']
+        ]
+        ['CANOpenDataType.UNSIGNED40' BigInteger
+            [simple uint 40 'value']
+        ]
+        ['CANOpenDataType.UNSIGNED48' BigInteger
+            [simple uint 48 'value']
+        ]
+        ['CANOpenDataType.UNSIGNED56' BigInteger
+            [simple uint 56 'value']
+        ]
+        ['CANOpenDataType.UNSIGNED64' BigInteger
+            [simple uint 64 'value']
+        ]
+        ['CANOpenDataType.INTEGER8' Integer
+            [simple int 8 'value']
+        ]
+        ['CANOpenDataType.INTEGER16' Integer
+            [simple int 16 'value']
+        ]
+        ['CANOpenDataType.INTEGER24' Integer
+            [simple int 24 'value']
+        ]
+        ['CANOpenDataType.INTEGER32' Integer
+            [simple int 32 'value']
+        ]
+        ['CANOpenDataType.INTEGER40' Long
+            [simple int 40 'value']
+        ]
+        ['CANOpenDataType.INTEGER48' Long
+            [simple int 48 'value']
+        ]
+        ['CANOpenDataType.INTEGER56' Long
+            [simple int 56 'value']
+        ]
+        ['CANOpenDataType.INTEGER64' Long
+            [simple int 64 'value']
+        ]
+        ['CANOpenDataType.REAL32' Float
+            [simple float 8.23 'value']
+        ]
+        ['CANOpenDataType.REAL64' Double
+            [simple float 11.52 'value']
+        ]
+        ['CANOpenDataType.OCTET_STRING' String
+        ]
+        ['CANOpenDataType.VISIBLE_STRING' String
+        ]
+        //CANOpenDataType.TIME_OF_DAY' CANOpenTime
+        //CANOpenDataType.TIME_DIFFERENCE' CANOpenTime
+        ['CANOpenDataType.UNICODE_STRING' String
+        ]
+    ]
 ]
\ No newline at end of file
diff --git a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/helper/CANOpenHelper.java b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/helper/CANOpenHelper.java
index 5f6b4d3..1a9a346 100644
--- a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/helper/CANOpenHelper.java
+++ b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/helper/CANOpenHelper.java
@@ -1,16 +1,27 @@
 package org.apache.plc4x.java.can.helper;
 
+import org.apache.plc4x.java.canopen.readwrite.SDOInitiateExpeditedUploadResponse;
+import org.apache.plc4x.java.canopen.readwrite.SDOInitiateUploadResponsePayload;
+import org.apache.plc4x.java.canopen.readwrite.SDOSegmentUploadResponse;
 import org.apache.plc4x.java.canopen.readwrite.types.CANOpenService;
-import org.apache.plc4x.java.socketcan.readwrite.SocketCANFrame;
-import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
+import static org.apache.plc4x.java.spi.generation.StaticHelper.COUNT;
+
 public class CANOpenHelper {
 
     public static CANOpenService readFunction(short identifier) {
         return CANOpenService.valueOf((byte) (identifier >> 7));
     }
 
+    public static int uploadPadding(SDOSegmentUploadResponse payload) {
+        return 7 - payload.getData().length;
+    }
+
+    public static int count(boolean expedited, boolean indicated, SDOInitiateUploadResponsePayload payload) {
+        return expedited && indicated && payload instanceof SDOInitiateExpeditedUploadResponse ? 4 - COUNT(((SDOInitiateExpeditedUploadResponse) payload).getData()) : 0;
+    }
+
     public static void writeFunction(WriteBuffer io, short identifier) {
         // NOOP - a placeholder to let mspec compile
     }
diff --git a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/protocol/CANOpenProtocolLogic.java b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/protocol/CANOpenProtocolLogic.java
index c193ec3..fa6dab2 100644
--- a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/protocol/CANOpenProtocolLogic.java
+++ b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/protocol/CANOpenProtocolLogic.java
@@ -20,10 +20,8 @@ package org.apache.plc4x.java.can.protocol;
 
 import org.apache.plc4x.java.can.configuration.CANConfiguration;
 import org.apache.plc4x.java.canopen.readwrite.CANOpenHeartbeatPayload;
-import org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload;
 import org.apache.plc4x.java.canopen.readwrite.CANOpenPayload;
 import org.apache.plc4x.java.canopen.readwrite.io.CANOpenHeartbeatPayloadIO;
-import org.apache.plc4x.java.canopen.readwrite.io.CANOpenNetworkPayloadIO;
 import org.apache.plc4x.java.canopen.readwrite.io.CANOpenPayloadIO;
 import org.apache.plc4x.java.canopen.readwrite.types.CANOpenService;
 import org.apache.plc4x.java.canopen.readwrite.types.NMTState;
@@ -88,7 +86,14 @@ public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> impl
 
     @Override
     protected void decode(ConversationContext<SocketCANFrame> context, SocketCANFrame msg) throws Exception {
-        logger.info("Decode CAN message {}", msg);
+        CANOpenService service = serviceId(msg.getIdentifier());
+        CANOpenPayload payload = CANOpenPayloadIO.staticParse(new ReadBuffer(msg.getData()), service);
+
+        if (service != null) {
+            logger.info("Decoded CANOpen {} from {}, message {}", service, Math.abs(service.getMin() - msg.getIdentifier()), payload);
+        } else {
+            logger.info("CAN message {}, {}", msg.getIdentifier(), msg);
+        }
 
 //        int identifier = msg.getIdentifier();
 //        CANOpenService service = CANOpenService.valueOf((byte) (identifier >> 7));
@@ -107,7 +112,10 @@ public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> impl
 
     @Override
     public void onDisconnect(ConversationContext<SocketCANFrame> context) {
-
+        if (this.heartbeat != null) {
+            this.heartbeat.cancel();
+            this.heartbeat = null;
+        }
     }
 
     private int cobId(CANOpenService service) {
@@ -118,6 +126,14 @@ public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> impl
 
     private CANOpenService serviceId(int nodeId) {
         // form 32 bit socketcan identifier
-        return CANOpenService.valueOf((byte) (nodeId >> 7));
+        CANOpenService service = CANOpenService.valueOf((byte) (nodeId >> 7));
+        if (service == null) {
+            for (CANOpenService val : CANOpenService.values()) {
+                if (val.getMin() > nodeId && val.getMax() < nodeId) {
+                    return val;
+                }
+            }
+        }
+        return service;
     }
 }
diff --git a/sandbox/test-java-can-driver/src/test/java/org/apache/plc4x/java/can/CANOpenWiresharkTest.java b/sandbox/test-java-can-driver/src/test/java/org/apache/plc4x/java/can/CANOpenWiresharkTest.java
new file mode 100644
index 0000000..3d1258a
--- /dev/null
+++ b/sandbox/test-java-can-driver/src/test/java/org/apache/plc4x/java/can/CANOpenWiresharkTest.java
@@ -0,0 +1,30 @@
+/*
+  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.can;
+
+import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
+
+public class CANOpenWiresharkTest extends ParserSerializerTestsuiteRunner {
+
+    public CANOpenWiresharkTest() {
+        super("/testsuite/CANOpenWiresharkTestSuite.xml");
+    }
+
+}
diff --git a/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenPayloadTestSuite.xml b/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenPayloadTestSuite.xml
index 8537aee..2f2353f 100644
--- a/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenPayloadTestSuite.xml
+++ b/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenPayloadTestSuite.xml
@@ -34,7 +34,7 @@
     </parser-arguments>
     <xml>
       <CANOpenTimeSynchronization className="org.apache.plc4x.java.canopen.readwrite.CANOpenTimeSynchronization">
-        <timeOfDay className="org.apache.plc4x.java.canopen.readwrite.TimeOfDay">
+        <timeOfDay className="org.apache.plc4x.java.canopen.readwrite.CANOpenTime">
           <millis>-663027446</millis>
           <days>13392</days>
         </timeOfDay>
@@ -54,7 +54,7 @@
     </parser-arguments>
     <xml>
       <CANOpenTimeSynchronization className="org.apache.plc4x.java.canopen.readwrite.CANOpenTimeSynchronization">
-        <timeOfDay className="org.apache.plc4x.java.canopen.readwrite.TimeOfDay">
+        <timeOfDay className="org.apache.plc4x.java.canopen.readwrite.CANOpenTime">
           <millis>-392494841</millis>
           <days>13392</days>
         </timeOfDay>
@@ -105,27 +105,33 @@
   </testcase>
 
   <testcase>
-    <name>SDO request, payload: 43171000</name>
-    <raw>43171000</raw>
+    <name>SDO request, payload: 4317100000000000</name>
+    <raw>4317100000000000</raw>
     <root-type>CANOpenPayload</root-type>
     <parser-arguments>
-      <arg1>RECEIVE_SDO</arg1>
+      <arg1>TRANSMIT_SDO</arg1>
     </parser-arguments>
     <xml>
-      <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
-        <command>INITIALIZE_UPLOAD</command>
-        <expedited>true</expedited>
-        <placement>true</placement>
-        <index>4119</index>
-        <subindex>0</subindex>
-        <data/>
-      </CANOpenSDORequest>
+      <CANOpenSDOResponse className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDOResponse">
+        <command>INITIATE_UPLOAD</command>
+        <response className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateUploadResponse">
+          <expedited>true</expedited>
+          <indicated>true</indicated>
+          <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+            <index>4119</index>
+            <subindex>0</subindex>
+          </address>
+          <payload className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateExpeditedUploadResponse">
+            <data>AAAAAA==</data>
+          </payload>
+        </response>
+      </CANOpenSDOResponse>
     </xml>
   </testcase>
 
   <testcase>
-    <name>SDO request, payload: 00171000<!--A00F0000--></name>
-    <raw>00171000<!--A00F0000--></raw>
+    <name>SDO request, payload: 00171000A00F0000</name>
+    <raw>00171000A00F0000</raw>
     <root-type>CANOpenPayload</root-type>
     <parser-arguments>
       <arg1>RECEIVE_SDO</arg1>
@@ -133,87 +139,93 @@
     <xml>
       <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
         <command>SEGMENT_DOWNLOAD</command>
-        <expedited>false</expedited>
-        <placement>false</placement>
-        <index>4119</index>
-        <subindex>0</subindex>
-        <data/>
+        <request className="org.apache.plc4x.java.canopen.readwrite.SDOSegmentDownloadRequest">
+          <toggle>false</toggle>
+          <last>false</last>
+          <data>FxAAoA8AAA==</data>
+        </request>
       </CANOpenSDORequest>
     </xml>
   </testcase>
 
   <testcase>
-    <name>SDO write request, payload: 2B171000D00F</name>
-    <raw>2B171000D00F</raw>
+    <name>SDO write request, payload: 2B171000D00F0000</name>
+    <raw>2B171000D00F0000</raw>
     <root-type>CANOpenPayload</root-type>
     <parser-arguments>
       <arg1>RECEIVE_SDO</arg1>
     </parser-arguments>
     <xml>
       <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
-        <command>INITIALIZE_DOWNLOAD</command>
-        <expedited>true</expedited>
-        <placement>true</placement>
-        <index>4119</index>
-        <subindex>0</subindex>
-        <data>
-          <data>208</data>
-          <data>15</data>
-        </data>
+        <command>INITIATE_DOWNLOAD</command>
+        <request className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateDownloadRequest">
+          <expedited>true</expedited>
+          <indicated>true</indicated>
+          <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+            <index>4119</index>
+            <subindex>0</subindex>
+          </address>
+          <payload className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateExpeditedUploadResponse">
+            <data>0A8=</data>
+          </payload>
+        </request>
       </CANOpenSDORequest>
     </xml>
   </testcase>
 
   <testcase>
-    <name>SDO write result, payload: 60171000<!--A00F0000--></name>
-    <raw>00171000<!--A00F0000--></raw>
+    <name>SDO write result, payload: 60171000A00F0000</name>
+    <raw>00171000A00F0000</raw>
     <root-type>CANOpenPayload</root-type>
     <parser-arguments>
       <arg1>TRANSMIT_SDO</arg1>
     </parser-arguments>
     <xml>
-      <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
-        <command>SEGMENT_DOWNLOAD</command>
-        <expedited>false</expedited>
-        <placement>false</placement>
-        <index>4119</index>
-        <subindex>0</subindex>
-        <data/>
-      </CANOpenSDORequest>
+      <CANOpenSDOResponse className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDOResponse">
+        <command>SEGMENT_UPLOAD</command>
+        <response className="org.apache.plc4x.java.canopen.readwrite.SDOSegmentUploadResponse">
+          <toggle>false</toggle>
+          <last>false</last>
+          <data>FxAAoA8AAA==</data>
+        </response>
+      </CANOpenSDOResponse>
     </xml>
   </testcase>
 
   <!-- samples -->
   <testcase>
-    <name>SDO response, payload: 60002000</name>
-    <raw>60002000</raw>
+    <name>SDO response, payload: 6000200000000000</name>
+    <raw>6000200000000000</raw>
     <root-type>CANOpenPayload</root-type>
     <parser-arguments>
       <arg1>TRANSMIT_SDO</arg1>
     </parser-arguments>
     <xml>
       <CANOpenSDOResponse className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDOResponse">
-        <command>SEGMENT_UPLOAD</command>
-        <expedited>false</expedited>
-        <placement>false</placement>
-        <index>8192</index>
-        <subindex>0</subindex>
-        <data/>
+        <command>INITIATE_DOWNLOAD</command>
+        <response className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateDownloadResponse">
+          <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+            <index>8192</index>
+            <subindex>0</subindex>
+          </address>
+        </response>
       </CANOpenSDOResponse>
     </xml>
   </testcase>
 
   <testcase>
-    <name>PDO, payload: 78563412</name>
-    <raw>78563412</raw>
+    <name>PDO, payload: 7856341200000000</name>
+    <raw>7856341200000000</raw>
     <root-type>CANOpenPayload</root-type>
     <parser-arguments>
-      <arg1>RECEIVE_SDO</arg1>
+      <arg1>RECEIVE_PDO_1</arg1>
     </parser-arguments>
     <xml>
-      <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
-        <state>PRE_OPERATIONAL</state>
-      </CANOpenNetworkPayload>
+      <CANOpenPDOPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenPDOPayload">
+        <pdo className="org.apache.plc4x.java.canopen.readwrite.CANOpenPDO">
+          <data>eFY0EgAAAAA=</data>
+        </pdo>
+      </CANOpenPDOPayload>
     </xml>
   </testcase>
 
@@ -226,9 +238,11 @@
       <arg1>TRANSMIT_PDO_1</arg1>
     </parser-arguments>
     <xml>
-      <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
-        <state>PRE_OPERATIONAL</state>
-      </CANOpenNetworkPayload>
+      <CANOpenPDOPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenPDOPayload">
+        <pdo className="org.apache.plc4x.java.canopen.readwrite.CANOpenPDO">
+          <data>+QE+AUwBXAE=</data>
+        </pdo>
+      </CANOpenPDOPayload>
     </xml>
   </testcase>
 
diff --git a/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenWiresharkTestSuite.xml b/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenWiresharkTestSuite.xml
new file mode 100644
index 0000000..4bced77
--- /dev/null
+++ b/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenWiresharkTestSuite.xml
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<test:testsuite xmlns:test="https://plc4x.apache.org/schemas/parser-serializer-testsuite.xsd">
+
+  <name>Tests of CANopen frames from Wireshark sample PCAP files.</name>
+
+
+  <testcase>
+    <name>SDO initiate request: 4008100000000000</name>
+    <raw>4008100000000000</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>RECEIVE_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
+        <command>INITIATE_UPLOAD</command>
+        <request className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateUploadRequest">
+          <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+            <index>4104</index>
+            <subindex>0</subindex>
+          </address>
+        </request>
+      </CANOpenSDORequest>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO initiate response: 4108100015000000</name>
+    <raw>4108100015000000</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>TRANSMIT_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDOResponse className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDOResponse">
+        <command>INITIATE_UPLOAD</command>
+        <response className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateUploadResponse">
+          <expedited>false</expedited>
+          <indicated>true</indicated>
+          <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+            <index>4104</index>
+            <subindex>0</subindex>
+          </address>
+          <payload className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateSegmentedUploadResponse">
+            <bytes>21</bytes>
+          </payload>
+        </response>
+      </CANOpenSDOResponse>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO segment upload request: 6000000000000000</name>
+    <raw>6000000000000000</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>RECEIVE_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
+        <command>SEGMENT_UPLOAD</command>
+        <request className="org.apache.plc4x.java.canopen.readwrite.SDOSegmentUploadRequest">
+          <toggle>false</toggle>
+        </request>
+      </CANOpenSDORequest>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO abort: 8000000021000008</name>
+    <raw>8000000021000008</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>RECEIVE_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
+        <command>ABORT</command>
+        <request className="org.apache.plc4x.java.canopen.readwrite.SDOAbortRequest">
+          <abort className="org.apache.plc4x.java.canopen.readwrite.SDOAbort">
+            <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+              <index>0</index>
+              <subindex>0</subindex>
+            </address>
+            <code>134217761</code>
+          </abort>
+        </request>
+      </CANOpenSDORequest>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO upload segment response: 00556c7472614869</name>
+    <raw>00556c7472614869</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>TRANSMIT_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDOResponse className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDOResponse">
+        <command>SEGMENT_UPLOAD</command>
+        <response className="org.apache.plc4x.java.canopen.readwrite.SDOSegmentUploadResponse">
+          <toggle>false</toggle>
+          <last>false</last>
+          <data>VWx0cmFIaQ==</data>
+        </response>
+      </CANOpenSDOResponse>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO upload segment request: 7000000000000000</name>
+    <raw>7000000000000000</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>RECEIVE_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
+        <command>SEGMENT_UPLOAD</command>
+        <request className="org.apache.plc4x.java.canopen.readwrite.SDOSegmentUploadRequest">
+          <toggle>true</toggle>
+        </request>
+      </CANOpenSDORequest>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO initiate upload request: 4008102a00000000</name>
+    <raw>4008102a00000000</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>RECEIVE_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
+        <command>INITIATE_UPLOAD</command>
+        <request className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateUploadRequest">
+          <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+            <index>4104</index>
+            <subindex>42</subindex>
+          </address>
+        </request>
+      </CANOpenSDORequest>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>NMT start node 0x42: 0142</name>
+    <raw>0142</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>NMT</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+        <request>START</request>
+        <node>66</node>
+      </CANOpenNetworkPayload>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>NMT start node 0x00 (all): 0100</name>
+    <raw>0100</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>NMT</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+        <request>START</request>
+        <node>0</node>
+      </CANOpenNetworkPayload>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>NMT start node 0x42: 0263</name>
+    <raw>0263</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>NMT</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+        <request>STOP</request>
+        <node>99</node>
+      </CANOpenNetworkPayload>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO initiate download request: 2300620161736466</name>
+    <raw>2300620161736466</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>RECEIVE_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
+        <command>INITIATE_DOWNLOAD</command>
+        <request className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateDownloadRequest">
+          <expedited>true</expedited>
+          <indicated>true</indicated>
+          <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+            <index>25088</index>
+            <subindex>1</subindex>
+          </address>
+          <payload className="org.apache.plc4x.java.canopen.readwrite.SDOInitiateExpeditedUploadResponse">
+            <data>YXNkZg==</data>
+          </payload>
+        </request>
+      </CANOpenSDORequest>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO abort: 8000620100000206</name>
+    <raw>8000620100000206</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>TRANSMIT_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDOResponse className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDOResponse">
+        <command>ABORT</command>
+        <response className="org.apache.plc4x.java.canopen.readwrite.SDOAbortResponse">
+          <abort className="org.apache.plc4x.java.canopen.readwrite.SDOAbort">
+            <address className="org.apache.plc4x.java.canopen.readwrite.IndexAddress">
+              <index>25088</index>
+              <subindex>1</subindex>
+            </address>
+            <code>100794368</code>
+          </abort>
+        </response>
+      </CANOpenSDOResponse>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>SDO block upload: c208100015000000</name>
+    <raw>c208100015000000</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>TRANSMIT_SDO</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenSDOResponse className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDOResponse">
+        <command>BLOCK</command>
+        <response className="org.apache.plc4x.java.canopen.readwrite.SDOBlockResponse">
+          <block className="org.apache.plc4x.java.canopen.readwrite.SDOBlockData">
+            <flags>2</flags>
+            <data>CBAAFQAAAA==</data>
+          </block>
+        </response>
+      </CANOpenSDOResponse>
+    </xml>
+  </testcase>
+</test:testsuite>
\ No newline at end of file