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 2020/11/20 13:42:32 UTC

[plc4x] branch feature/plc4go updated: - Ficed the test-definition to the latest changes in the KNX protocol.

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

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


The following commit(s) were added to refs/heads/feature/plc4go by this push:
     new cf70c2f  - Ficed the test-definition to the latest changes in the KNX protocol.
cf70c2f is described below

commit cf70c2fda06b735de6c6819eb7592e3348d4c2e8
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Nov 20 14:42:22 2020 +0100

    - Ficed the test-definition to the latest changes in the KNX protocol.
---
 .../knxnetip/ParserSerializerTestsuite.xml         |   4 +-
 .../plc4go/knxnetip/readwrite/ParserHelper.go      |  40 +++---
 .../plc4go/knxnetip/readwrite/XmlParserHelper.go   |  96 ++++++-------
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      |  18 +--
 .../knxnetip/readwrite/model/KnxDatapoint.go       | 150 ++++++++++++++++++++-
 .../resources/protocols/knxnetip/knxnetip.mspec    |  10 +-
 .../knxnetip/ParserSerializerTestsuite.xml         |   4 +-
 7 files changed, 233 insertions(+), 89 deletions(-)

diff --git a/plc4go/assets/testing/protocols/knxnetip/ParserSerializerTestsuite.xml b/plc4go/assets/testing/protocols/knxnetip/ParserSerializerTestsuite.xml
index 90217fe..2eae8b6 100644
--- a/plc4go/assets/testing/protocols/knxnetip/ParserSerializerTestsuite.xml
+++ b/plc4go/assets/testing/protocols/knxnetip/ParserSerializerTestsuite.xml
@@ -146,7 +146,7 @@
         </hpaiControlEndpoint>
         <dibDeviceInfo className="org.apache.plc4x.java.knxnetip.readwrite.DIBDeviceInfo">
           <descriptionType>1</descriptionType>
-          <knxMedium>2</knxMedium>
+          <knxMedium>MEDIUM_TP1</knxMedium>
           <deviceStatus className="org.apache.plc4x.java.knxnetip.readwrite.DeviceStatus">
             <programMode>false</programMode>
           </deviceStatus>
@@ -211,7 +211,7 @@
       <DescriptionResponse className="org.apache.plc4x.java.knxnetip.readwrite.DescriptionResponse">
         <dibDeviceInfo className="org.apache.plc4x.java.knxnetip.readwrite.DIBDeviceInfo">
           <descriptionType>1</descriptionType>
-          <knxMedium>2</knxMedium>
+          <knxMedium>MEDIUM_TP1</knxMedium>
           <deviceStatus className="org.apache.plc4x.java.knxnetip.readwrite.DeviceStatus">
             <programMode>false</programMode>
           </deviceStatus>
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/ParserHelper.go b/plc4go/internal/plc4go/knxnetip/readwrite/ParserHelper.go
index ab14594..827fb09 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/ParserHelper.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/ParserHelper.go
@@ -30,26 +30,12 @@ type KnxnetipParserHelper struct {
 
 func (m KnxnetipParserHelper) Parse(typeName string, arguments []string, io *utils.ReadBuffer) (spi.Message, error) {
     switch typeName {
-    case "CEMIAdditionalInformation":
-        return model.CEMIAdditionalInformationParse(io)
     case "HPAIControlEndpoint":
         return model.HPAIControlEndpointParse(io)
     case "TunnelingResponseDataBlock":
         return model.TunnelingResponseDataBlockParse(io)
-    case "KnxAddress":
-        return model.KnxAddressParse(io)
-    case "ConnectionResponseDataBlock":
-        return model.ConnectionResponseDataBlockParse(io)
-    case "TunnelingRequestDataBlock":
-        return model.TunnelingRequestDataBlockParse(io)
-    case "DIBDeviceInfo":
-        return model.DIBDeviceInfoParse(io)
-    case "DeviceConfigurationRequestDataBlock":
-        return model.DeviceConfigurationRequestDataBlockParse(io)
     case "DeviceConfigurationAckDataBlock":
         return model.DeviceConfigurationAckDataBlockParse(io)
-    case "DIBSuppSvcFamilies":
-        return model.DIBSuppSvcFamiliesParse(io)
     case "ConnectionRequestInformation":
         return model.ConnectionRequestInformationParse(io)
     case "HPAIDiscoveryEndpoint":
@@ -70,6 +56,26 @@ func (m KnxnetipParserHelper) Parse(typeName string, arguments []string, io *uti
             return nil, err
         }
         return model.CEMIParse(io, size)
+    case "KnxNetIpMessage":
+        return model.KnxNetIpMessageParse(io)
+    case "DeviceStatus":
+        return model.DeviceStatusParse(io)
+    case "IPAddress":
+        return model.IPAddressParse(io)
+    case "CEMIAdditionalInformation":
+        return model.CEMIAdditionalInformationParse(io)
+    case "KnxAddress":
+        return model.KnxAddressParse(io)
+    case "ConnectionResponseDataBlock":
+        return model.ConnectionResponseDataBlockParse(io)
+    case "TunnelingRequestDataBlock":
+        return model.TunnelingRequestDataBlockParse(io)
+    case "DIBDeviceInfo":
+        return model.DIBDeviceInfoParse(io)
+    case "DeviceConfigurationRequestDataBlock":
+        return model.DeviceConfigurationRequestDataBlockParse(io)
+    case "DIBSuppSvcFamilies":
+        return model.DIBSuppSvcFamiliesParse(io)
     case "KnxGroupAddress":
         numLevels, err := utils.StrToUint8(arguments[0])
         if err != nil {
@@ -78,14 +84,8 @@ func (m KnxnetipParserHelper) Parse(typeName string, arguments []string, io *uti
         return model.KnxGroupAddressParse(io, numLevels)
     case "MACAddress":
         return model.MACAddressParse(io)
-    case "KnxNetIpMessage":
-        return model.KnxNetIpMessageParse(io)
     case "CEMIFrame":
         return model.CEMIFrameParse(io)
-    case "DeviceStatus":
-        return model.DeviceStatusParse(io)
-    case "IPAddress":
-        return model.IPAddressParse(io)
     }
     return nil, errors.New("Unsupported type " + typeName)
 }
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/XmlParserHelper.go b/plc4go/internal/plc4go/knxnetip/readwrite/XmlParserHelper.go
index 3d0dfea..3074255 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/XmlParserHelper.go
@@ -30,169 +30,169 @@ type KnxnetipXmlParserHelper struct {
 
 func (m KnxnetipXmlParserHelper) Parse(typeName string, xmlString string) (spi.Message, error) {
     switch typeName {
-    case "CEMIAdditionalInformation":
-        var obj *model.CEMIAdditionalInformation
+    case "HPAIControlEndpoint":
+        var obj *model.HPAIControlEndpoint
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "HPAIControlEndpoint":
-        var obj *model.HPAIControlEndpoint
+    case "TunnelingResponseDataBlock":
+        var obj *model.TunnelingResponseDataBlock
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "TunnelingResponseDataBlock":
-        var obj *model.TunnelingResponseDataBlock
+    case "DeviceConfigurationAckDataBlock":
+        var obj *model.DeviceConfigurationAckDataBlock
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "KnxAddress":
-        var obj *model.KnxAddress
+    case "ConnectionRequestInformation":
+        var obj *model.ConnectionRequestInformation
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "ConnectionResponseDataBlock":
-        var obj *model.ConnectionResponseDataBlock
+    case "HPAIDiscoveryEndpoint":
+        var obj *model.HPAIDiscoveryEndpoint
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "TunnelingRequestDataBlock":
-        var obj *model.TunnelingRequestDataBlock
+    case "ProjectInstallationIdentifier":
+        var obj *model.ProjectInstallationIdentifier
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "DIBDeviceInfo":
-        var obj *model.DIBDeviceInfo
+    case "CEMIDataFrame":
+        var obj *model.CEMIDataFrame
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "DeviceConfigurationRequestDataBlock":
-        var obj *model.DeviceConfigurationRequestDataBlock
+    case "ServiceId":
+        var obj *model.ServiceId
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "DeviceConfigurationAckDataBlock":
-        var obj *model.DeviceConfigurationAckDataBlock
+    case "HPAIDataEndpoint":
+        var obj *model.HPAIDataEndpoint
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "DIBSuppSvcFamilies":
-        var obj *model.DIBSuppSvcFamilies
+    case "RelativeTimestamp":
+        var obj *model.RelativeTimestamp
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "ConnectionRequestInformation":
-        var obj *model.ConnectionRequestInformation
+    case "CEMI":
+        var obj *model.CEMI
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "HPAIDiscoveryEndpoint":
-        var obj *model.HPAIDiscoveryEndpoint
+    case "KnxNetIpMessage":
+        var obj *model.KnxNetIpMessage
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "ProjectInstallationIdentifier":
-        var obj *model.ProjectInstallationIdentifier
+    case "DeviceStatus":
+        var obj *model.DeviceStatus
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "CEMIDataFrame":
-        var obj *model.CEMIDataFrame
+    case "IPAddress":
+        var obj *model.IPAddress
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "ServiceId":
-        var obj *model.ServiceId
+    case "CEMIAdditionalInformation":
+        var obj *model.CEMIAdditionalInformation
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "HPAIDataEndpoint":
-        var obj *model.HPAIDataEndpoint
+    case "KnxAddress":
+        var obj *model.KnxAddress
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "RelativeTimestamp":
-        var obj *model.RelativeTimestamp
+    case "ConnectionResponseDataBlock":
+        var obj *model.ConnectionResponseDataBlock
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "CEMI":
-        var obj *model.CEMI
+    case "TunnelingRequestDataBlock":
+        var obj *model.TunnelingRequestDataBlock
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "KnxGroupAddress":
-        var obj *model.KnxGroupAddress
+    case "DIBDeviceInfo":
+        var obj *model.DIBDeviceInfo
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "MACAddress":
-        var obj *model.MACAddress
+    case "DeviceConfigurationRequestDataBlock":
+        var obj *model.DeviceConfigurationRequestDataBlock
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "KnxNetIpMessage":
-        var obj *model.KnxNetIpMessage
+    case "DIBSuppSvcFamilies":
+        var obj *model.DIBSuppSvcFamilies
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "CEMIFrame":
-        var obj *model.CEMIFrame
+    case "KnxGroupAddress":
+        var obj *model.KnxGroupAddress
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "DeviceStatus":
-        var obj *model.DeviceStatus
+    case "MACAddress":
+        var obj *model.MACAddress
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
-    case "IPAddress":
-        var obj *model.IPAddress
+    case "CEMIFrame":
+        var obj *model.CEMIFrame
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
index b83fc96..2a96408 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
@@ -29,7 +29,7 @@ import (
 // The data-structure of this message
 type DIBDeviceInfo struct {
     DescriptionType uint8
-    KnxMedium uint8
+    KnxMedium KnxMedium
     DeviceStatus *DeviceStatus
     KnxAddress *KnxAddress
     ProjectInstallationIdentifier *ProjectInstallationIdentifier
@@ -48,7 +48,7 @@ type IDIBDeviceInfo interface {
     xml.Marshaler
 }
 
-func NewDIBDeviceInfo(descriptionType uint8, knxMedium uint8, deviceStatus *DeviceStatus, knxAddress *KnxAddress, projectInstallationIdentifier *ProjectInstallationIdentifier, knxNetIpDeviceSerialNumber []int8, knxNetIpDeviceMulticastAddress *IPAddress, knxNetIpDeviceMacAddress *MACAddress, deviceFriendlyName []int8) *DIBDeviceInfo {
+func NewDIBDeviceInfo(descriptionType uint8, knxMedium KnxMedium, deviceStatus *DeviceStatus, knxAddress *KnxAddress, projectInstallationIdentifier *ProjectInstallationIdentifier, knxNetIpDeviceSerialNumber []int8, knxNetIpDeviceMulticastAddress *IPAddress, knxNetIpDeviceMacAddress *MACAddress, deviceFriendlyName []int8) *DIBDeviceInfo {
     return &DIBDeviceInfo{DescriptionType: descriptionType, KnxMedium: knxMedium, DeviceStatus: deviceStatus, KnxAddress: knxAddress, ProjectInstallationIdentifier: projectInstallationIdentifier, KnxNetIpDeviceSerialNumber: knxNetIpDeviceSerialNumber, KnxNetIpDeviceMulticastAddress: knxNetIpDeviceMulticastAddress, KnxNetIpDeviceMacAddress: knxNetIpDeviceMacAddress, DeviceFriendlyName: deviceFriendlyName}
 }
 
@@ -74,7 +74,7 @@ func (m *DIBDeviceInfo) LengthInBits() uint16 {
     // Simple field (descriptionType)
     lengthInBits += 8
 
-    // Simple field (knxMedium)
+    // Enum Field (knxMedium)
     lengthInBits += 8
 
     // Simple field (deviceStatus)
@@ -123,8 +123,8 @@ func DIBDeviceInfoParse(io *utils.ReadBuffer) (*DIBDeviceInfo, error) {
         return nil, errors.New("Error parsing 'descriptionType' field " + _descriptionTypeErr.Error())
     }
 
-    // Simple Field (knxMedium)
-    knxMedium, _knxMediumErr := io.ReadUint8(8)
+    // Enum field (knxMedium)
+    knxMedium, _knxMediumErr := KnxMediumParse(io)
     if _knxMediumErr != nil {
         return nil, errors.New("Error parsing 'knxMedium' field " + _knxMediumErr.Error())
     }
@@ -201,9 +201,9 @@ func (m *DIBDeviceInfo) Serialize(io utils.WriteBuffer) error {
         return errors.New("Error serializing 'descriptionType' field " + _descriptionTypeErr.Error())
     }
 
-    // Simple Field (knxMedium)
-    knxMedium := uint8(m.KnxMedium)
-    _knxMediumErr := io.WriteUint8(8, (knxMedium))
+    // Enum field (knxMedium)
+    knxMedium := CastKnxMedium(m.KnxMedium)
+    _knxMediumErr := knxMedium.Serialize(io)
     if _knxMediumErr != nil {
         return errors.New("Error serializing 'knxMedium' field " + _knxMediumErr.Error())
     }
@@ -283,7 +283,7 @@ func (m *DIBDeviceInfo) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
                 }
                 m.DescriptionType = data
             case "knxMedium":
-                var data uint8
+                var data KnxMedium
                 if err := d.DecodeElement(&data, &tok); err != nil {
                     return err
                 }
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
index 74285bc..6253750 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
@@ -137,6 +137,82 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcSINT(value), nil
+        case formatName == "B5N3": // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(3); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (a)
+            a, _aErr := io.ReadBit()
+            if _aErr != nil {
+                return nil, errors.New("Error parsing 'a' field " + _aErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(a)
+
+            // Simple Field (b)
+            b, _bErr := io.ReadBit()
+            if _bErr != nil {
+                return nil, errors.New("Error parsing 'b' field " + _bErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(b)
+
+            // Simple Field (c)
+            c, _cErr := io.ReadBit()
+            if _cErr != nil {
+                return nil, errors.New("Error parsing 'c' field " + _cErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(c)
+
+            // Simple Field (d)
+            d, _dErr := io.ReadBit()
+            if _dErr != nil {
+                return nil, errors.New("Error parsing 'd' field " + _dErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(d)
+
+            // Simple Field (e)
+            e, _eErr := io.ReadBit()
+            if _eErr != nil {
+                return nil, errors.New("Error parsing 'e' field " + _eErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(e)
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadInt8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            _map["Struct"] = values.NewPlcSINT(value)
+            return values.NewPlcStruct(_map), nil
+        case formatName == "U16": // UINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint16(16)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUINT(value), nil
+        case formatName == "V16": // INT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadInt16(16)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcINT(value), nil
         case formatName == "F16": // REAL
 
             // Reserved Field (Just skip the bytes)
@@ -210,6 +286,11 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(4); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
             // Simple Field (month)
             month, _monthErr := io.ReadUint8(4)
             if _monthErr != nil {
@@ -2873,11 +2954,11 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
             _map["Struct"] = values.NewPlcUSINT(version)
 
             // Simple Field (medium)
-            medium, _mediumErr := io.ReadInt8(8)
+            medium, _mediumErr := io.ReadUint8(8)
             if _mediumErr != nil {
                 return nil, errors.New("Error parsing 'medium' field " + _mediumErr.Error())
             }
-            _map["Struct"] = values.NewPlcSINT(medium)
+            _map["Struct"] = values.NewPlcUSINT(medium)
             return values.NewPlcStruct(_map), nil
         case formatName == "A8A8A8A8": // Struct
             _map := map[string]api.PlcValue{}
@@ -3388,6 +3469,64 @@ func KnxDatapointSerialize(io *utils.WriteBuffer, value api.PlcValue, formatName
             if _err := io.WriteInt8(8, value.GetInt8()); _err != nil {
                 return errors.New("Error serializing 'value' field " + _err.Error())
             }
+        case formatName == "B5N3": // Struct
+
+            // Reserved Field (Just skip the bytes)
+            if _err := io.WriteUint8(3, uint8(0x0)); _err != nil {
+                return errors.New("Error serializing reserved field " + _err.Error())
+            }
+
+            // Simple Field (a)
+            if _err := io.WriteBit(value.GetBool()); _err != nil {
+                return errors.New("Error serializing 'a' field " + _err.Error())
+            }
+
+            // Simple Field (b)
+            if _err := io.WriteBit(value.GetBool()); _err != nil {
+                return errors.New("Error serializing 'b' field " + _err.Error())
+            }
+
+            // Simple Field (c)
+            if _err := io.WriteBit(value.GetBool()); _err != nil {
+                return errors.New("Error serializing 'c' field " + _err.Error())
+            }
+
+            // Simple Field (d)
+            if _err := io.WriteBit(value.GetBool()); _err != nil {
+                return errors.New("Error serializing 'd' field " + _err.Error())
+            }
+
+            // Simple Field (e)
+            if _err := io.WriteBit(value.GetBool()); _err != nil {
+                return errors.New("Error serializing 'e' field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            if _err := io.WriteInt8(8, value.GetInt8()); _err != nil {
+                return errors.New("Error serializing 'value' field " + _err.Error())
+            }
+        case formatName == "U16": // UINT
+
+            // Reserved Field (Just skip the bytes)
+            if _err := io.WriteUint8(8, uint8(0x0)); _err != nil {
+                return errors.New("Error serializing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            if _err := io.WriteUint16(16, value.GetUint16()); _err != nil {
+                return errors.New("Error serializing 'value' field " + _err.Error())
+            }
+        case formatName == "V16": // INT
+
+            // Reserved Field (Just skip the bytes)
+            if _err := io.WriteUint8(8, uint8(0x0)); _err != nil {
+                return errors.New("Error serializing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            if _err := io.WriteInt16(16, value.GetInt16()); _err != nil {
+                return errors.New("Error serializing 'value' field " + _err.Error())
+            }
         case formatName == "F16": // REAL
 
             // Reserved Field (Just skip the bytes)
@@ -3452,6 +3591,11 @@ func KnxDatapointSerialize(io *utils.WriteBuffer, value api.PlcValue, formatName
                 return errors.New("Error serializing reserved field " + _err.Error())
             }
 
+            // Reserved Field (Just skip the bytes)
+            if _err := io.WriteUint8(4, uint8(0x00)); _err != nil {
+                return errors.New("Error serializing reserved field " + _err.Error())
+            }
+
             // Simple Field (month)
             if _err := io.WriteUint8(4, value.GetUint8()); _err != nil {
                 return errors.New("Error serializing 'month' field " + _err.Error())
@@ -5443,7 +5587,7 @@ func KnxDatapointSerialize(io *utils.WriteBuffer, value api.PlcValue, formatName
             }
 
             // Simple Field (medium)
-            if _err := io.WriteInt8(8, value.GetInt8()); _err != nil {
+            if _err := io.WriteUint8(8, value.GetUint8()); _err != nil {
                 return errors.New("Error serializing 'medium' field " + _err.Error())
             }
         case formatName == "A8A8A8A8": // Struct
diff --git a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
index ae59941..d22fd72 100644
--- a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
+++ b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
@@ -1022,11 +1022,11 @@
             [simple   uint 8  'statusOrCommand']
         ]
         ['U16U32U8N8' Struct
-            [reserved uint 8                    '0x0']
-            [simple   uint 16                   'manufacturerId']
-            [simple   uint 32                   'identNumber']
-            [simple   uint 8                    'version']
-            [enum     SupportedPhysicalMedia    'medium']
+            [reserved uint 8  '0x0']
+            [simple   uint 16 'manufacturerId']
+            [simple   uint 32 'identNumber']
+            [simple   uint 8  'version']
+            [simple   uint 8  'medium']
         ]
         ['A8A8A8A8' Struct
             [reserved uint 8  '0x0']
diff --git a/protocols/knxnetip/src/test/resources/protocols/knxnetip/ParserSerializerTestsuite.xml b/protocols/knxnetip/src/test/resources/protocols/knxnetip/ParserSerializerTestsuite.xml
index 90217fe..2eae8b6 100644
--- a/protocols/knxnetip/src/test/resources/protocols/knxnetip/ParserSerializerTestsuite.xml
+++ b/protocols/knxnetip/src/test/resources/protocols/knxnetip/ParserSerializerTestsuite.xml
@@ -146,7 +146,7 @@
         </hpaiControlEndpoint>
         <dibDeviceInfo className="org.apache.plc4x.java.knxnetip.readwrite.DIBDeviceInfo">
           <descriptionType>1</descriptionType>
-          <knxMedium>2</knxMedium>
+          <knxMedium>MEDIUM_TP1</knxMedium>
           <deviceStatus className="org.apache.plc4x.java.knxnetip.readwrite.DeviceStatus">
             <programMode>false</programMode>
           </deviceStatus>
@@ -211,7 +211,7 @@
       <DescriptionResponse className="org.apache.plc4x.java.knxnetip.readwrite.DescriptionResponse">
         <dibDeviceInfo className="org.apache.plc4x.java.knxnetip.readwrite.DIBDeviceInfo">
           <descriptionType>1</descriptionType>
-          <knxMedium>2</knxMedium>
+          <knxMedium>MEDIUM_TP1</knxMedium>
           <deviceStatus className="org.apache.plc4x.java.knxnetip.readwrite.DeviceStatus">
             <programMode>false</programMode>
           </deviceStatus>