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

[plc4x] branch develop updated (ce60af02f5 -> 0f46d4d6d3)

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

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


    from ce60af02f5 fix(plc4py): added PlcDriver and moved Mock Driver to plugin
     new a2b633299a fix(bacnet): fixed offset for service request
     new 0f46d4d6d3 feat(bacnet): added support for more read replies

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:
 .../plc4go/bacnetip/readwrite/ParserHelper.go      |  12 +-
 .../plc4go/bacnetip/readwrite/XmlParserHelper.go   |  14 +-
 .../readwrite/model/APDUConfirmedRequest.go        |   2 +-
 .../readwrite/model/BACnetConstructedData.go       |   2 +
 .../model/BACnetConstructedDataElement.go          |   6 +-
 ...onstructedDataListOfObjectPropertyReferences.go | 219 ++++++++++
 .../model/BACnetDeviceObjectPropertyReference.go   |  81 +---
 ...BACnetDeviceObjectPropertyReferenceEnclosed.go} | 125 ++----
 .../BACnetNotificationParametersBufferReady.go     |  14 +-
 ...CnetNotificationParametersExtendedParameters.go |  16 +-
 .../bacnetip/readwrite/model/StaticHelper.go       |   4 +-
 .../bacnetip/readwrite/utils/StaticHelper.java     | 479 ++++++++++++++++++++-
 .../plc4x/java/bacnetip/RandomPackagesTest.java    |   7 +-
 .../plc4x/java/bacnetip/TrickyPackagesTest.java    | 111 +++++
 .../resources/protocols/bacnetip/bacnetip.mspec    |  47 +-
 15 files changed, 917 insertions(+), 222 deletions(-)
 create mode 100644 plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataListOfObjectPropertyReferences.go
 copy plc4go/internal/plc4go/bacnetip/readwrite/model/{BACnetDateTime.go => BACnetDeviceObjectPropertyReferenceEnclosed.go} (53%)
 create mode 100644 plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/TrickyPackagesTest.java


[plc4x] 02/02: feat(bacnet): added support for more read replies

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

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

commit 0f46d4d6d3abf2b662ab7822d39acfb6df97cc2e
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Apr 28 14:07:26 2022 +0200

    feat(bacnet): added support for more read replies
    
    fix(bacnet): fixed a issue with contructed elements of length six
---
 .../plc4go/bacnetip/readwrite/ParserHelper.go      |  12 +-
 .../plc4go/bacnetip/readwrite/XmlParserHelper.go   |  14 +-
 .../readwrite/model/BACnetConstructedData.go       |   2 +
 .../model/BACnetConstructedDataElement.go          |   6 +-
 ...onstructedDataListOfObjectPropertyReferences.go | 219 ++++++++++
 .../model/BACnetDeviceObjectPropertyReference.go   |  81 +---
 .../BACnetDeviceObjectPropertyReferenceEnclosed.go | 229 ++++++++++
 .../BACnetNotificationParametersBufferReady.go     |  14 +-
 ...CnetNotificationParametersExtendedParameters.go |  16 +-
 .../bacnetip/readwrite/model/StaticHelper.go       |   4 +-
 .../bacnetip/readwrite/utils/StaticHelper.java     | 479 ++++++++++++++++++++-
 .../plc4x/java/bacnetip/RandomPackagesTest.java    |   7 +-
 .../plc4x/java/bacnetip/TrickyPackagesTest.java    | 111 +++++
 .../resources/protocols/bacnetip/bacnetip.mspec    |  45 +-
 14 files changed, 1099 insertions(+), 140 deletions(-)

diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
index 7011aaa8cf..dcb7e2b0b8 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
@@ -92,6 +92,12 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io util
 		return model.BACnetServiceAckAtomicReadFileStreamOrRecordParse(io)
 	case "NPDUControl":
 		return model.NPDUControlParse(io)
+	case "BACnetDeviceObjectPropertyReferenceEnclosed":
+		tagNumber, err := utils.StrToUint8(arguments[0])
+		if err != nil {
+			return nil, errors.Wrap(err, "Error parsing")
+		}
+		return model.BACnetDeviceObjectPropertyReferenceEnclosedParse(io, tagNumber)
 	case "BACnetPropertyStates":
 		tagNumber, err := utils.StrToUint8(arguments[0])
 		if err != nil {
@@ -201,11 +207,7 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io util
 		}
 		return model.BACnetTagPayloadBitStringParse(io, actualLength)
 	case "BACnetDeviceObjectPropertyReference":
-		tagNumber, err := utils.StrToUint8(arguments[0])
-		if err != nil {
-			return nil, errors.Wrap(err, "Error parsing")
-		}
-		return model.BACnetDeviceObjectPropertyReferenceParse(io, tagNumber)
+		return model.BACnetDeviceObjectPropertyReferenceParse(io)
 	case "BACnetConstructedDataElement":
 		objectType := model.BACnetObjectTypeByName(arguments[0])
 		var propertyIdentifier model.BACnetContextTagPropertyIdentifier
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
index 7e8c5b3364..0b5c810e71 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
@@ -109,6 +109,13 @@ func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string, parser
 		return model.BACnetServiceAckAtomicReadFileStreamOrRecordParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "NPDUControl":
 		return model.NPDUControlParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+	case "BACnetDeviceObjectPropertyReferenceEnclosed":
+		parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 8)
+		if err != nil {
+			return nil, err
+		}
+		tagNumber := uint8(parsedUint0)
+		return model.BACnetDeviceObjectPropertyReferenceEnclosedParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), tagNumber)
 	case "BACnetPropertyStates":
 		parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 8)
 		if err != nil {
@@ -232,12 +239,7 @@ func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string, parser
 		actualLength := uint32(parsedUint0)
 		return model.BACnetTagPayloadBitStringParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), actualLength)
 	case "BACnetDeviceObjectPropertyReference":
-		parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 8)
-		if err != nil {
-			return nil, err
-		}
-		tagNumber := uint8(parsedUint0)
-		return model.BACnetDeviceObjectPropertyReferenceParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), tagNumber)
+		return model.BACnetDeviceObjectPropertyReferenceParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "BACnetConstructedDataElement":
 		objectType := model.BACnetObjectTypeByName(parserArguments[0])
 		// TODO: find a way to parse the sub types
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedData.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedData.go
index efc72bb8f4..d181657104 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedData.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedData.go
@@ -187,6 +187,8 @@ func BACnetConstructedDataParse(readBuffer utils.ReadBuffer, tagNumber uint8, ob
 		_child, typeSwitchError = BACnetConstructedDataLifeSafetyZoneParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
 	case true && propertyIdentifierEnum == BACnetPropertyIdentifier_EVENT_TIME_STAMPS: // BACnetConstructedDataEventTimestamps
 		_child, typeSwitchError = BACnetConstructedDataEventTimestampsParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
+	case true && propertyIdentifierEnum == BACnetPropertyIdentifier_LIST_OF_OBJECT_PROPERTY_REFERENCES: // BACnetConstructedDataListOfObjectPropertyReferences
+		_child, typeSwitchError = BACnetConstructedDataListOfObjectPropertyReferencesParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
 	case true: // BACnetConstructedDataUnspecified
 		_child, typeSwitchError = BACnetConstructedDataUnspecifiedParse(readBuffer, tagNumber, objectType, propertyIdentifierArgument)
 	default:
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
index 1ff6ac7969..dbe1423b80 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
@@ -122,7 +122,7 @@ func (m *BACnetConstructedDataElement) GetIsConstructedData() bool {
 	_ = contextTag
 	constructedData := m.ConstructedData
 	_ = constructedData
-	return bool(bool(!(m.GetIsApplicationTag())) && bool(bool((m.GetPeekedTagHeader().GetActualLength()) == (0x6))))
+	return bool(bool(!(m.GetIsApplicationTag())) && bool(bool((m.GetPeekedTagHeader().GetLengthValueType()) == (0x6))))
 }
 
 func (m *BACnetConstructedDataElement) GetIsContextTag() bool {
@@ -222,7 +222,7 @@ func BACnetConstructedDataElementParse(readBuffer utils.ReadBuffer, objectType B
 	_ = isApplicationTag
 
 	// Virtual field
-	_isConstructedData := bool(!(isApplicationTag)) && bool(bool((peekedTagHeader.GetActualLength()) == (0x6)))
+	_isConstructedData := bool(!(isApplicationTag)) && bool(bool((peekedTagHeader.GetLengthValueType()) == (0x6)))
 	isConstructedData := bool(_isConstructedData)
 	_ = isConstructedData
 
@@ -259,7 +259,7 @@ func BACnetConstructedDataElementParse(readBuffer utils.ReadBuffer, objectType B
 		if pullErr := readBuffer.PullContext("contextTag"); pullErr != nil {
 			return nil, pullErr
 		}
-		_val, _err := BACnetContextTagParse(readBuffer, peekedTagNumber, GuessDataType(objectType))
+		_val, _err := BACnetContextTagParse(readBuffer, peekedTagNumber, GuessDataType(objectType, propertyIdentifier))
 		switch {
 		case errors.Is(_err, utils.ParseAssertError{}) || errors.Is(_err, io.EOF):
 			readBuffer.Reset(currentPos)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataListOfObjectPropertyReferences.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataListOfObjectPropertyReferences.go
new file mode 100644
index 0000000000..3b5759d54e
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataListOfObjectPropertyReferences.go
@@ -0,0 +1,219 @@
+/*
+ * 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 model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// BACnetConstructedDataListOfObjectPropertyReferences is the data-structure of this message
+type BACnetConstructedDataListOfObjectPropertyReferences struct {
+	*BACnetConstructedData
+	References []*BACnetDeviceObjectPropertyReference
+
+	// Arguments.
+	TagNumber                  uint8
+	PropertyIdentifierArgument BACnetContextTagPropertyIdentifier
+}
+
+// IBACnetConstructedDataListOfObjectPropertyReferences is the corresponding interface of BACnetConstructedDataListOfObjectPropertyReferences
+type IBACnetConstructedDataListOfObjectPropertyReferences interface {
+	IBACnetConstructedData
+	// GetReferences returns References (property field)
+	GetReferences() []*BACnetDeviceObjectPropertyReference
+	// GetLengthInBytes returns the length in bytes
+	GetLengthInBytes() uint16
+	// GetLengthInBits returns the length in bits
+	GetLengthInBits() uint16
+	// Serialize serializes this type
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for discriminator values.
+///////////////////////
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) GetObjectType() BACnetObjectType {
+	return 0
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) InitializeParent(parent *BACnetConstructedData, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) {
+	m.BACnetConstructedData.OpeningTag = openingTag
+	m.BACnetConstructedData.ClosingTag = closingTag
+}
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) GetParent() *BACnetConstructedData {
+	return m.BACnetConstructedData
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) GetReferences() []*BACnetDeviceObjectPropertyReference {
+	return m.References
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetConstructedDataListOfObjectPropertyReferences factory function for BACnetConstructedDataListOfObjectPropertyReferences
+func NewBACnetConstructedDataListOfObjectPropertyReferences(references []*BACnetDeviceObjectPropertyReference, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataListOfObjectPropertyReferences {
+	_result := &BACnetConstructedDataListOfObjectPropertyReferences{
+		References:            references,
+		BACnetConstructedData: NewBACnetConstructedData(openingTag, closingTag, tagNumber, propertyIdentifierArgument),
+	}
+	_result.Child = _result
+	return _result
+}
+
+func CastBACnetConstructedDataListOfObjectPropertyReferences(structType interface{}) *BACnetConstructedDataListOfObjectPropertyReferences {
+	if casted, ok := structType.(BACnetConstructedDataListOfObjectPropertyReferences); ok {
+		return &casted
+	}
+	if casted, ok := structType.(*BACnetConstructedDataListOfObjectPropertyReferences); ok {
+		return casted
+	}
+	if casted, ok := structType.(BACnetConstructedData); ok {
+		return CastBACnetConstructedDataListOfObjectPropertyReferences(casted.Child)
+	}
+	if casted, ok := structType.(*BACnetConstructedData); ok {
+		return CastBACnetConstructedDataListOfObjectPropertyReferences(casted.Child)
+	}
+	return nil
+}
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) GetTypeName() string {
+	return "BACnetConstructedDataListOfObjectPropertyReferences"
+}
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(m.GetParentLengthInBits())
+
+	// Array field
+	if len(m.References) > 0 {
+		for _, element := range m.References {
+			lengthInBits += element.GetLengthInBits()
+		}
+	}
+
+	return lengthInBits
+}
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func BACnetConstructedDataListOfObjectPropertyReferencesParse(readBuffer utils.ReadBuffer, tagNumber uint8, objectType BACnetObjectType, propertyIdentifierArgument *BACnetContextTagPropertyIdentifier) (*BACnetConstructedDataListOfObjectPropertyReferences, error) {
+	if pullErr := readBuffer.PullContext("BACnetConstructedDataListOfObjectPropertyReferences"); pullErr != nil {
+		return nil, pullErr
+	}
+	currentPos := readBuffer.GetPos()
+	_ = currentPos
+
+	// Array field (references)
+	if pullErr := readBuffer.PullContext("references", utils.WithRenderAsList(true)); pullErr != nil {
+		return nil, pullErr
+	}
+	// Terminated array
+	references := make([]*BACnetDeviceObjectPropertyReference, 0)
+	{
+		for !bool(IsBACnetConstructedDataClosingTag(readBuffer, false, tagNumber)) {
+			_item, _err := BACnetDeviceObjectPropertyReferenceParse(readBuffer)
+			if _err != nil {
+				return nil, errors.Wrap(_err, "Error parsing 'references' field")
+			}
+			references = append(references, CastBACnetDeviceObjectPropertyReference(_item))
+
+		}
+	}
+	if closeErr := readBuffer.CloseContext("references", utils.WithRenderAsList(true)); closeErr != nil {
+		return nil, closeErr
+	}
+
+	if closeErr := readBuffer.CloseContext("BACnetConstructedDataListOfObjectPropertyReferences"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Create a partially initialized instance
+	_child := &BACnetConstructedDataListOfObjectPropertyReferences{
+		References:            references,
+		BACnetConstructedData: &BACnetConstructedData{},
+	}
+	_child.BACnetConstructedData.Child = _child
+	return _child, nil
+}
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) Serialize(writeBuffer utils.WriteBuffer) error {
+	ser := func() error {
+		if pushErr := writeBuffer.PushContext("BACnetConstructedDataListOfObjectPropertyReferences"); pushErr != nil {
+			return pushErr
+		}
+
+		// Array Field (references)
+		if m.References != nil {
+			if pushErr := writeBuffer.PushContext("references", utils.WithRenderAsList(true)); pushErr != nil {
+				return pushErr
+			}
+			for _, _element := range m.References {
+				_elementErr := _element.Serialize(writeBuffer)
+				if _elementErr != nil {
+					return errors.Wrap(_elementErr, "Error serializing 'references' field")
+				}
+			}
+			if popErr := writeBuffer.PopContext("references", utils.WithRenderAsList(true)); popErr != nil {
+				return popErr
+			}
+		}
+
+		if popErr := writeBuffer.PopContext("BACnetConstructedDataListOfObjectPropertyReferences"); popErr != nil {
+			return popErr
+		}
+		return nil
+	}
+	return m.SerializeParent(writeBuffer, m, ser)
+}
+
+func (m *BACnetConstructedDataListOfObjectPropertyReferences) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	buffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := m.Serialize(buffer); err != nil {
+		return err.Error()
+	}
+	return buffer.GetBox().String()
+}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectPropertyReference.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectPropertyReference.go
index d6ecfef12f..0297aae1dc 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectPropertyReference.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectPropertyReference.go
@@ -29,21 +29,14 @@ import (
 
 // BACnetDeviceObjectPropertyReference is the data-structure of this message
 type BACnetDeviceObjectPropertyReference struct {
-	OpeningTag         *BACnetOpeningTag
 	ObjectIdentifier   *BACnetContextTagObjectIdentifier
 	PropertyIdentifier *BACnetContextTagPropertyIdentifier
 	ArrayIndex         *BACnetContextTagUnsignedInteger
 	DeviceIdentifier   *BACnetContextTagObjectIdentifier
-	ClosingTag         *BACnetClosingTag
-
-	// Arguments.
-	TagNumber uint8
 }
 
 // IBACnetDeviceObjectPropertyReference is the corresponding interface of BACnetDeviceObjectPropertyReference
 type IBACnetDeviceObjectPropertyReference interface {
-	// GetOpeningTag returns OpeningTag (property field)
-	GetOpeningTag() *BACnetOpeningTag
 	// GetObjectIdentifier returns ObjectIdentifier (property field)
 	GetObjectIdentifier() *BACnetContextTagObjectIdentifier
 	// GetPropertyIdentifier returns PropertyIdentifier (property field)
@@ -52,8 +45,6 @@ type IBACnetDeviceObjectPropertyReference interface {
 	GetArrayIndex() *BACnetContextTagUnsignedInteger
 	// GetDeviceIdentifier returns DeviceIdentifier (property field)
 	GetDeviceIdentifier() *BACnetContextTagObjectIdentifier
-	// GetClosingTag returns ClosingTag (property field)
-	GetClosingTag() *BACnetClosingTag
 	// GetLengthInBytes returns the length in bytes
 	GetLengthInBytes() uint16
 	// GetLengthInBits returns the length in bits
@@ -67,10 +58,6 @@ type IBACnetDeviceObjectPropertyReference interface {
 /////////////////////// Accessors for property fields.
 ///////////////////////
 
-func (m *BACnetDeviceObjectPropertyReference) GetOpeningTag() *BACnetOpeningTag {
-	return m.OpeningTag
-}
-
 func (m *BACnetDeviceObjectPropertyReference) GetObjectIdentifier() *BACnetContextTagObjectIdentifier {
 	return m.ObjectIdentifier
 }
@@ -87,18 +74,14 @@ func (m *BACnetDeviceObjectPropertyReference) GetDeviceIdentifier() *BACnetConte
 	return m.DeviceIdentifier
 }
 
-func (m *BACnetDeviceObjectPropertyReference) GetClosingTag() *BACnetClosingTag {
-	return m.ClosingTag
-}
-
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
 // NewBACnetDeviceObjectPropertyReference factory function for BACnetDeviceObjectPropertyReference
-func NewBACnetDeviceObjectPropertyReference(openingTag *BACnetOpeningTag, objectIdentifier *BACnetContextTagObjectIdentifier, propertyIdentifier *BACnetContextTagPropertyIdentifier, arrayIndex *BACnetContextTagUnsignedInteger, deviceIdentifier *BACnetContextTagObjectIdentifier, closingTag *BACnetClosingTag, tagNumber uint8) *BACnetDeviceObjectPropertyReference {
-	return &BACnetDeviceObjectPropertyReference{OpeningTag: openingTag, ObjectIdentifier: objectIdentifier, PropertyIdentifier: propertyIdentifier, ArrayIndex: arrayIndex, DeviceIdentifier: deviceIdentifier, ClosingTag: closingTag, TagNumber: tagNumber}
+func NewBACnetDeviceObjectPropertyReference(objectIdentifier *BACnetContextTagObjectIdentifier, propertyIdentifier *BACnetContextTagPropertyIdentifier, arrayIndex *BACnetContextTagUnsignedInteger, deviceIdentifier *BACnetContextTagObjectIdentifier) *BACnetDeviceObjectPropertyReference {
+	return &BACnetDeviceObjectPropertyReference{ObjectIdentifier: objectIdentifier, PropertyIdentifier: propertyIdentifier, ArrayIndex: arrayIndex, DeviceIdentifier: deviceIdentifier}
 }
 
 func CastBACnetDeviceObjectPropertyReference(structType interface{}) *BACnetDeviceObjectPropertyReference {
@@ -122,9 +105,6 @@ func (m *BACnetDeviceObjectPropertyReference) GetLengthInBits() uint16 {
 func (m *BACnetDeviceObjectPropertyReference) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(0)
 
-	// Simple field (openingTag)
-	lengthInBits += m.OpeningTag.GetLengthInBits()
-
 	// Simple field (objectIdentifier)
 	lengthInBits += m.ObjectIdentifier.GetLengthInBits()
 
@@ -141,9 +121,6 @@ func (m *BACnetDeviceObjectPropertyReference) GetLengthInBitsConditional(lastIte
 		lengthInBits += (*m.DeviceIdentifier).GetLengthInBits()
 	}
 
-	// Simple field (closingTag)
-	lengthInBits += m.ClosingTag.GetLengthInBits()
-
 	return lengthInBits
 }
 
@@ -151,26 +128,13 @@ func (m *BACnetDeviceObjectPropertyReference) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
 
-func BACnetDeviceObjectPropertyReferenceParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetDeviceObjectPropertyReference, error) {
+func BACnetDeviceObjectPropertyReferenceParse(readBuffer utils.ReadBuffer) (*BACnetDeviceObjectPropertyReference, error) {
 	if pullErr := readBuffer.PullContext("BACnetDeviceObjectPropertyReference"); pullErr != nil {
 		return nil, pullErr
 	}
 	currentPos := readBuffer.GetPos()
 	_ = currentPos
 
-	// Simple Field (openingTag)
-	if pullErr := readBuffer.PullContext("openingTag"); pullErr != nil {
-		return nil, pullErr
-	}
-	_openingTag, _openingTagErr := BACnetContextTagParse(readBuffer, uint8(tagNumber), BACnetDataType(BACnetDataType_OPENING_TAG))
-	if _openingTagErr != nil {
-		return nil, errors.Wrap(_openingTagErr, "Error parsing 'openingTag' field")
-	}
-	openingTag := CastBACnetOpeningTag(_openingTag)
-	if closeErr := readBuffer.CloseContext("openingTag"); closeErr != nil {
-		return nil, closeErr
-	}
-
 	// Simple Field (objectIdentifier)
 	if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
 		return nil, pullErr
@@ -239,25 +203,12 @@ func BACnetDeviceObjectPropertyReferenceParse(readBuffer utils.ReadBuffer, tagNu
 		}
 	}
 
-	// Simple Field (closingTag)
-	if pullErr := readBuffer.PullContext("closingTag"); pullErr != nil {
-		return nil, pullErr
-	}
-	_closingTag, _closingTagErr := BACnetContextTagParse(readBuffer, uint8(tagNumber), BACnetDataType(BACnetDataType_CLOSING_TAG))
-	if _closingTagErr != nil {
-		return nil, errors.Wrap(_closingTagErr, "Error parsing 'closingTag' field")
-	}
-	closingTag := CastBACnetClosingTag(_closingTag)
-	if closeErr := readBuffer.CloseContext("closingTag"); closeErr != nil {
-		return nil, closeErr
-	}
-
 	if closeErr := readBuffer.CloseContext("BACnetDeviceObjectPropertyReference"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create the instance
-	return NewBACnetDeviceObjectPropertyReference(openingTag, objectIdentifier, propertyIdentifier, arrayIndex, deviceIdentifier, closingTag, tagNumber), nil
+	return NewBACnetDeviceObjectPropertyReference(objectIdentifier, propertyIdentifier, arrayIndex, deviceIdentifier), nil
 }
 
 func (m *BACnetDeviceObjectPropertyReference) Serialize(writeBuffer utils.WriteBuffer) error {
@@ -265,18 +216,6 @@ func (m *BACnetDeviceObjectPropertyReference) Serialize(writeBuffer utils.WriteB
 		return pushErr
 	}
 
-	// Simple Field (openingTag)
-	if pushErr := writeBuffer.PushContext("openingTag"); pushErr != nil {
-		return pushErr
-	}
-	_openingTagErr := m.OpeningTag.Serialize(writeBuffer)
-	if popErr := writeBuffer.PopContext("openingTag"); popErr != nil {
-		return popErr
-	}
-	if _openingTagErr != nil {
-		return errors.Wrap(_openingTagErr, "Error serializing 'openingTag' field")
-	}
-
 	// Simple Field (objectIdentifier)
 	if pushErr := writeBuffer.PushContext("objectIdentifier"); pushErr != nil {
 		return pushErr
@@ -333,18 +272,6 @@ func (m *BACnetDeviceObjectPropertyReference) Serialize(writeBuffer utils.WriteB
 		}
 	}
 
-	// Simple Field (closingTag)
-	if pushErr := writeBuffer.PushContext("closingTag"); pushErr != nil {
-		return pushErr
-	}
-	_closingTagErr := m.ClosingTag.Serialize(writeBuffer)
-	if popErr := writeBuffer.PopContext("closingTag"); popErr != nil {
-		return popErr
-	}
-	if _closingTagErr != nil {
-		return errors.Wrap(_closingTagErr, "Error serializing 'closingTag' field")
-	}
-
 	if popErr := writeBuffer.PopContext("BACnetDeviceObjectPropertyReference"); popErr != nil {
 		return popErr
 	}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectPropertyReferenceEnclosed.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectPropertyReferenceEnclosed.go
new file mode 100644
index 0000000000..4d6b7fdf52
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDeviceObjectPropertyReferenceEnclosed.go
@@ -0,0 +1,229 @@
+/*
+ * 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 model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// BACnetDeviceObjectPropertyReferenceEnclosed is the data-structure of this message
+type BACnetDeviceObjectPropertyReferenceEnclosed struct {
+	OpeningTag *BACnetOpeningTag
+	Value      *BACnetDeviceObjectPropertyReference
+	ClosingTag *BACnetClosingTag
+
+	// Arguments.
+	TagNumber uint8
+}
+
+// IBACnetDeviceObjectPropertyReferenceEnclosed is the corresponding interface of BACnetDeviceObjectPropertyReferenceEnclosed
+type IBACnetDeviceObjectPropertyReferenceEnclosed interface {
+	// GetOpeningTag returns OpeningTag (property field)
+	GetOpeningTag() *BACnetOpeningTag
+	// GetValue returns Value (property field)
+	GetValue() *BACnetDeviceObjectPropertyReference
+	// GetClosingTag returns ClosingTag (property field)
+	GetClosingTag() *BACnetClosingTag
+	// GetLengthInBytes returns the length in bytes
+	GetLengthInBytes() uint16
+	// GetLengthInBits returns the length in bits
+	GetLengthInBits() uint16
+	// Serialize serializes this type
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) GetOpeningTag() *BACnetOpeningTag {
+	return m.OpeningTag
+}
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) GetValue() *BACnetDeviceObjectPropertyReference {
+	return m.Value
+}
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) GetClosingTag() *BACnetClosingTag {
+	return m.ClosingTag
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetDeviceObjectPropertyReferenceEnclosed factory function for BACnetDeviceObjectPropertyReferenceEnclosed
+func NewBACnetDeviceObjectPropertyReferenceEnclosed(openingTag *BACnetOpeningTag, value *BACnetDeviceObjectPropertyReference, closingTag *BACnetClosingTag, tagNumber uint8) *BACnetDeviceObjectPropertyReferenceEnclosed {
+	return &BACnetDeviceObjectPropertyReferenceEnclosed{OpeningTag: openingTag, Value: value, ClosingTag: closingTag, TagNumber: tagNumber}
+}
+
+func CastBACnetDeviceObjectPropertyReferenceEnclosed(structType interface{}) *BACnetDeviceObjectPropertyReferenceEnclosed {
+	if casted, ok := structType.(BACnetDeviceObjectPropertyReferenceEnclosed); ok {
+		return &casted
+	}
+	if casted, ok := structType.(*BACnetDeviceObjectPropertyReferenceEnclosed); ok {
+		return casted
+	}
+	return nil
+}
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) GetTypeName() string {
+	return "BACnetDeviceObjectPropertyReferenceEnclosed"
+}
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(0)
+
+	// Simple field (openingTag)
+	lengthInBits += m.OpeningTag.GetLengthInBits()
+
+	// Simple field (value)
+	lengthInBits += m.Value.GetLengthInBits()
+
+	// Simple field (closingTag)
+	lengthInBits += m.ClosingTag.GetLengthInBits()
+
+	return lengthInBits
+}
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func BACnetDeviceObjectPropertyReferenceEnclosedParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetDeviceObjectPropertyReferenceEnclosed, error) {
+	if pullErr := readBuffer.PullContext("BACnetDeviceObjectPropertyReferenceEnclosed"); pullErr != nil {
+		return nil, pullErr
+	}
+	currentPos := readBuffer.GetPos()
+	_ = currentPos
+
+	// Simple Field (openingTag)
+	if pullErr := readBuffer.PullContext("openingTag"); pullErr != nil {
+		return nil, pullErr
+	}
+	_openingTag, _openingTagErr := BACnetContextTagParse(readBuffer, uint8(tagNumber), BACnetDataType(BACnetDataType_OPENING_TAG))
+	if _openingTagErr != nil {
+		return nil, errors.Wrap(_openingTagErr, "Error parsing 'openingTag' field")
+	}
+	openingTag := CastBACnetOpeningTag(_openingTag)
+	if closeErr := readBuffer.CloseContext("openingTag"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Simple Field (value)
+	if pullErr := readBuffer.PullContext("value"); pullErr != nil {
+		return nil, pullErr
+	}
+	_value, _valueErr := BACnetDeviceObjectPropertyReferenceParse(readBuffer)
+	if _valueErr != nil {
+		return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
+	}
+	value := CastBACnetDeviceObjectPropertyReference(_value)
+	if closeErr := readBuffer.CloseContext("value"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Simple Field (closingTag)
+	if pullErr := readBuffer.PullContext("closingTag"); pullErr != nil {
+		return nil, pullErr
+	}
+	_closingTag, _closingTagErr := BACnetContextTagParse(readBuffer, uint8(tagNumber), BACnetDataType(BACnetDataType_CLOSING_TAG))
+	if _closingTagErr != nil {
+		return nil, errors.Wrap(_closingTagErr, "Error parsing 'closingTag' field")
+	}
+	closingTag := CastBACnetClosingTag(_closingTag)
+	if closeErr := readBuffer.CloseContext("closingTag"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	if closeErr := readBuffer.CloseContext("BACnetDeviceObjectPropertyReferenceEnclosed"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Create the instance
+	return NewBACnetDeviceObjectPropertyReferenceEnclosed(openingTag, value, closingTag, tagNumber), nil
+}
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) Serialize(writeBuffer utils.WriteBuffer) error {
+	if pushErr := writeBuffer.PushContext("BACnetDeviceObjectPropertyReferenceEnclosed"); pushErr != nil {
+		return pushErr
+	}
+
+	// Simple Field (openingTag)
+	if pushErr := writeBuffer.PushContext("openingTag"); pushErr != nil {
+		return pushErr
+	}
+	_openingTagErr := m.OpeningTag.Serialize(writeBuffer)
+	if popErr := writeBuffer.PopContext("openingTag"); popErr != nil {
+		return popErr
+	}
+	if _openingTagErr != nil {
+		return errors.Wrap(_openingTagErr, "Error serializing 'openingTag' field")
+	}
+
+	// Simple Field (value)
+	if pushErr := writeBuffer.PushContext("value"); pushErr != nil {
+		return pushErr
+	}
+	_valueErr := m.Value.Serialize(writeBuffer)
+	if popErr := writeBuffer.PopContext("value"); popErr != nil {
+		return popErr
+	}
+	if _valueErr != nil {
+		return errors.Wrap(_valueErr, "Error serializing 'value' field")
+	}
+
+	// Simple Field (closingTag)
+	if pushErr := writeBuffer.PushContext("closingTag"); pushErr != nil {
+		return pushErr
+	}
+	_closingTagErr := m.ClosingTag.Serialize(writeBuffer)
+	if popErr := writeBuffer.PopContext("closingTag"); popErr != nil {
+		return popErr
+	}
+	if _closingTagErr != nil {
+		return errors.Wrap(_closingTagErr, "Error serializing 'closingTag' field")
+	}
+
+	if popErr := writeBuffer.PopContext("BACnetDeviceObjectPropertyReferenceEnclosed"); popErr != nil {
+		return popErr
+	}
+	return nil
+}
+
+func (m *BACnetDeviceObjectPropertyReferenceEnclosed) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	buffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := m.Serialize(buffer); err != nil {
+		return err.Error()
+	}
+	return buffer.GetBox().String()
+}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersBufferReady.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersBufferReady.go
index f380e0756d..6d9447fac4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersBufferReady.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersBufferReady.go
@@ -30,7 +30,7 @@ import (
 type BACnetNotificationParametersBufferReady struct {
 	*BACnetNotificationParameters
 	InnerOpeningTag      *BACnetOpeningTag
-	BufferProperty       *BACnetDeviceObjectPropertyReference
+	BufferProperty       *BACnetDeviceObjectPropertyReferenceEnclosed
 	PreviousNotification *BACnetContextTagUnsignedInteger
 	CurrentNotification  *BACnetContextTagUnsignedInteger
 	InnerClosingTag      *BACnetClosingTag
@@ -46,7 +46,7 @@ type IBACnetNotificationParametersBufferReady interface {
 	// GetInnerOpeningTag returns InnerOpeningTag (property field)
 	GetInnerOpeningTag() *BACnetOpeningTag
 	// GetBufferProperty returns BufferProperty (property field)
-	GetBufferProperty() *BACnetDeviceObjectPropertyReference
+	GetBufferProperty() *BACnetDeviceObjectPropertyReferenceEnclosed
 	// GetPreviousNotification returns PreviousNotification (property field)
 	GetPreviousNotification() *BACnetContextTagUnsignedInteger
 	// GetCurrentNotification returns CurrentNotification (property field)
@@ -90,7 +90,7 @@ func (m *BACnetNotificationParametersBufferReady) GetInnerOpeningTag() *BACnetOp
 	return m.InnerOpeningTag
 }
 
-func (m *BACnetNotificationParametersBufferReady) GetBufferProperty() *BACnetDeviceObjectPropertyReference {
+func (m *BACnetNotificationParametersBufferReady) GetBufferProperty() *BACnetDeviceObjectPropertyReferenceEnclosed {
 	return m.BufferProperty
 }
 
@@ -112,7 +112,7 @@ func (m *BACnetNotificationParametersBufferReady) GetInnerClosingTag() *BACnetCl
 ///////////////////////////////////////////////////////////
 
 // NewBACnetNotificationParametersBufferReady factory function for BACnetNotificationParametersBufferReady
-func NewBACnetNotificationParametersBufferReady(innerOpeningTag *BACnetOpeningTag, bufferProperty *BACnetDeviceObjectPropertyReference, previousNotification *BACnetContextTagUnsignedInteger, currentNotification *BACnetContextTagUnsignedInteger, innerClosingTag *BACnetClosingTag, openingTag *BACnetOpeningTag, peekedTagHeader *BACnetTagHeader, closingTag *BACnetClosingTag, tagNumber uint8, objectType BACnetObjectType) *BACnetNotificationParametersBufferReady {
+func NewBACnetNotificationParametersBufferReady(innerOpeningTag *BACnetOpeningTag, bufferProperty *BACnetDeviceObjectPropertyReferenceEnclosed, previousNotification *BACnetContextTagUnsignedInteger, currentNotification *BACnetContextTagUnsignedInteger, innerClosingTag *BACnetClosingTag, openingTag *BACnetOpeningTag, peekedTagHeader *BACnetTagHeader, closingTag *BACnetClosingTag, tagNumber uint8, objectType BACnetObjectType) *BACnetNotificationParametersBufferReady {
 	_result := &BACnetNotificationParametersBufferReady{
 		InnerOpeningTag:              innerOpeningTag,
 		BufferProperty:               bufferProperty,
@@ -198,11 +198,11 @@ func BACnetNotificationParametersBufferReadyParse(readBuffer utils.ReadBuffer, t
 	if pullErr := readBuffer.PullContext("bufferProperty"); pullErr != nil {
 		return nil, pullErr
 	}
-	_bufferProperty, _bufferPropertyErr := BACnetDeviceObjectPropertyReferenceParse(readBuffer, uint8(uint8(0)))
+	_bufferProperty, _bufferPropertyErr := BACnetDeviceObjectPropertyReferenceEnclosedParse(readBuffer, uint8(uint8(0)))
 	if _bufferPropertyErr != nil {
 		return nil, errors.Wrap(_bufferPropertyErr, "Error parsing 'bufferProperty' field")
 	}
-	bufferProperty := CastBACnetDeviceObjectPropertyReference(_bufferProperty)
+	bufferProperty := CastBACnetDeviceObjectPropertyReferenceEnclosed(_bufferProperty)
 	if closeErr := readBuffer.CloseContext("bufferProperty"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -253,7 +253,7 @@ func BACnetNotificationParametersBufferReadyParse(readBuffer utils.ReadBuffer, t
 	// Create a partially initialized instance
 	_child := &BACnetNotificationParametersBufferReady{
 		InnerOpeningTag:              CastBACnetOpeningTag(innerOpeningTag),
-		BufferProperty:               CastBACnetDeviceObjectPropertyReference(bufferProperty),
+		BufferProperty:               CastBACnetDeviceObjectPropertyReferenceEnclosed(bufferProperty),
 		PreviousNotification:         CastBACnetContextTagUnsignedInteger(previousNotification),
 		CurrentNotification:          CastBACnetContextTagUnsignedInteger(currentNotification),
 		InnerClosingTag:              CastBACnetClosingTag(innerClosingTag),
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersExtendedParameters.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersExtendedParameters.go
index ffbbe43b4e..ba32c6ebae 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersExtendedParameters.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersExtendedParameters.go
@@ -43,7 +43,7 @@ type BACnetNotificationParametersExtendedParameters struct {
 	DateValue            *BACnetApplicationTagDate
 	TimeValue            *BACnetApplicationTagTime
 	ObjectIdentifier     *BACnetApplicationTagObjectIdentifier
-	Reference            *BACnetDeviceObjectPropertyReference
+	Reference            *BACnetDeviceObjectPropertyReferenceEnclosed
 	ClosingTag           *BACnetClosingTag
 
 	// Arguments.
@@ -81,7 +81,7 @@ type IBACnetNotificationParametersExtendedParameters interface {
 	// GetObjectIdentifier returns ObjectIdentifier (property field)
 	GetObjectIdentifier() *BACnetApplicationTagObjectIdentifier
 	// GetReference returns Reference (property field)
-	GetReference() *BACnetDeviceObjectPropertyReference
+	GetReference() *BACnetDeviceObjectPropertyReferenceEnclosed
 	// GetClosingTag returns ClosingTag (property field)
 	GetClosingTag() *BACnetClosingTag
 	// GetLengthInBytes returns the length in bytes
@@ -153,7 +153,7 @@ func (m *BACnetNotificationParametersExtendedParameters) GetObjectIdentifier() *
 	return m.ObjectIdentifier
 }
 
-func (m *BACnetNotificationParametersExtendedParameters) GetReference() *BACnetDeviceObjectPropertyReference {
+func (m *BACnetNotificationParametersExtendedParameters) GetReference() *BACnetDeviceObjectPropertyReferenceEnclosed {
 	return m.Reference
 }
 
@@ -167,7 +167,7 @@ func (m *BACnetNotificationParametersExtendedParameters) GetClosingTag() *BACnet
 ///////////////////////////////////////////////////////////
 
 // NewBACnetNotificationParametersExtendedParameters factory function for BACnetNotificationParametersExtendedParameters
-func NewBACnetNotificationParametersExtendedParameters(openingTag *BACnetOpeningTag, nullValue *BACnetApplicationTagNull, realValue *BACnetApplicationTagReal, unsignedValue *BACnetApplicationTagUnsignedInteger, booleanValue *BACnetApplicationTagBoolean, integerValue *BACnetApplicationTagSignedInteger, doubleValue *BACnetApplicationTagDouble, octetStringValue *BACnetApplicationTagOctetString, characterStringValue *BACnetApplicationTagCharacterString, bitStringValue *BACnetApplicationTagBi [...]
+func NewBACnetNotificationParametersExtendedParameters(openingTag *BACnetOpeningTag, nullValue *BACnetApplicationTagNull, realValue *BACnetApplicationTagReal, unsignedValue *BACnetApplicationTagUnsignedInteger, booleanValue *BACnetApplicationTagBoolean, integerValue *BACnetApplicationTagSignedInteger, doubleValue *BACnetApplicationTagDouble, octetStringValue *BACnetApplicationTagOctetString, characterStringValue *BACnetApplicationTagCharacterString, bitStringValue *BACnetApplicationTagBi [...]
 	return &BACnetNotificationParametersExtendedParameters{OpeningTag: openingTag, NullValue: nullValue, RealValue: realValue, UnsignedValue: unsignedValue, BooleanValue: booleanValue, IntegerValue: integerValue, DoubleValue: doubleValue, OctetStringValue: octetStringValue, CharacterStringValue: characterStringValue, BitStringValue: bitStringValue, EnumeratedValue: enumeratedValue, DateValue: dateValue, TimeValue: timeValue, ObjectIdentifier: objectIdentifier, Reference: reference, ClosingT [...]
 }
 
@@ -569,20 +569,20 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 	}
 
 	// Optional Field (reference) (Can be skipped, if a given expression evaluates to false)
-	var reference *BACnetDeviceObjectPropertyReference = nil
+	var reference *BACnetDeviceObjectPropertyReferenceEnclosed = nil
 	{
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("reference"); pullErr != nil {
 			return nil, pullErr
 		}
-		_val, _err := BACnetDeviceObjectPropertyReferenceParse(readBuffer, uint8(0))
+		_val, _err := BACnetDeviceObjectPropertyReferenceEnclosedParse(readBuffer, uint8(0))
 		switch {
 		case errors.Is(_err, utils.ParseAssertError{}) || errors.Is(_err, io.EOF):
 			readBuffer.Reset(currentPos)
 		case _err != nil:
 			return nil, errors.Wrap(_err, "Error parsing 'reference' field")
 		default:
-			reference = CastBACnetDeviceObjectPropertyReference(_val)
+			reference = CastBACnetDeviceObjectPropertyReferenceEnclosed(_val)
 			if closeErr := readBuffer.CloseContext("reference"); closeErr != nil {
 				return nil, closeErr
 			}
@@ -836,7 +836,7 @@ func (m *BACnetNotificationParametersExtendedParameters) Serialize(writeBuffer u
 	}
 
 	// Optional Field (reference) (Can be skipped, if the value is null)
-	var reference *BACnetDeviceObjectPropertyReference = nil
+	var reference *BACnetDeviceObjectPropertyReferenceEnclosed = nil
 	if m.Reference != nil {
 		if pushErr := writeBuffer.PushContext("reference"); pushErr != nil {
 			return pushErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
index 8093bd4974..4b95d7e8c5 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
@@ -292,9 +292,9 @@ func IsBACnetConstructedDataClosingTag(readBuffer utils.ReadBuffer, instantTermi
 	return foundOurClosingTag
 }
 
-func GuessDataType(objectType BACnetObjectType) BACnetDataType {
+func GuessDataType(objectType BACnetObjectType, propertyIdentifier *BACnetContextTagPropertyIdentifier) BACnetDataType {
 	// TODO: implement me
-	return BACnetDataType_BACNET_PROPERTY_IDENTIFIER
+	return BACnetDataType_ENUMERATED
 }
 
 func ParseVarUint(data []byte) uint32 {
diff --git a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/readwrite/utils/StaticHelper.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/readwrite/utils/StaticHelper.java
index 1af8c86af1..67bf86cc69 100644
--- a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/readwrite/utils/StaticHelper.java
+++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/readwrite/utils/StaticHelper.java
@@ -258,7 +258,467 @@ public class StaticHelper {
         }
     }
 
-    public static BACnetDataType guessDataType(BACnetObjectType objectType) {
+    public static BACnetDataType guessDataType(BACnetObjectType objectType, BACnetContextTagPropertyIdentifier propertyIdentifier) {
+        switch (propertyIdentifier.getPropertyIdentifier()) {
+            case ABSENTEE_LIMIT:
+            case ACCEPTED_MODES:
+            case ACCESS_ALARM_EVENTS:
+            case ACCESS_DOORS:
+            case ACCESS_EVENT:
+            case ACCESS_EVENT_AUTHENTICATION_FACTOR:
+            case ACCESS_EVENT_CREDENTIAL:
+            case ACCESS_EVENT_TAG:
+            case ACCESS_EVENT_TIME:
+            case ACCESS_TRANSACTION_EVENTS:
+            case ACCOMPANIMENT:
+            case ACCOMPANIMENT_TIME:
+            case ACK_REQUIRED:
+            case ACKED_TRANSITIONS:
+            case ACTION:
+            case ACTION_TEXT:
+            case ACTIVATION_TIME:
+            case ACTIVE_AUTHENTICATION_POLICY:
+            case ACTIVE_COV_MULTIPLE_SUBSCRIPTIONS:
+            case ACTIVE_COV_SUBSCRIPTIONS:
+            case ACTIVE_TEXT:
+            case ACTIVE_VT_SESSIONS:
+            case ACTUAL_SHED_LEVEL:
+            case ADJUST_VALUE:
+            case ALARM_VALUE:
+            case ALARM_VALUES:
+            case ALIGN_INTERVALS:
+            case ALL:
+            case ALL_WRITES_SUCCESSFUL:
+            case ALLOW_GROUP_DELAY_INHIBIT:
+            case APDU_LENGTH:
+            case APDU_SEGMENT_TIMEOUT:
+            case APDU_TIMEOUT:
+            case APPLICATION_SOFTWARE_VERSION:
+            case ARCHIVE:
+            case ASSIGNED_ACCESS_RIGHTS:
+            case ASSIGNED_LANDING_CALLS:
+            case ATTEMPTED_SAMPLES:
+            case AUTHENTICATION_FACTORS:
+            case AUTHENTICATION_POLICY_LIST:
+            case AUTHENTICATION_POLICY_NAMES:
+            case AUTHENTICATION_STATUS:
+            case AUTHORIZATION_EXEMPTIONS:
+            case AUTHORIZATION_MODE:
+            case AUTO_SLAVE_DISCOVERY:
+            case AVERAGE_VALUE:
+            case BACKUP_AND_RESTORE_STATE:
+            case BACKUP_FAILURE_TIMEOUT:
+            case BACKUP_PREPARATION_TIME:
+            case BACNET_IP_GLOBAL_ADDRESS:
+            case BACNET_IP_MODE:
+            case BACNET_IP_MULTICAST_ADDRESS:
+            case BACNET_IP_NAT_TRAVERSAL:
+            case BACNET_IP_UDP_PORT:
+            case BACNET_IPV6_MODE:
+            case BACNET_IPV6_UDP_PORT:
+            case BACNET_IPV6_MULTICAST_ADDRESS:
+            case BASE_DEVICE_SECURITY_POLICY:
+            case BBMD_ACCEPT_FD_REGISTRATIONS:
+            case BBMD_BROADCAST_DISTRIBUTION_TABLE:
+            case BBMD_FOREIGN_DEVICE_TABLE:
+            case BELONGS_TO:
+            case BIAS:
+            case BIT_MASK:
+            case BIT_TEXT:
+            case BLINK_WARN_ENABLE:
+            case BUFFER_SIZE:
+            case CAR_ASSIGNED_DIRECTION:
+            case CAR_DOOR_COMMAND:
+            case CAR_DOOR_STATUS:
+            case CAR_DOOR_TEXT:
+            case CAR_DOOR_ZONE:
+            case CAR_DRIVE_STATUS:
+            case CAR_LOAD:
+            case CAR_LOAD_UNITS:
+            case CAR_MODE:
+            case CAR_MOVING_DIRECTION:
+            case CAR_POSITION:
+            case CHANGE_OF_STATE_COUNT:
+            case CHANGE_OF_STATE_TIME:
+            case CHANGES_PENDING:
+            case CHANNEL_NUMBER:
+            case CLIENT_COV_INCREMENT:
+            case COMMAND:
+            case COMMAND_TIME_ARRAY:
+            case CONFIGURATION_FILES:
+            case CONTROL_GROUPS:
+            case CONTROLLED_VARIABLE_REFERENCE:
+            case CONTROLLED_VARIABLE_UNITS:
+            case CONTROLLED_VARIABLE_VALUE:
+            case COUNT:
+            case COUNT_BEFORE_CHANGE:
+            case COUNT_CHANGE_TIME:
+            case COV_INCREMENT:
+            case COV_PERIOD:
+            case COV_RESUBSCRIPTION_INTERVAL:
+            case COVU_PERIOD:
+            case COVU_RECIPIENTS:
+            case CREDENTIAL_DISABLE:
+            case CREDENTIAL_STATUS:
+            case CREDENTIALS:
+            case CREDENTIALS_IN_ZONE:
+            case CURRENT_COMMAND_PRIORITY:
+            case DATABASE_REVISION:
+            case DATE_LIST:
+            case DAYLIGHT_SAVINGS_STATUS:
+            case DAYS_REMAINING:
+            case DEADBAND:
+            case DEFAULT_FADE_TIME:
+            case DEFAULT_RAMP_RATE:
+            case DEFAULT_STEP_INCREMENT:
+            case DEFAULT_SUBORDINATE_RELATIONSHIP:
+            case DEFAULT_TIMEOUT:
+            case DEPLOYED_PROFILE_LOCATION:
+            case DERIVATIVE_CONSTANT:
+            case DERIVATIVE_CONSTANT_UNITS:
+            case DESCRIPTION:
+            case DESCRIPTION_OF_HALT:
+            case DEVICE_ADDRESS_BINDING:
+            case DEVICE_TYPE:
+            case DIRECT_READING:
+            case DISTRIBUTION_KEY_REVISION:
+            case DO_NOT_HIDE:
+            case DOOR_ALARM_STATE:
+            case DOOR_EXTENDED_PULSE_TIME:
+            case DOOR_MEMBERS:
+            case DOOR_OPEN_TOO_LONG_TIME:
+            case DOOR_PULSE_TIME:
+            case DOOR_STATUS:
+            case DOOR_UNLOCK_DELAY_TIME:
+            case DUTY_WINDOW:
+            case EFFECTIVE_PERIOD:
+            case EGRESS_ACTIVE:
+            case EGRESS_TIME:
+            case ELAPSED_ACTIVE_TIME:
+            case ELEVATOR_GROUP:
+            case ENABLE:
+            case ENERGY_METER:
+            case ENERGY_METER_REF:
+            case ENTRY_POINTS:
+            case ERROR_LIMIT:
+            case ESCALATOR_MODE:
+            case EVENT_ALGORITHM_INHIBIT:
+            case EVENT_ALGORITHM_INHIBIT_REF:
+            case EVENT_DETECTION_ENABLE:
+            case EVENT_ENABLE:
+            case EVENT_MESSAGE_TEXTS:
+            case EVENT_MESSAGE_TEXTS_CONFIG:
+            case EVENT_PARAMETERS:
+            case EVENT_STATE:
+            case EVENT_TIME_STAMPS:
+            case EVENT_TYPE:
+            case EXCEPTION_SCHEDULE:
+            case EXECUTION_DELAY:
+            case EXIT_POINTS:
+            case EXPECTED_SHED_LEVEL:
+            case EXPIRATION_TIME:
+            case EXTENDED_TIME_ENABLE:
+            case FAILED_ATTEMPT_EVENTS:
+            case FAILED_ATTEMPTS:
+            case FAILED_ATTEMPTS_TIME:
+            case FAULT_HIGH_LIMIT:
+            case FAULT_LOW_LIMIT:
+            case FAULT_PARAMETERS:
+            case FAULT_SIGNALS:
+            case FAULT_TYPE:
+            case FAULT_VALUES:
+            case FD_BBMD_ADDRESS:
+            case FD_SUBSCRIPTION_LIFETIME:
+            case FEEDBACK_VALUE:
+            case FILE_ACCESS_METHOD:
+            case FILE_SIZE:
+            case FILE_TYPE:
+            case FIRMWARE_REVISION:
+            case FLOOR_TEXT:
+            case FULL_DUTY_BASELINE:
+            case GLOBAL_IDENTIFIER:
+            case GROUP_ID:
+            case GROUP_MEMBER_NAMES:
+            case GROUP_MEMBERS:
+            case GROUP_MODE:
+            case HIGH_LIMIT:
+            case HIGHER_DECK:
+            case IN_PROCESS:
+            case IN_PROGRESS:
+            case INACTIVE_TEXT:
+            case INITIAL_TIMEOUT:
+            case INPUT_REFERENCE:
+            case INSTALLATION_ID:
+            case INSTANCE_OF:
+            case INSTANTANEOUS_POWER:
+            case INTEGRAL_CONSTANT:
+            case INTEGRAL_CONSTANT_UNITS:
+            case INTERFACE_VALUE:
+            case INTERVAL_OFFSET:
+            case IP_ADDRESS:
+            case IP_DEFAULT_GATEWAY:
+            case IP_DHCP_ENABLE:
+            case IP_DHCP_LEASE_TIME:
+            case IP_DHCP_LEASE_TIME_REMAINING:
+            case IP_DHCP_SERVER:
+            case IP_DNS_SERVER:
+            case IP_SUBNET_MASK:
+            case IPV6_ADDRESS:
+            case IPV6_AUTO_ADDRESSING_ENABLE:
+            case IPV6_DEFAULT_GATEWAY:
+            case IPV6_DHCP_LEASE_TIME:
+            case IPV6_DHCP_LEASE_TIME_REMAINING:
+            case IPV6_DHCP_SERVER:
+            case IPV6_DNS_SERVER:
+            case IPV6_PREFIX_LENGTH:
+            case IPV6_ZONE_INDEX:
+            case IS_UTC:
+            case KEY_SETS:
+            case LANDING_CALL_CONTROL:
+            case LANDING_CALLS:
+            case LANDING_DOOR_STATUS:
+            case LAST_ACCESS_EVENT:
+            case LAST_ACCESS_POINT:
+            case LAST_COMMAND_TIME:
+            case LAST_CREDENTIAL_ADDED:
+            case LAST_CREDENTIAL_ADDED_TIME:
+            case LAST_CREDENTIAL_REMOVED:
+            case LAST_CREDENTIAL_REMOVED_TIME:
+            case LAST_KEY_SERVER:
+            case LAST_NOTIFY_RECORD:
+            case LAST_PRIORITY:
+            case LAST_RESTART_REASON:
+            case LAST_RESTORE_TIME:
+            case LAST_STATE_CHANGE:
+            case LAST_USE_TIME:
+            case LIFE_SAFETY_ALARM_VALUES:
+            case LIGHTING_COMMAND:
+            case LIGHTING_COMMAND_DEFAULT_PRIORITY:
+            case LIMIT_ENABLE:
+            case LIMIT_MONITORING_INTERVAL:
+            case LINK_SPEED:
+            case LINK_SPEED_AUTONEGOTIATE:
+            case LINK_SPEEDS:
+            case LIST_OF_GROUP_MEMBERS:
+            case LIST_OF_OBJECT_PROPERTY_REFERENCES:
+            case LOCAL_DATE:
+            case LOCAL_FORWARDING_ONLY:
+            case LOCAL_TIME:
+            case LOCATION:
+            case LOCK_STATUS:
+            case LOCKOUT:
+            case LOCKOUT_RELINQUISH_TIME:
+            case LOG_BUFFER:
+            case LOG_DEVICE_OBJECT_PROPERTY:
+            case LOG_INTERVAL:
+            case LOGGING_OBJECT:
+            case LOGGING_RECORD:
+            case LOGGING_TYPE:
+            case LOW_DIFF_LIMIT:
+            case LOW_LIMIT:
+            case LOWER_DECK:
+            case MAC_ADDRESS:
+            case MACHINE_ROOM_ID:
+            case MAINTENANCE_REQUIRED:
+            case MAKING_CAR_CALL:
+            case MANIPULATED_VARIABLE_REFERENCE:
+            case MANUAL_SLAVE_ADDRESS_BINDING:
+            case MASKED_ALARM_VALUES:
+            case MAX_ACTUAL_VALUE:
+            case MAX_APDU_LENGTH_ACCEPTED:
+            case MAX_FAILED_ATTEMPTS:
+            case MAX_INFO_FRAMES:
+            case MAX_MASTER:
+            case MAX_PRES_VALUE:
+            case MAX_SEGMENTS_ACCEPTED:
+            case MAXIMUM_OUTPUT:
+            case MAXIMUM_VALUE:
+            case MAXIMUM_VALUE_TIMESTAMP:
+            case MEMBER_OF:
+            case MEMBER_STATUS_FLAGS:
+            case MEMBERS:
+            case MIN_ACTUAL_VALUE:
+            case MIN_PRES_VALUE:
+            case MINIMUM_OFF_TIME:
+            case MINIMUM_ON_TIME:
+            case MINIMUM_OUTPUT:
+            case MINIMUM_VALUE:
+            case MINIMUM_VALUE_TIMESTAMP:
+            case MODE:
+            case MODEL_NAME:
+            case MODIFICATION_DATE:
+            case MUSTER_POINT:
+            case NEGATIVE_ACCESS_RULES:
+            case NETWORK_ACCESS_SECURITY_POLICIES:
+            case NETWORK_INTERFACE_NAME:
+            case NETWORK_NUMBER:
+            case NETWORK_NUMBER_QUALITY:
+            case NETWORK_TYPE:
+            case NEXT_STOPPING_FLOOR:
+            case NODE_SUBTYPE:
+            case NODE_TYPE:
+            case NOTIFICATION_CLASS:
+            case NOTIFICATION_THRESHOLD:
+            case NOTIFY_TYPE:
+            case NUMBER_OF_APDU_RETRIES:
+            case NUMBER_OF_AUTHENTICATION_POLICIES:
+            case NUMBER_OF_STATES:
+            case OBJECT_IDENTIFIER:
+            case OBJECT_LIST:
+            case OBJECT_NAME:
+            case OBJECT_PROPERTY_REFERENCE:
+            case OBJECT_TYPE:
+            case OCCUPANCY_COUNT:
+            case OCCUPANCY_COUNT_ADJUST:
+            case OCCUPANCY_COUNT_ENABLE:
+            case OCCUPANCY_LOWER_LIMIT:
+            case OCCUPANCY_LOWER_LIMIT_ENFORCED:
+            case OCCUPANCY_STATE:
+            case OCCUPANCY_UPPER_LIMIT:
+            case OCCUPANCY_UPPER_LIMIT_ENFORCED:
+            case OPERATION_DIRECTION:
+            case OPERATION_EXPECTED:
+            case OPTIONAL:
+            case OUT_OF_SERVICE:
+            case OUTPUT_UNITS:
+            case PACKET_REORDER_TIME:
+            case PASSBACK_MODE:
+            case PASSBACK_TIMEOUT:
+            case PASSENGER_ALARM:
+            case POLARITY:
+            case PORT_FILTER:
+            case POSITIVE_ACCESS_RULES:
+            case POWER:
+            case POWER_MODE:
+            case PRESCALE:
+            case PRESENT_VALUE:
+            case PRIORITY:
+            case PRIORITY_ARRAY:
+            case PRIORITY_FOR_WRITING:
+            case PROCESS_IDENTIFIER:
+            case PROCESS_IDENTIFIER_FILTER:
+            case PROFILE_LOCATION:
+            case PROFILE_NAME:
+            case PROGRAM_CHANGE:
+            case PROGRAM_LOCATION:
+            case PROGRAM_STATE:
+            case PROPERTY_LIST:
+            case PROPORTIONAL_CONSTANT:
+            case PROPORTIONAL_CONSTANT_UNITS:
+            case PROTOCOL_LEVEL:
+            case PROTOCOL_CONFORMANCE_CLASS:
+            case PROTOCOL_OBJECT_TYPES_SUPPORTED:
+            case PROTOCOL_REVISION:
+            case PROTOCOL_SERVICES_SUPPORTED:
+            case PROTOCOL_VERSION:
+            case PULSE_RATE:
+            case READ_ONLY:
+            case REASON_FOR_DISABLE:
+            case REASON_FOR_HALT:
+            case RECIPIENT_LIST:
+            case RECORD_COUNT:
+            case RECORDS_SINCE_NOTIFICATION:
+            case REFERENCE_PORT:
+            case REGISTERED_CAR_CALL:
+            case RELIABILITY:
+            case RELIABILITY_EVALUATION_INHIBIT:
+            case RELINQUISH_DEFAULT:
+            case REPRESENTS:
+            case REQUESTED_SHED_LEVEL:
+            case REQUESTED_UPDATE_INTERVAL:
+            case REQUIRED:
+            case RESOLUTION:
+            case RESTART_NOTIFICATION_RECIPIENTS:
+            case RESTORE_COMPLETION_TIME:
+            case RESTORE_PREPARATION_TIME:
+            case ROUTING_TABLE:
+            case SCALE:
+            case SCALE_FACTOR:
+            case SCHEDULE_DEFAULT:
+            case SECURED_STATUS:
+            case SECURITY_PDU_TIMEOUT:
+            case SECURITY_TIME_WINDOW:
+            case SEGMENTATION_SUPPORTED:
+            case SERIAL_NUMBER:
+            case SETPOINT:
+            case SETPOINT_REFERENCE:
+            case SETTING:
+            case SHED_DURATION:
+            case SHED_LEVEL_DESCRIPTIONS:
+            case SHED_LEVELS:
+            case SILENCED:
+            case SLAVE_ADDRESS_BINDING:
+            case SLAVE_PROXY_ENABLE:
+            case START_TIME:
+            case STATE_CHANGE_VALUES:
+            case STATE_DESCRIPTION:
+            case STATE_TEXT:
+            case STATUS_FLAGS:
+            case STOP_TIME:
+            case STOP_WHEN_FULL:
+            case STRIKE_COUNT:
+            case STRUCTURED_OBJECT_LIST:
+            case SUBORDINATE_ANNOTATIONS:
+            case SUBORDINATE_LIST:
+            case SUBORDINATE_NODE_TYPES:
+            case SUBORDINATE_RELATIONSHIPS:
+            case SUBORDINATE_TAGS:
+            case SUBSCRIBED_RECIPIENTS:
+            case SUPPORTED_FORMAT_CLASSES:
+            case SUPPORTED_FORMATS:
+            case SUPPORTED_SECURITY_ALGORITHMS:
+            case SYSTEM_STATUS:
+            case TAGS:
+            case THREAT_AUTHORITY:
+            case THREAT_LEVEL:
+            case TIME_DELAY:
+            case TIME_DELAY_NORMAL:
+            case TIME_OF_ACTIVE_TIME_RESET:
+            case TIME_OF_DEVICE_RESTART:
+            case TIME_OF_STATE_COUNT_RESET:
+            case TIME_OF_STRIKE_COUNT_RESET:
+            case TIME_SYNCHRONIZATION_INTERVAL:
+            case TIME_SYNCHRONIZATION_RECIPIENTS:
+            case TIMER_RUNNING:
+            case TIMER_STATE:
+            case TOTAL_RECORD_COUNT:
+            case TRACE_FLAG:
+            case TRACKING_VALUE:
+            case TRANSACTION_NOTIFICATION_CLASS:
+            case TRANSITION:
+            case TRIGGER:
+            case UNITS:
+            case UPDATE_INTERVAL:
+            case UPDATE_KEY_SET_TIMEOUT:
+            case UPDATE_TIME:
+            case USER_EXTERNAL_IDENTIFIER:
+            case USER_INFORMATION_REFERENCE:
+            case USER_NAME:
+            case USER_TYPE:
+            case USES_REMAINING:
+            case UTC_OFFSET:
+            case UTC_TIME_SYNCHRONIZATION_RECIPIENTS:
+            case VALID_SAMPLES:
+            case VALUE_BEFORE_CHANGE:
+            case VALUE_CHANGE_TIME:
+            case VALUE_SET:
+            case VALUE_SOURCE:
+            case VALUE_SOURCE_ARRAY:
+            case VARIANCE_VALUE:
+            case VENDOR_IDENTIFIER:
+            case VENDOR_NAME:
+            case VERIFICATION_TIME:
+            case VIRTUAL_MAC_ADDRESS_TABLE:
+            case VT_CLASSES_SUPPORTED:
+            case WEEKLY_SCHEDULE:
+            case WINDOW_INTERVAL:
+            case WINDOW_SAMPLES:
+            case WRITE_STATUS:
+            case ZONE_FROM:
+            case ZONE_MEMBERS:
+            case ZONE_TO:
+            case VENDOR_PROPRIETARY_VALUE:
+        }
         switch (objectType) {
             case ACCESS_CREDENTIAL:
             case ACCESS_DOOR:
@@ -267,11 +727,9 @@ public class StaticHelper {
             case ACCESS_USER:
             case ACCESS_ZONE:
             case ACCUMULATOR:
-                // TODO: temporary
-                return BACnetDataType.BACNET_PROPERTY_IDENTIFIER;
+                break;
             case ALERT_ENROLLMENT:
-                // TODO: temporary
-                return BACnetDataType.BACNET_PROPERTY_IDENTIFIER;
+                break;
             case ANALOG_INPUT:
             case ANALOG_OUTPUT:
                 return BACnetDataType.REAL;
@@ -281,8 +739,7 @@ public class StaticHelper {
             case BINARY_LIGHTING_OUTPUT:
             case BINARY_OUTPUT:
             case BINARY_VALUE:
-                // TODO: temporary
-                return BACnetDataType.BACNET_PROPERTY_IDENTIFIER;
+                break;
             case BITSTRING_VALUE:
                 return BACnetDataType.BIT_STRING;
             case CALENDAR:
@@ -302,8 +759,7 @@ public class StaticHelper {
             case FILE:
             case GLOBAL_GROUP:
             case GROUP:
-                // TODO: temporary
-                return BACnetDataType.BACNET_PROPERTY_IDENTIFIER;
+                break;
             case INTEGER_VALUE:
                 return BACnetDataType.SIGNED_INTEGER;
             case LARGE_ANALOG_VALUE:
@@ -314,6 +770,7 @@ public class StaticHelper {
                 return BACnetDataType.BACNET_OBJECT_IDENTIFIER;
             case LIFT:
             case LIGHTING_OUTPUT:
+                break;
             case LOAD_CONTROL:
                 // TODO: temporary // FIXME: this is just so tags get consumed
                 return BACnetDataType.ENUMERATED;
@@ -330,6 +787,7 @@ public class StaticHelper {
             case PROGRAM:
             case PULSE_CONVERTER:
             case SCHEDULE:
+                break;
             case STRUCTURED_VIEW:
                 // TODO: temporary
                 return BACnetDataType.BACNET_OBJECT_IDENTIFIER;
@@ -340,8 +798,7 @@ public class StaticHelper {
             case TREND_LOG_MULTIPLE:
                 return BACnetDataType.ENUMERATED;
         }
-        // TODO: temporary
-        return BACnetDataType.BACNET_PROPERTY_IDENTIFIER;
+        return BACnetDataType.ENUMERATED;
     }
 
     public static long parseVarUint(byte[] data) {
diff --git a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
index 12bbc157b8..14674e3284 100644
--- a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
+++ b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
@@ -58,7 +58,6 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue;
 @RequirePcapNg
 public class RandomPackagesTest {
 
-
     private static final Logger LOGGER = LoggerFactory.getLogger(RandomPackagesTest.class);
 
     public static final String BACNET_BPF_FILTER_UDP = "udp port 47808";
@@ -893,9 +892,9 @@ public class RandomPackagesTest {
                     }
                     {
                         BACnetNotificationParametersBufferReady baCnetNotificationParametersBufferReady = (BACnetNotificationParametersBufferReady) baCnetConfirmedServiceRequestConfirmedEventNotification.getEventValues();
-                        assertEquals(BACnetObjectType.TREND_LOG, baCnetNotificationParametersBufferReady.getBufferProperty().getObjectIdentifier().getObjectType());
-                        assertEquals(BACnetPropertyIdentifier.LOG_BUFFER, baCnetNotificationParametersBufferReady.getBufferProperty().getPropertyIdentifier().getPropertyIdentifier());
-                        assertEquals(BACnetObjectType.DEVICE, baCnetNotificationParametersBufferReady.getBufferProperty().getDeviceIdentifier().getObjectType());
+                        assertEquals(BACnetObjectType.TREND_LOG, baCnetNotificationParametersBufferReady.getBufferProperty().getValue().getObjectIdentifier().getObjectType());
+                        assertEquals(BACnetPropertyIdentifier.LOG_BUFFER, baCnetNotificationParametersBufferReady.getBufferProperty().getValue().getPropertyIdentifier().getPropertyIdentifier());
+                        assertEquals(BACnetObjectType.DEVICE, baCnetNotificationParametersBufferReady.getBufferProperty().getValue().getDeviceIdentifier().getObjectType());
                         assertEquals(1640, baCnetNotificationParametersBufferReady.getPreviousNotification().getPayload().getActualValue().longValue());
                         assertEquals(1653, baCnetNotificationParametersBufferReady.getCurrentNotification().getPayload().getActualValue().longValue());
                     }
diff --git a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/TrickyPackagesTest.java b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/TrickyPackagesTest.java
new file mode 100644
index 0000000000..5790d8e89d
--- /dev/null
+++ b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/TrickyPackagesTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.bacnetip;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.plc4x.java.bacnetip.readwrite.BVLC;
+import org.apache.plc4x.java.spi.generation.ReadBufferByteBased;
+import org.junit.Test;
+
+import java.util.stream.IntStream;
+
+import static org.junit.Assert.assertNotNull;
+
+public class TrickyPackagesTest {
+
+    // from plugfest-tridium-1.pcap
+    @Test
+    public void testTridium255() throws Exception {
+        int[] rawBytesAsInts = new int[]{
+            /*0000*/   0x00, 0x1d, 0x09, 0xbc, 0x43, 0x5f, 0x00, 0x01, 0xf0, 0x8c, 0x11, 0x50, 0x08, 0x00, 0x45, 0x00,
+            /*0010*/   0x01, 0xfc, 0x7e, 0x47, 0x00, 0x00, 0x40, 0x11, 0x27, 0x92, 0xac, 0x10, 0x24, 0xcd, 0xac, 0x10,
+            /*0020*/   0x56, 0x2a, 0xba, 0xc0, 0xba, 0xc0, 0x01, 0xe8, 0x24, 0xd9, 0x81, 0x0a, 0x01, 0xe0, 0x01, 0x00,
+            /*0030*/   0x30, 0x6e, 0x0e, 0x0c, 0x04, 0x40, 0x00, 0x01, 0x1e, 0x29, 0x4b, 0x4e, 0xc4, 0x04, 0x40, 0x00,
+            /*0040*/   0x01, 0x4f, 0x29, 0x4d, 0x4e, 0x75, 0x13, 0x00, 0x53, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x45, 0x6e,
+            /*0050*/   0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x29, 0x4f, 0x4e, 0x91, 0x11,
+            /*0060*/   0x4f, 0x29, 0x55, 0x4e, 0x21, 0x07, 0x4f, 0x29, 0x20, 0x4e, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xa4,
+            /*0070*/   0xff, 0xff, 0xff, 0xff, 0x4f, 0x29, 0xae, 0x4e, 0x21, 0x01, 0x4f, 0x29, 0x36, 0x4e, 0x0c, 0x04,
+            /*0080*/   0xc0, 0x00, 0x66, 0x19, 0x57, 0x29, 0x0a, 0x0c, 0x04, 0xc0, 0x00, 0x65, 0x19, 0x57, 0x29, 0x0a,
+            /*0090*/   0x4f, 0x29, 0x58, 0x4e, 0x21, 0x10, 0x4f, 0x29, 0x6f, 0x4e, 0x82, 0x04, 0x00, 0x4f, 0x29, 0x67,
+            /*00a0*/   0x4e, 0x91, 0x00, 0x4f, 0x29, 0x51, 0x4e, 0x10, 0x4f, 0x29, 0x7b, 0x4e, 0x0e, 0xb4, 0x06, 0x00,
+            /*00b0*/   0x00, 0x00, 0x21, 0x01, 0xb4, 0x09, 0x00, 0x00, 0x00, 0x21, 0x02, 0xb4, 0x0c, 0x00, 0x00, 0x00,
+            /*00c0*/   0x21, 0x03, 0xb4, 0x0f, 0x00, 0x00, 0x00, 0x21, 0x04, 0xb4, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0f,
+            /*00d0*/   0x0e, 0xb4, 0x06, 0x00, 0x00, 0x00, 0x21, 0x01, 0xb4, 0x09, 0x00, 0x00, 0x00, 0x21, 0x02, 0xb4,
+            /*00e0*/   0x0c, 0x00, 0x00, 0x00, 0x21, 0x03, 0xb4, 0x0f, 0x00, 0x00, 0x00, 0x21, 0x04, 0xb4, 0x12, 0x00,
+            /*00f0*/   0x00, 0x00, 0x00, 0x0f, 0x0e, 0xb4, 0x06, 0x00, 0x00, 0x00, 0x21, 0x01, 0xb4, 0x09, 0x00, 0x00,
+            /*0100*/   0x00, 0x21, 0x02, 0xb4, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x03, 0xb4, 0x0f, 0x00, 0x00, 0x00, 0x21,
+            /*0110*/   0x04, 0xb4, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0xb4, 0x06, 0x00, 0x00, 0x00, 0x21, 0x01,
+            /*0120*/   0xb4, 0x09, 0x00, 0x00, 0x00, 0x21, 0x02, 0xb4, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x03, 0xb4, 0x0f,
+            /*0130*/   0x00, 0x00, 0x00, 0x21, 0x04, 0xb4, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0xb4, 0x06, 0x00,
+            /*0140*/   0x00, 0x00, 0x21, 0x01, 0xb4, 0x09, 0x00, 0x00, 0x00, 0x21, 0x02, 0xb4, 0x0c, 0x00, 0x00, 0x00,
+            /*0150*/   0x21, 0x03, 0xb4, 0x0f, 0x00, 0x00, 0x00, 0x21, 0x04, 0xb4, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0f,
+            /*0160*/   0x0e, 0xb4, 0x06, 0x00, 0x00, 0x00, 0x21, 0x05, 0xb4, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x06, 0xb4,
+            /*0170*/   0x12, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0xb4, 0x06, 0x00, 0x00, 0x00, 0x21, 0x05, 0xb4, 0x0c,
+            /*0180*/   0x00, 0x00, 0x00, 0x21, 0x06, 0xb4, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x4f, 0x29, 0x26, 0x4e,
+            /*0190*/   0x0e, 0x0c, 0xff, 0xff, 0xff, 0x03, 0x0f, 0x2e, 0x2f, 0x39, 0x10, 0x1c, 0x01, 0x80, 0x00, 0x01,
+            /*01a0*/   0x2e, 0xb4, 0x09, 0x00, 0x00, 0x00, 0x21, 0x08, 0xb4, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x0f,
+            /*01b0*/   0x1e, 0x00, 0x00, 0x21, 0x08, 0xb4, 0x12, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x39, 0x10, 0x1c, 0x01,
+            /*01c0*/   0x80, 0x00, 0x00, 0x2e, 0xb4, 0x03, 0x00, 0x00, 0x00, 0x21, 0x07, 0xb4, 0x06, 0x00, 0x00, 0x00,
+            /*01d0*/   0x00, 0xb4, 0x07, 0x1e, 0x00, 0x00, 0x21, 0x07, 0xb4, 0x09, 0x1e, 0x00, 0x00, 0x00, 0xb4, 0x0a,
+            /*01e0*/   0x1e, 0x00, 0x00, 0x21, 0x07, 0xb4, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x0e, 0x1e, 0x00, 0x00,
+            /*01f0*/   0x21, 0x07, 0xb4, 0x11, 0x1e, 0x00, 0x00, 0x00, 0xb4, 0x13, 0x00, 0x00, 0x00, 0x21, 0x07, 0xb4,
+            /*0200*/   0x14, 0x1e, 0x00, 0x00, 0x00, 0x2f, 0x39, 0x10, 0x4f, 0x1f,
+        };
+        var rawBytes = (byte[]) ArrayUtils.toPrimitive(IntStream.of(rawBytesAsInts).boxed().map(Integer::byteValue).toArray(Byte[]::new));
+        rawBytes = ArrayUtils.subarray(rawBytes, 42, rawBytes.length);
+        BVLC bvlc = BVLC.staticParse(new ReadBufferByteBased(rawBytes));
+        assertNotNull(bvlc);
+        System.out.println(bvlc);
+    }
+
+    // from plugfest-delta-2b.cap
+    @Test
+    public void testDelta1204() throws Exception {
+        int[] rawBytesAsInts = new int[]{
+            /*0000*/   0x00, 0x06, 0x5b, 0xd6, 0x9f, 0xfe, 0x00, 0x40, 0xae, 0x00, 0x45, 0xd7, 0x08, 0x00, 0x45, 0x00,
+            /*0010*/   0x01, 0x5e, 0x28, 0x64, 0x00, 0x00, 0x3c, 0x11, 0xec, 0xc9, 0xac, 0x10, 0x08, 0x0a, 0xac, 0x10,
+            /*0020*/   0x08, 0x37, 0xba, 0xc0, 0xba, 0xc0, 0x01, 0x4a, 0x00, 0x00, 0x81, 0x0a, 0x01, 0x42, 0x01, 0x00,
+            /*0030*/   0x30, 0xef, 0x0e, 0x0c, 0x45, 0x80, 0x00, 0x01, 0x1e, 0x29, 0x1c, 0x4e, 0x71, 0x00, 0x4f, 0x2a,
+            /*0040*/   0x04, 0x0a, 0x4e, 0x91, 0x00, 0x4f, 0x2a, 0x04, 0x0c, 0x4e, 0x0e, 0x09, 0x01, 0x19, 0x04, 0x2c,
+            /*0050*/   0x01, 0xfe, 0xed, 0xd8, 0x3d, 0x06, 0x03, 0xff, 0x3b, 0xe8, 0x3e, 0xf1, 0x4a, 0x04, 0x57, 0x5a,
+            /*0060*/   0x01, 0xe0, 0x69, 0x64, 0x79, 0x0a, 0x89, 0x2a, 0x99, 0x32, 0xaa, 0x13, 0x88, 0xba, 0x0b, 0xb8,
+            /*0070*/   0xca, 0x1b, 0x58, 0xd9, 0x03, 0xea, 0x13, 0x88, 0xfa, 0x0f, 0x01, 0xe0, 0xf9, 0x10, 0x00, 0x0f,
+            /*0080*/   0x4f, 0x2a, 0x04, 0x27, 0x4e, 0x0a, 0x02, 0x51, 0x19, 0x00, 0x29, 0x00, 0x39, 0x00, 0x4a, 0x06,
+            /*0090*/   0x0b, 0x59, 0x00, 0x69, 0x00, 0x79, 0x00, 0x89, 0x00, 0x99, 0x00, 0xa9, 0x00, 0x4f, 0x2a, 0x04,
+            /*00a0*/   0x3a, 0x39, 0x00, 0x4e, 0x21, 0x05, 0x4f, 0x2a, 0x04, 0x3a, 0x4e, 0x09, 0x00, 0x19, 0x00, 0x29,
+            /*00b0*/   0x01, 0x39, 0x01, 0x4c, 0x45, 0x80, 0x00, 0x01, 0x59, 0x01, 0x69, 0x06, 0x79, 0x01, 0x8e, 0x0b,
+            /*00c0*/   0x01, 0xea, 0xc9, 0x19, 0x00, 0x29, 0x00, 0x39, 0x00, 0x49, 0x00, 0x8f, 0x9c, 0x00, 0x00, 0x00,
+            /*00d0*/   0x00, 0x09, 0x00, 0x19, 0x00, 0x29, 0x01, 0x39, 0x01, 0x4c, 0x45, 0x80, 0x00, 0x01, 0x59, 0x02,
+            /*00e0*/   0x69, 0x06, 0x79, 0x02, 0x8e, 0x0a, 0x79, 0xef, 0x19, 0x00, 0x2b, 0x01, 0x80, 0x7e, 0x3a, 0x05,
+            /*00f0*/   0xe7, 0x49, 0x32, 0x8f, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x19, 0x00, 0x29, 0x01, 0x39,
+            /*0100*/   0x01, 0x4c, 0x45, 0x80, 0x00, 0x01, 0x59, 0x01, 0x69, 0x01, 0x79, 0x03, 0x8e, 0x0a, 0x01, 0x01,
+            /*0110*/   0x19, 0x00, 0x29, 0x00, 0x39, 0x00, 0x49, 0x00, 0x8f, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
+            /*0120*/   0x19, 0x00, 0x29, 0x01, 0x39, 0x01, 0x4c, 0x45, 0x80, 0x00, 0x01, 0x59, 0x04, 0x69, 0x01, 0x79,
+            /*0130*/   0x05, 0x8e, 0x0a, 0x31, 0x20, 0x19, 0x00, 0x2a, 0x2f, 0x37, 0x39, 0xc3, 0x49, 0x00, 0x8f, 0x9c,
+            /*0140*/   0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x19, 0x00, 0x29, 0x01, 0x39, 0x01, 0x4c, 0x45, 0x80, 0x00,
+            /*0150*/   0x01, 0x59, 0x05, 0x69, 0x01, 0x79, 0x07, 0x8e, 0x0a, 0x26, 0xe1, 0x19, 0x00, 0x2a, 0x25, 0xb9,
+            /*0160*/   0x39, 0x00, 0x49, 0x00, 0x8f, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x1f,
+        };
+        var rawBytes = (byte[]) ArrayUtils.toPrimitive(IntStream.of(rawBytesAsInts).boxed().map(Integer::byteValue).toArray(Byte[]::new));
+        rawBytes = ArrayUtils.subarray(rawBytes, 42, rawBytes.length);
+        BVLC bvlc = BVLC.staticParse(new ReadBufferByteBased(rawBytes));
+        assertNotNull(bvlc);
+        System.out.println(bvlc);
+    }
+}
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index d3b5db0849..ffb8a9d7b5 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -919,7 +919,7 @@
             [simple BACnetOpeningTag('peekedTagNumber', 'BACnetDataType.OPENING_TAG')
                     innerOpeningTag
             ]
-            [simple BACnetDeviceObjectPropertyReference('0')
+            [simple BACnetDeviceObjectPropertyReferenceEnclosed('0')
                     bufferProperty
             ]
             [simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER')
@@ -1013,7 +1013,7 @@
                 timeValue]
     [optional   BACnetApplicationTagObjectIdentifier
                 objectIdentifier]
-    [optional   BACnetDeviceObjectPropertyReference('0')
+    [optional   BACnetDeviceObjectPropertyReferenceEnclosed('0')
                 reference]
     [simple     BACnetClosingTag('tagNumber', 'BACnetDataType.CLOSING_TAG')
                 closingTag
@@ -1041,14 +1041,11 @@
     [optional BACnetContextTagUnsignedInteger('3', 'BACnetDataType.UNSIGNED_INTEGER')              priority            ]
 ]
 
-[type BACnetDeviceObjectPropertyReference(uint 8 tagNumber)
+[type BACnetDeviceObjectPropertyReferenceEnclosed(uint 8 tagNumber)
     [simple   BACnetOpeningTag('tagNumber', 'BACnetDataType.OPENING_TAG')
               openingTag
     ]
-    [simple   BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')     objectIdentifier    ]
-    [simple   BACnetContextTagPropertyIdentifier('1', 'BACnetDataType.BACNET_PROPERTY_IDENTIFIER') propertyIdentifier  ]
-    [optional BACnetContextTagUnsignedInteger('2', 'BACnetDataType.UNSIGNED_INTEGER')              arrayIndex          ]
-    [optional BACnetContextTagObjectIdentifier('3', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')     deviceIdentifier    ]
+    [simple   BACnetDeviceObjectPropertyReference     value                                                            ]
     [simple   BACnetClosingTag('tagNumber', 'BACnetDataType.CLOSING_TAG')
               closingTag
     ]
@@ -1588,33 +1585,47 @@
             [simple BACnetDateTime('2')
                     toNormal                                                                                    ]
         ]
+        [*, 'LIST_OF_OBJECT_PROPERTY_REFERENCES' BACnetConstructedDataListOfObjectPropertyReferences
+            [array    BACnetDeviceObjectPropertyReference
+                            references              terminated
+                                'STATIC_CALL("isBACnetConstructedDataClosingTag", readBuffer, false, tagNumber)']
+        ]
         [BACnetConstructedDataUnspecified
-            [array          BACnetConstructedDataElement('objectType', 'propertyIdentifierArgument')
-                                data
-                            terminated
-                            'STATIC_CALL("isBACnetConstructedDataClosingTag", readBuffer, false, tagNumber)'    ]
-            [virtual    bit     hasData 'COUNT(data) != 0']
+            [array    BACnetConstructedDataElement('objectType', 'propertyIdentifierArgument')
+                            data                    terminated
+                                'STATIC_CALL("isBACnetConstructedDataClosingTag", readBuffer, false, tagNumber)']
+            [virtual  bit   hasData                 'COUNT(data) != 0']
             [optional       BACnetContextTagPropertyIdentifier('0', 'BACnetDataType.BACNET_PROPERTY_IDENTIFIER')
-                            propertyIdentifier
-                            'hasData'                                                                           ]
+                            propertyIdentifier      'hasData'                                                   ]
             [optional       BACnetApplicationTag
-                            content 'hasData'                                                                   ]
+                            content                 'hasData'                                                   ]
         ]
     ]
     [simple       BACnetClosingTag('tagNumber', 'BACnetDataType.CLOSING_TAG')
                         closingTag                                                                              ]
 ]
 
+[type BACnetDeviceObjectPropertyReference
+    [simple   BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')
+                        objectIdentifier                                                                        ]
+    [simple   BACnetContextTagPropertyIdentifier('1', 'BACnetDataType.BACNET_PROPERTY_IDENTIFIER')
+                        propertyIdentifier                                                                      ]
+    [optional BACnetContextTagUnsignedInteger('2', 'BACnetDataType.UNSIGNED_INTEGER')
+                        arrayIndex                                                                              ]
+    [optional BACnetContextTagObjectIdentifier('3', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')
+                        deviceIdentifier                                                                        ]
+]
+
 [type BACnetConstructedDataElement(BACnetObjectType objectType, BACnetContextTagPropertyIdentifier propertyIdentifier)
     [peek       BACnetTagHeader
                             peekedTagHeader                                                                     ]
     [virtual    uint 8      peekedTagNumber     'peekedTagHeader.actualTagNumber']
     [virtual    bit         isApplicationTag    'peekedTagHeader.tagClass == TagClass.APPLICATION_TAGS'         ]
-    [virtual    bit         isConstructedData   '!isApplicationTag && peekedTagHeader.actualLength == 0x6'      ]
+    [virtual    bit         isConstructedData   '!isApplicationTag && peekedTagHeader.lengthValueType == 0x6'      ]
     [virtual    bit         isContextTag        '!isConstructedData && !isApplicationTag'                       ]
     [optional   BACnetApplicationTag
                             applicationTag      'isApplicationTag'                                              ]
-    [optional   BACnetContextTag('peekedTagNumber', 'STATIC_CALL("guessDataType", objectType)')
+    [optional   BACnetContextTag('peekedTagNumber', 'STATIC_CALL("guessDataType", objectType, propertyIdentifier)')
                             contextTag          'isContextTag'                                                  ]
     [optional   BACnetConstructedData('peekedTagNumber', 'objectType', 'propertyIdentifier')
                             constructedData     'isConstructedData'                                             ]


[plc4x] 01/02: fix(bacnet): fixed offset for service request

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

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

commit a2b633299abe38d42cff89cfe2f96ef238ae5620
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Apr 28 14:03:28 2022 +0200

    fix(bacnet): fixed offset for service request
---
 plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go | 2 +-
 protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
index a8b319c126..87f96f10ad 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
@@ -324,7 +324,7 @@ func APDUConfirmedRequestParse(readBuffer utils.ReadBuffer, apduLength uint16) (
 	if pullErr := readBuffer.PullContext("serviceRequest"); pullErr != nil {
 		return nil, pullErr
 	}
-	_serviceRequest, _serviceRequestErr := BACnetConfirmedServiceRequestParse(readBuffer, uint16(uint16(apduLength)-uint16(uint16(uint16(uint16(3))+uint16(uint16(utils.InlineIf(segmentedMessage, func() interface{} { return uint16(uint16(2)) }, func() interface{} { return uint16(uint16(0)) }).(uint16)))))))
+	_serviceRequest, _serviceRequestErr := BACnetConfirmedServiceRequestParse(readBuffer, uint16(uint16(apduLength)-uint16(uint16(uint16(uint16(4))+uint16(uint16(utils.InlineIf(segmentedMessage, func() interface{} { return uint16(uint16(2)) }, func() interface{} { return uint16(uint16(0)) }).(uint16)))))))
 	if _serviceRequestErr != nil {
 		return nil, errors.Wrap(_serviceRequestErr, "Error parsing 'serviceRequest' field")
 	}
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index 4249dcc91f..d3b5db0849 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -210,7 +210,7 @@
             [simple   uint 8    invokeId                                ]
             [optional uint 8    sequenceNumber       'segmentedMessage' ]
             [optional uint 8    proposedWindowSize   'segmentedMessage' ]
-            [simple   BACnetConfirmedServiceRequest('apduLength - (3 + (segmentedMessage ? 2 : 0))')
+            [simple   BACnetConfirmedServiceRequest('apduLength - (4 + (segmentedMessage ? 2 : 0))')
                                 serviceRequest                          ]
         ]
         ['0x1' APDUUnconfirmedRequest