diff --git a/DeviceCommons/DataHandling/DeviceMessageSerializerProvider.cs b/DeviceCommons/DataHandling/DeviceMessageSerializerProvider.cs index 1296e35a23efb6295e64be4acff72c4708f444b1..8cd4f59a1e7f61526207508d44f27bbbfeb978cd 100644 --- a/DeviceCommons/DataHandling/DeviceMessageSerializerProvider.cs +++ b/DeviceCommons/DataHandling/DeviceMessageSerializerProvider.cs @@ -1,6 +1,4 @@ using DeviceCommons.DeviceMessages.Serialization; -using DeviceCommons.DeviceMessages.Serialization.V1.Parsers; -using DeviceCommons.DeviceMessages.Serialization.V1.Serializers; namespace DeviceCommons.DataHandling { @@ -12,22 +10,70 @@ namespace DeviceCommons.DataHandling public static readonly IDeviceMessageHeaderSerializer HeaderSer = new DeviceMessageHeaderSerializer(); public static readonly IDeviceMessageHeaderParser HeaderPar = new DeviceMessageHeaderParser(); - public static readonly IDeviceMessageInfoSerializer InfoSer = new DeviceMessageInfoSerializer(); - public static readonly IDeviceMessageInfoParser InfoPar = new DeviceMessageInfoParser(); + #region V1 + public static readonly IDeviceMessageInfoSerializer InfoV1Ser = + new DeviceMessages.Serialization.V1.Serializers.DeviceMessageInfoSerializer(); + public static readonly IDeviceMessageInfoParser InfoV1Par = + new DeviceMessages.Serialization.V1.Parsers.DeviceMessageInfoParser(); - public static readonly IDeviceMessageInfoReadingsSerializer InfoReadingsSer = new DeviceMessageInfoReadingsSerializer(); - public static readonly IDeviceMessageInfoReadingsParser InfoReadingsPar = new DeviceMessageInfoReadingsParser(); + public static readonly IDeviceMessageInfoReadingsSerializer InfoReadingsV1Ser = + new DeviceMessages.Serialization.V1.Serializers.DeviceMessageInfoReadingsSerializer(); + public static readonly IDeviceMessageInfoReadingsParser InfoReadingsV1Par = + new DeviceMessages.Serialization.V1.Parsers.DeviceMessageInfoReadingsParser(); - public static readonly IDeviceMessageInfoReadingSerializer InfoReadingSer = new DeviceMessageInfoReadingSerializer(); - public static readonly IDeviceMessageInfoReadingParser InfoReadingPar = new DeviceMessageInfoReadingParser(); + public static readonly IDeviceMessageInfoReadingSerializer InfoReadingV1Ser = + new DeviceMessages.Serialization.V1.Serializers.DeviceMessageInfoReadingSerializer(); + public static readonly IDeviceMessageInfoReadingParser InfoReadingV1Par = + new DeviceMessages.Serialization.V1.Parsers.DeviceMessageInfoReadingParser(); - public static readonly IDeviceMessageInfoReadingStatesSerializer InfoReadingStatesSer = new DeviceMessageInfoReadingStatesSerializer(); - public static readonly IDeviceMessageInfoReadingStatesParser InfoReadingStatesPar = new DeviceMessageInfoReadingStatesParser(); + public static readonly IDeviceMessageInfoReadingStatesSerializer InfoReadingStatesV1Ser = + new DeviceMessages.Serialization.V1.Serializers.DeviceMessageInfoReadingStatesSerializer(); + public static readonly IDeviceMessageInfoReadingStatesParser InfoReadingStatesV1Par = + new DeviceMessages.Serialization.V1.Parsers.DeviceMessageInfoReadingStatesParser(); + + public static readonly IDeviceMessageInfoReadingStateSerializer InfoReadingStateV1Ser = + new DeviceMessages.Serialization.V1.Serializers.DeviceMessageInfoReadingStateSerializer(); + public static readonly IDeviceMessageInfoReadingStateParser InfoReadingStateV1Par = + new DeviceMessages.Serialization.V1.Parsers.DeviceMessageInfoReadingStateParser(); + #endregion + + #region V2 + public static readonly IDeviceMessageChildSerializer ChildV1Ser = + new DeviceMessages.Serialization.V1.Serializers.DeviceMessageChildSerializer(); + public static readonly IDeviceMessageChildParser ChildV1Par = + new DeviceMessages.Serialization.V1.Parsers.DeviceMessageChildParser(); + + public static readonly IDeviceMessageInfoSerializer InfoV2Ser = + new DeviceMessages.Serialization.V2.Serializers.DeviceMessageInfoSerializer(); + public static readonly IDeviceMessageInfoParser InfoV2Par = + new DeviceMessages.Serialization.V2.Parsers.DeviceMessageInfoParser(); + + public static readonly IDeviceMessageInfoReadingsSerializer InfoReadingsV2Ser = + new DeviceMessages.Serialization.V2.Serializers.DeviceMessageInfoReadingsSerializer(); + public static readonly IDeviceMessageInfoReadingsParser InfoReadingsV2Par = + new DeviceMessages.Serialization.V2.Parsers.DeviceMessageInfoReadingsParser(); + + public static readonly IDeviceMessageInfoReadingSerializer InfoReadingV2Ser = + new DeviceMessages.Serialization.V2.Serializers.DeviceMessageInfoReadingSerializer(); + public static readonly IDeviceMessageInfoReadingParser InfoReadingV2Par = + new DeviceMessages.Serialization.V2.Parsers.DeviceMessageInfoReadingParser(); + + public static readonly IDeviceMessageInfoReadingStatesSerializer InfoReadingStatesV2Ser = + new DeviceMessages.Serialization.V2.Serializers.DeviceMessageInfoReadingStatesSerializer(); + public static readonly IDeviceMessageInfoReadingStatesParser InfoReadingStatesV2Par = + new DeviceMessages.Serialization.V2.Parsers.DeviceMessageInfoReadingStatesParser(); + + public static readonly IDeviceMessageInfoReadingStateSerializer InfoReadingStateV2Ser = + new DeviceMessages.Serialization.V2.Serializers.DeviceMessageInfoReadingStateSerializer(); + public static readonly IDeviceMessageInfoReadingStateParser InfoReadingStateV2Par = + new DeviceMessages.Serialization.V2.Parsers.DeviceMessageInfoReadingStateParser(); + + public static readonly IDeviceMessageChildSerializer ChildV2Ser = + new DeviceMessages.Serialization.V2.Serializers.DeviceMessageChildSerializer(); + public static readonly IDeviceMessageChildParser ChildV2Par = + new DeviceMessages.Serialization.V2.Parsers.DeviceMessageChildParser(); + #endregion - public static readonly IDeviceMessageInfoReadingStateSerializer InfoReadingStateSer = new DeviceMessageInfoReadingStateSerializer(); - public static readonly IDeviceMessageInfoReadingStateParser InfoReadingStatePar = new DeviceMessageInfoReadingStateParser(); - public static readonly IDeviceMessageChildSerializer ChildSer = new DeviceMessageChildSerializer(); - public static readonly IDeviceMessageChildParser ChildPar = new DeviceMessageChildParser(); } } diff --git a/DeviceCommons/DataHandling/DeviceMessageUtilities.cs b/DeviceCommons/DataHandling/DeviceMessageUtilities.cs index daf10fbc1c944c128327623cb21945c5f689d2d7..ee707ae43b7ddcf0c32b8a18f06e9b9d38a0d0a1 100644 --- a/DeviceCommons/DataHandling/DeviceMessageUtilities.cs +++ b/DeviceCommons/DataHandling/DeviceMessageUtilities.cs @@ -1,4 +1,5 @@ using DeviceCommons.DeviceMessages.Enums; +using DeviceCommons.DeviceMessages.Models.V1; namespace DeviceCommons.DataHandling { @@ -64,7 +65,20 @@ namespace DeviceCommons.DataHandling CheckBuffer(data, startIndex, 2); return GetValueLength(valueType, data, startIndex + 1) + 2; default: - return GetValueLength(valueType,null); + return GetValueLength(valueType, null); + } + } + + public static int GetValueLength(IDeviceMessageInfoReadingState state) + { + switch (state.ValueType) + { + case StateValueTypeEnum.String: + return state.Value.Length + 1; + case StateValueTypeEnum.Binary: + return state.Value.Length + 2; + default: + return GetValueLength(state.ValueType, null); } } } diff --git a/DeviceCommons/DeviceCommons.csproj b/DeviceCommons/DeviceCommons.csproj index 407846a5aee5323a116fd6d8a321849d9fee800f..3166522d1e5c3b6547fcfc7cba14ca7aa4a49ef1 100644 --- a/DeviceCommons/DeviceCommons.csproj +++ b/DeviceCommons/DeviceCommons.csproj @@ -10,4 +10,8 @@ + + + + diff --git a/DeviceCommons/DeviceMessages/Abstractions/AbstractMessage.cs b/DeviceCommons/DeviceMessages/Abstractions/AbstractMessage.cs index 14a6d2ae951d3198969cf4a46c70d7ca49519211..832b4aa0ebc2a95d24bbe07f48a0d6dfa2cba0e3 100644 --- a/DeviceCommons/DeviceMessages/Abstractions/AbstractMessage.cs +++ b/DeviceCommons/DeviceMessages/Abstractions/AbstractMessage.cs @@ -1,4 +1,4 @@ -using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Models; namespace DeviceCommons.DeviceMessages.Abstractions { diff --git a/DeviceCommons/DeviceMessages/Abstractions/AbstractMessageParser.cs b/DeviceCommons/DeviceMessages/Abstractions/AbstractMessageParser.cs index 996cbf8f77d1822b4336bf0ffdc0fe5aae058517..47c27600055e285246f988d95d686acf88e61239 100644 --- a/DeviceCommons/DeviceMessages/Abstractions/AbstractMessageParser.cs +++ b/DeviceCommons/DeviceMessages/Abstractions/AbstractMessageParser.cs @@ -1,6 +1,6 @@ using DeviceCommons.DataHandling.Compression; using DeviceCommons.DataHandling.Formatters; -using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Models; namespace DeviceCommons.DeviceMessages.Abstractions { diff --git a/DeviceCommons/DeviceMessages/Abstractions/AbstractMessageSerializer.cs b/DeviceCommons/DeviceMessages/Abstractions/AbstractMessageSerializer.cs index 47fa85a890cf3c177dd6dd79079feb42bb94eabd..7f119f783f0f4cf16b967690519455c7d325a612 100644 --- a/DeviceCommons/DeviceMessages/Abstractions/AbstractMessageSerializer.cs +++ b/DeviceCommons/DeviceMessages/Abstractions/AbstractMessageSerializer.cs @@ -1,6 +1,6 @@ using DeviceCommons.DataHandling.Compression; using DeviceCommons.DataHandling.Formatters; -using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Models; using System.Buffers; namespace DeviceCommons.DeviceMessages.Abstractions @@ -13,17 +13,13 @@ namespace DeviceCommons.DeviceMessages.Abstractions public Func? EncryptFunc { get; set; } - public virtual void Serializer( + public abstract void Serializer( ArrayBufferWriter writer, T message - ) - { - Model = message; - Serializer(writer); - } + ); - public abstract void Serializer( + public virtual void Serializer( ArrayBufferWriter writer - ); + ) => Serializer(writer, Model); public string Serializer( ArrayBufferWriter writer, T message, bool isCompress diff --git a/DeviceCommons/DeviceMessages/Abstractions/IMessageSerializer.cs b/DeviceCommons/DeviceMessages/Abstractions/IMessageSerializer.cs index 4c2751e80ee077b045e7d08de6bd4e863551be02..4a8fe458c0a591a51e01e995870f9689ab0bdb68 100644 --- a/DeviceCommons/DeviceMessages/Abstractions/IMessageSerializer.cs +++ b/DeviceCommons/DeviceMessages/Abstractions/IMessageSerializer.cs @@ -1,4 +1,4 @@ -using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Models; using System.Buffers; namespace DeviceCommons.DeviceMessages.Abstractions diff --git a/DeviceCommons/DeviceMessages/Builders/DeviceMessageBuilder.cs b/DeviceCommons/DeviceMessages/Builders/DeviceMessageBuilder.cs index 6e23ca24065fbf92c0368749ea5b402ed1bbfee4..c48c408325c59420bbef9915a43ada707dfc2bb6 100644 --- a/DeviceCommons/DeviceMessages/Builders/DeviceMessageBuilder.cs +++ b/DeviceCommons/DeviceMessages/Builders/DeviceMessageBuilder.cs @@ -1,5 +1,6 @@ using DeviceCommons.DataHandling; using DeviceCommons.DeviceMessages.Enums; +using DeviceCommons.DeviceMessages.Models; using DeviceCommons.DeviceMessages.Models.V1; using DeviceCommons.Security; using System.Buffers; diff --git a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageHeader.cs b/DeviceCommons/DeviceMessages/Models/DeviceMessageHeader.cs similarity index 91% rename from DeviceCommons/DeviceMessages/Models/V1/DeviceMessageHeader.cs rename to DeviceCommons/DeviceMessages/Models/DeviceMessageHeader.cs index 1b8d7382977f071e02cd4fcca9750da6ff177c78..fa09c7d7720b12bfb98a97d032a7c2b8cb0960ef 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageHeader.cs +++ b/DeviceCommons/DeviceMessages/Models/DeviceMessageHeader.cs @@ -1,6 +1,6 @@ using DeviceCommons.DeviceMessages.Enums; -namespace DeviceCommons.DeviceMessages.Models.V1 +namespace DeviceCommons.DeviceMessages.Models { public class DeviceMessageHeader : IDeviceMessageHeader { @@ -26,5 +26,7 @@ namespace DeviceCommons.DeviceMessages.Models.V1 { get => (byte)((int)CRCType << 4 | (int)Reserve2 << 3 | (int)Reserve1 << 2 | (int)ValueType << 1 | (int)TimeStampFormat); } + + public int DataLength => 4; } } diff --git a/DeviceCommons/DeviceMessages/Models/V1/IBase.cs b/DeviceCommons/DeviceMessages/Models/IBase.cs similarity index 46% rename from DeviceCommons/DeviceMessages/Models/V1/IBase.cs rename to DeviceCommons/DeviceMessages/Models/IBase.cs index 4594aab7aae42dc91f0cc0e795d6e19e5c951fd2..3cb75305c23d198a99eb51e19e89fc3cc33f6e16 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/IBase.cs +++ b/DeviceCommons/DeviceMessages/Models/IBase.cs @@ -1,8 +1,9 @@ using System.Buffers; -namespace DeviceCommons.DeviceMessages.Models.V1 +namespace DeviceCommons.DeviceMessages.Models { public interface IBase { + int DataLength { get; } } } diff --git a/DeviceCommons/DeviceMessages/Models/V1/IDeviceMessageHeader.cs b/DeviceCommons/DeviceMessages/Models/IDeviceMessageHeader.cs similarity index 90% rename from DeviceCommons/DeviceMessages/Models/V1/IDeviceMessageHeader.cs rename to DeviceCommons/DeviceMessages/Models/IDeviceMessageHeader.cs index 3ef83e32d03415e7ab450bf9cab19b7d615e84a3..06eadf4538902c435dbbad9bad37e6f895c7fc08 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/IDeviceMessageHeader.cs +++ b/DeviceCommons/DeviceMessages/Models/IDeviceMessageHeader.cs @@ -1,6 +1,6 @@ using DeviceCommons.DeviceMessages.Enums; -namespace DeviceCommons.DeviceMessages.Models.V1 +namespace DeviceCommons.DeviceMessages.Models { public interface IDeviceMessageHeader : IBase { diff --git a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessage.cs b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessage.cs index 31f337a78934c211a606de76e8f9edf48e1abf0f..83c19a2b5b0af000bd82cca64daa9234a580f785 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessage.cs +++ b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessage.cs @@ -8,6 +8,8 @@ public IDeviceMessageChild? ChildDevice { get; set; } = new DeviceMessageChild(); + public int DataLength => (Header?.DataLength ?? 0) + (MainDevice?.DataLength ?? 0) + (ChildDevice?.DataLength ?? 0); + public void Dispose() { DisposeMainDevice(); diff --git a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageChild.cs b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageChild.cs index 7761cb3a973d0adb743dd973d6cd50c44de6d2eb..db72b684a1bcb932549180fe77aa125982c359c6 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageChild.cs +++ b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageChild.cs @@ -33,6 +33,8 @@ namespace DeviceCommons.DeviceMessages.Models.V1 } } + public int DataLength => 1 + (ChildArray?.Sum(i => i.DataLength) ?? 0); + public void AddOrUpdateChild(IDeviceMessageInfo child) { if (string.IsNullOrEmpty(child.DID)) diff --git a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfo.cs b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfo.cs index dc57a73bb5eb52f4ee21ca7ec3b537ee865d98bb..2c4611f86dad60a8c9d901f429f2f15a63020bc1 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfo.cs +++ b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfo.cs @@ -8,7 +8,7 @@ namespace DeviceCommons.DeviceMessages.Models.V1 { } - public byte Length { get => (byte)(DIDBytes?.Length ?? 0); } + public byte Length => (byte)(DIDBytes?.Length ?? 0); public byte[]? DIDBytes { get => Encoding.UTF8.GetBytes(DID ?? ""); set => DID = Encoding.UTF8.GetString(value ?? []); } @@ -17,5 +17,7 @@ namespace DeviceCommons.DeviceMessages.Models.V1 public byte DeviceType { get; set; } = 0x00; public IDeviceMessageInfoReadings? Reading { get; set; } + + public int DataLength => 2 + Length + (Reading?.DataLength ?? 0); } } diff --git a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReading.cs b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReading.cs index 2aab26956fad5671bf14d502d3d22ce014a95ea6..f43642278ac947ce2665f02af5a66675730a74cd 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReading.cs +++ b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReading.cs @@ -21,5 +21,7 @@ public short TimeOffset { get; set; } = 0; public IDeviceMessageInfoReadingStates? State { get; set; } + + public int DataLength => 2 + (State?.DataLength ?? 0); } } diff --git a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadingState.cs b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadingState.cs index 7938c0b1516771fe16cd595f33510cb4eb56efdc..73ab6fb613ab426952bd802f18ad9b1c3c982852 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadingState.cs +++ b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadingState.cs @@ -16,7 +16,7 @@ namespace DeviceCommons.DeviceMessages.Models.V1 if (ValueType != StateValueTypeEnum.String && ValueType != StateValueTypeEnum.Binary) { - Value = new byte[DeviceMessageUtilities.GetValueLength(ValueType,null)]; + Value = new byte[DeviceMessageUtilities.GetValueLength(ValueType, null)]; } else { @@ -25,7 +25,9 @@ namespace DeviceCommons.DeviceMessages.Models.V1 } } - public byte[] Value { get; set; } = Array.Empty(); + public byte ValueLength => (StateValueTypeEnum)Type switch { StateValueTypeEnum.String => 1, StateValueTypeEnum.Binary => 2, _ => 0 }; + + public byte[] Value { get; set; } = []; public object? ValueText { @@ -64,8 +66,12 @@ namespace DeviceCommons.DeviceMessages.Models.V1 } public StateValueTypeEnum ValueType { get; set; } = StateValueTypeEnum.String; + + public string? Metadata { get; set; } + public int DataLength => 2 + ValueLength + Value.Length; + public void Dispose() { if (Value != null) diff --git a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadingStates.cs b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadingStates.cs index 3843f744284faf124a06ad067296fbbd95e3e4fa..99a35f5c5ee93376f0459bd3aa394a310c1cd93e 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadingStates.cs +++ b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadingStates.cs @@ -7,6 +7,9 @@ namespace DeviceCommons.DeviceMessages.Models.V1 public byte Count => (byte)(StateArray?.Length ?? 0); public IDeviceMessageInfoReadingState[]? StateArray { get; set; } + + public int DataLength => 1 + (StateArray?.Sum(x => x.DataLength) ?? 0); + public void Dispose() { if (StateArray != null) diff --git a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadings.cs b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadings.cs index 192c10c07aaf7e56dfd070aef5897679dac3005b..29650d8b0b61f352b92c057a6f2beb4b6047e7bb 100644 --- a/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadings.cs +++ b/DeviceCommons/DeviceMessages/Models/V1/DeviceMessageInfoReadings.cs @@ -6,6 +6,9 @@ namespace DeviceCommons.DeviceMessages.Models.V1 { public byte Count { get => (byte)(ReadingArray?.Length ?? 0); } public IDeviceMessageInfoReading[]? ReadingArray { get; set; } + + public int DataLength => 1 + (ReadingArray?.Sum(i => i.DataLength) ?? 0); + public void Dispose() { if (ReadingArray != null) diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageHeaderParser.cs b/DeviceCommons/DeviceMessages/Serialization/DeviceMessageHeaderParser.cs similarity index 85% rename from DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageHeaderParser.cs rename to DeviceCommons/DeviceMessages/Serialization/DeviceMessageHeaderParser.cs index db8b64bf5d8f48a3dc25dff56e210aeaccce5efe..7fb1b6401a047d09266b21ab3008e03e0a11e8d0 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageHeaderParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/DeviceMessageHeaderParser.cs @@ -1,8 +1,8 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Enums; -using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Models; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers +namespace DeviceCommons.DeviceMessages.Serialization { public class DeviceMessageHeaderParser : AbstractMessageParser, IDeviceMessageHeaderParser { @@ -15,7 +15,7 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers { IDeviceMessageHeader model = new DeviceMessageHeader(); - model.Header = bytes[2..].ToArray(); + model.Header = bytes[..2].ToArray(); model.Version = bytes[2]; model.TimeStampFormat = (TimeStampFormatEnum)(bytes[3] >> 0 & 0x01); diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageHeaderSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/DeviceMessageHeaderSerializer.cs similarity index 82% rename from DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageHeaderSerializer.cs rename to DeviceCommons/DeviceMessages/Serialization/DeviceMessageHeaderSerializer.cs index 43d5c4170e4bd8e572006abd3b50f6a51b3d0adb..5b5f589488c2782c3e9d9b56626017d2431ab1ea 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageHeaderSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/DeviceMessageHeaderSerializer.cs @@ -1,9 +1,9 @@ using DeviceCommons.DataHandling; using DeviceCommons.DeviceMessages.Abstractions; -using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Models; using System.Buffers; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers +namespace DeviceCommons.DeviceMessages.Serialization { public class DeviceMessageHeaderSerializer : AbstractMessageSerializer, IDeviceMessageHeaderSerializer { @@ -11,8 +11,6 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers { } - public override void Serializer(ArrayBufferWriter writer) => Serializer(writer, Model); - private readonly static int HEADERLENGTH = 4; public override void Serializer(ArrayBufferWriter writer, IDeviceMessageHeader model) { diff --git a/DeviceCommons/DeviceMessages/Serialization/DeviceMessageParser.cs b/DeviceCommons/DeviceMessages/Serialization/DeviceMessageParser.cs index a9887c81d648d737d446f62310367f9b730e2e4a..618fe3beb4a07c0490b227f4959570b21d390bb8 100644 --- a/DeviceCommons/DeviceMessages/Serialization/DeviceMessageParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/DeviceMessageParser.cs @@ -1,7 +1,9 @@ using DeviceCommons.DataHandling; using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Enums; using DeviceCommons.DeviceMessages.Models.V1; using DeviceCommons.Exceptions; +using DeviceCommons.Security; namespace DeviceCommons.DeviceMessages.Serialization { @@ -23,15 +25,40 @@ namespace DeviceCommons.DeviceMessages.Serialization Model.Header = DeviceMessageSerializerProvider.HeaderPar.Parser(headerBytes); if (Model.Header == null) throw new InvalidOperationException("未初始化消息头"); - switch (Model.Header.Version) + + if (Model.Header.Header == null || + Model.Header.Header.Length != 2 || + Model.Header.Header[0] != 0xC0 || + Model.Header.Header[1] != 0xBF) + { + throw new InvalidOperationException("协议头错误"); + } + + int crcLength = CrcCalculator.GetCrcLength(Model.Header?.CRCType ?? CRCTypeEnum.CRC16); + + if (crcLength > 0) { - case 0x01: - _ = new V1.ProcessVersionData(Model, bytes); - break; - default: - _ = new V1.ProcessVersionData(Model, bytes); - break; + + byte[] receivedCrc = bytes.Slice(bytes.Length - crcLength).ToArray(); + byte[] dataForCrc = bytes[..(bytes.Length - crcLength)].ToArray(); + + byte[] calculatedCrc = CrcCalculator.CalculateCrcBytes(Model?.Header?.CRCType ?? CRCTypeEnum.None, dataForCrc); + + if (!receivedCrc.SequenceEqual(calculatedCrc)) + { + string received = BitConverter.ToString(receivedCrc); + string calculated = BitConverter.ToString(calculatedCrc); + throw new InvalidMessageException($"CRC validation failed. Expected 0x{calculated}, but received 0x{received}."); + } } + IProcessVersion process = Model?.Header?.Version switch + { + 0x01 => new V1.ProcessVersionData(), + 0x02 => new V2.ProcessVersionData(), + _ => throw new ArgumentException($"版本号{Model?.Header?.Version}错误"), + }; + + process.Parser(Model, bytes[..^crcLength]); } catch (Exception ex) { diff --git a/DeviceCommons/DeviceMessages/Serialization/DeviceMessageSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/DeviceMessageSerializer.cs index a237015bcd34921b96c35da7f0bfe7c60d11d417..74c8873a45ac8ff04a86cc267a1d595b963067e3 100644 --- a/DeviceCommons/DeviceMessages/Serialization/DeviceMessageSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/DeviceMessageSerializer.cs @@ -1,8 +1,6 @@ -using DeviceCommons.DataHandling; -using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Enums; using DeviceCommons.DeviceMessages.Models.V1; -using DeviceCommons.DeviceMessages.Serialization.V1.Serializers; using DeviceCommons.Security; using System.Buffers; @@ -18,17 +16,20 @@ namespace DeviceCommons.DeviceMessages.Serialization public override void Serializer(ArrayBufferWriter writer, IDeviceMessage model) { - _ = new DeviceMessageSerializer(); + IProcessVersion process = model?.Header?.Version switch + { + 0x01 => new V1.ProcessVersionData(), + 0x02 => new V2.ProcessVersionData(), + _ => throw new ArgumentException($"版本号{model?.Header?.Version}错误"), + }; - new DeviceMessageChildSerializer().Serializer(writer, model.ChildDevice ?? new DeviceMessageChild()); - new DeviceMessageInfoSerializer().Serializer(writer, model.MainDevice ?? new DeviceMessageInfo()); - new DeviceMessageHeaderSerializer().Serializer(writer, model.Header ?? new DeviceMessageHeader()); + writer.Write(process.Serializer(model)); byte[] bytes = writer.WrittenSpan.ToArray(); if (model.Header?.CRCType != CRCTypeEnum.None) { - writer.Write(CrcCalculator.CalculateCrcBytes(model.Header.CRCType, writer.WrittenSpan.ToArray())); + writer.Write(CrcCalculator.CalculateCrcBytes(model?.Header?.CRCType ?? CRCTypeEnum.CRC16, writer.WrittenSpan.ToArray())); } } } diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageChildParser.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageChildParser.cs similarity index 75% rename from DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageChildParser.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageChildParser.cs index ff536fa3933c94b178433850c3a5d113db42fb6a..c45561b4304b24ecf46018f96c3f33acae427f9a 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageChildParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageChildParser.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageChildParser : IMessageParser { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageChildSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageChildSerializer.cs similarity index 75% rename from DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageChildSerializer.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageChildSerializer.cs index 0f503be38b4984435baafb0917ef8b15e9c9c2fc..f6e6ba9a42e58bab845f6a5ae758a28069c9db1b 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageChildSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageChildSerializer.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageChildSerializer : IMessageSerializer { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageHeaderParser.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageHeaderParser.cs similarity index 58% rename from DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageHeaderParser.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageHeaderParser.cs index 1bf0d6e430c3a130a5b0331f78a50538a2301bd4..5f2f93907f7058bbf44596e880433bd93c32233f 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageHeaderParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageHeaderParser.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; -using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Models; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageHeaderParser : IMessageParser { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageHeaderSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageHeaderSerializer.cs similarity index 58% rename from DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageHeaderSerializer.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageHeaderSerializer.cs index 57f1a940e093ef6633ca84308734ffb26434cc6b..868f7bdff9bd3dca56ae4d54413fa0a96ae90767 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageHeaderSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageHeaderSerializer.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; -using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Models; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageHeaderSerializer : IMessageSerializer { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoParser.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoParser.cs similarity index 75% rename from DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoParser.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoParser.cs index b0715df80ca9e74a6f22765e289399f67827237f..565c2394ce0e3add57342bd9bd850e2b09bc88c7 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoParser.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoParser : IMessageParser { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingParser.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingParser.cs similarity index 76% rename from DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingParser.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingParser.cs index 63355ad3ea8e056ab7e4de44ab5ce7372f8c9ec8..d893a101941c360862759ff7b1ad242b01e72a7a 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingParser.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoReadingParser : IMessageParser { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingSerializer.cs similarity index 76% rename from DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingSerializer.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingSerializer.cs index c827406c0799bcc473c48b21f030f47b8a330687..ec10273fe160270f6b43cdfaa3d036c566973c32 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingSerializer.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoReadingSerializer : IMessageSerializer { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingStateParser.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStateParser.cs similarity index 77% rename from DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingStateParser.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStateParser.cs index 90b3373c5c774821b4935323bfb471f76c88abc3..ceaee675c7d0ba93325d40d26e9f092aa086eff4 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingStateParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStateParser.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoReadingStateParser : IMessageParser { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingStateSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStateSerializer.cs similarity index 77% rename from DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingStateSerializer.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStateSerializer.cs index b976f581dbd7af176f0363057280b98841501a8d..6a50b6831a26d09947874fb07c2a7af5c8cbaf3c 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingStateSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStateSerializer.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoReadingStateSerializer : IMessageSerializer { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingStatesParser.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStatesParser.cs similarity index 77% rename from DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingStatesParser.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStatesParser.cs index 745fe5f69c915509822a9b731ba2aade7a6423df..b5dfb6742c01e591437ebc0819c71fd0d96afde4 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingStatesParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStatesParser.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoReadingStatesParser : IMessageParser { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingStatesSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStatesSerializer.cs similarity index 77% rename from DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingStatesSerializer.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStatesSerializer.cs index 79738c6c45977e615d0b5b337d4c416116f0c645..c8ac1890cece4227fa7a85cb7f29c1275b1db06e 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingStatesSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingStatesSerializer.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoReadingStatesSerializer : IMessageSerializer { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingsParser.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingsParser.cs similarity index 76% rename from DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingsParser.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingsParser.cs index f0c1d1a2cfb8ae70e8191850d08f3c8c3526bddf..fd8f4c09d3555df7da8efa6c8f875ee379404ec9 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/IDeviceMessageInfoReadingsParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingsParser.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoReadingsParser : IMessageParser { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingsSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingsSerializer.cs similarity index 76% rename from DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingsSerializer.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingsSerializer.cs index 7d962efc73439bfbba4468efc8245dd9379cebb4..41e1e09f1504f369d339006b34c32275a502fafd 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoReadingsSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoReadingsSerializer.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoReadingsSerializer : IMessageSerializer { diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoSerializer.cs similarity index 75% rename from DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoSerializer.cs rename to DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoSerializer.cs index 7b12a71cbd108a387493d4249b2ae1d6cf99df15..d117865ae73bca86539ec10a20a7108ea2d36459 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/IDeviceMessageInfoSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/IDeviceMessageInfoSerializer.cs @@ -1,7 +1,7 @@ using DeviceCommons.DeviceMessages.Abstractions; using DeviceCommons.DeviceMessages.Models.V1; -namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers +namespace DeviceCommons.DeviceMessages.Serialization { public interface IDeviceMessageInfoSerializer : IMessageSerializer { diff --git a/DeviceCommons/DeviceMessages/Serialization/IProcessVersion.cs b/DeviceCommons/DeviceMessages/Serialization/IProcessVersion.cs new file mode 100644 index 0000000000000000000000000000000000000000..f036a3c755e347937c2267c16dd7c2c53bfe026c --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/IProcessVersion.cs @@ -0,0 +1,11 @@ +using DeviceCommons.DeviceMessages.Models.V1; + +namespace DeviceCommons.DeviceMessages.Serialization +{ + public interface IProcessVersion + { + void Parser(IDeviceMessage model, ReadOnlySpan bytes); + ReadOnlySpan Serializer(IDeviceMessage model); + + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageChildParser.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageChildParser.cs index bc88c1a3ce3c7b5c8801e09c42c15f80b59502b8..bd17337c3abc5e836965b96dc2c2895f8c1dc5f3 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageChildParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageChildParser.cs @@ -41,7 +41,7 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers { DID = deviceId, DeviceType = deviceType, - Reading = DeviceMessageSerializerProvider.InfoReadingsPar.Parser(bytes.Slice(currentIndex, readingsDataLength)) + Reading = DeviceMessageSerializerProvider.InfoReadingsV1Par.Parser(bytes.Slice(currentIndex, readingsDataLength)) }; childList.Add(childDevice); diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoParser.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoParser.cs index e4f8228aaeeec649a9dd884c304244cf003b978c..51a4d55928611c93d506e9104fe698aef82d3767 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoParser.cs @@ -33,7 +33,7 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers int readingsDataLength = bytes.Length - currentIndex; if (readingsDataLength > 0) { - model.Reading ??= DeviceMessageSerializerProvider.InfoReadingsPar.Parser(bytes.Slice(currentIndex, readingsDataLength)); + model.Reading ??= DeviceMessageSerializerProvider.InfoReadingsV1Par.Parser(bytes.Slice(currentIndex, readingsDataLength)); } else model.Reading = new DeviceMessageInfoReadings(); return model; diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingParser.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingParser.cs index 049dd77b084f9f21e9046d55d06f8286003a0e8b..17eba78ae671d8a55cb9dec206da3034e58d84b1 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingParser.cs @@ -19,7 +19,7 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers model.Offset = bytes[..2].ToArray(); - model.State = DeviceMessageSerializerProvider.InfoReadingStatesPar.Parser(bytes[2..]); + model.State = DeviceMessageSerializerProvider.InfoReadingStatesV1Par.Parser(bytes[2..]); return model; } diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingStatesParser.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingStatesParser.cs index 261c81ad6f4cc34fcf39f2f8babd38c0e685f95d..0a46dae46a556ef7972389932a6fb730132aee14 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingStatesParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingStatesParser.cs @@ -33,7 +33,7 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers byte[] stateData = bytes.Slice(currentIndex, valueLength).ToArray(); - model.StateArray[i] = DeviceMessageSerializerProvider.InfoReadingStatePar.Parser(stateData); + model.StateArray[i] = DeviceMessageSerializerProvider.InfoReadingStateV1Par.Parser(stateData); currentIndex += valueLength; diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingsParser.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingsParser.cs index 1f961262e9d80622da5aca5d3bfefc92092cab90..c40888a477dfac97eb64dc9b8da39f386c313355 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingsParser.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Parsers/DeviceMessageInfoReadingsParser.cs @@ -30,7 +30,7 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Parsers } int totalReadingLength = 2 + stateDataLength; model.ReadingArray[i] = - DeviceMessageSerializerProvider.InfoReadingPar.Parser( + DeviceMessageSerializerProvider.InfoReadingV1Par.Parser( bytes.Slice(currentIndex, totalReadingLength )); currentIndex += totalReadingLength; diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/ProcessVersionData.cs b/DeviceCommons/DeviceMessages/Serialization/V1/ProcessVersionData.cs index bc46bfbae993324e0835e2e55854c6210c958fe0..f157f0824f766eeec429529024f35c9cec3debb0 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/ProcessVersionData.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/ProcessVersionData.cs @@ -1,71 +1,61 @@ using DeviceCommons.DataHandling; -using DeviceCommons.DeviceMessages.Enums; +using DeviceCommons.DeviceMessages.Models; using DeviceCommons.DeviceMessages.Models.V1; -using DeviceCommons.Exceptions; -using DeviceCommons.Security; +using DeviceCommons.DeviceMessages.Serialization.V1.Serializers; +using System.Buffers; namespace DeviceCommons.DeviceMessages.Serialization.V1 { - public class ProcessVersionData + public class ProcessVersionData : IProcessVersion { - public ProcessVersionData(IDeviceMessage model, ReadOnlySpan bytes) + public void Parser(IDeviceMessage model, ReadOnlySpan bytes) { - if (model == null) throw new ArgumentNullException("model"); - if (model.Header == null) throw new ArgumentNullException("model.Header"); - - int crcLength = CrcCalculator.GetCrcLength(model.Header?.CRCType ?? CRCTypeEnum.CRC16); - - if (crcLength > 0) - { - - byte[] receivedCrc = bytes.Slice(bytes.Length - crcLength).ToArray(); - byte[] dataForCrc = bytes[..(bytes.Length - crcLength)].ToArray(); - - byte[] calculatedCrc = CrcCalculator.CalculateCrcBytes(model.Header.CRCType, dataForCrc); - - - if (!receivedCrc.SequenceEqual(calculatedCrc)) - { - string received = BitConverter.ToString(receivedCrc); - string calculated = BitConverter.ToString(calculatedCrc); - throw new InvalidMessageException($"CRC validation failed. Expected 0x{calculated}, but received 0x{received}."); - } - } + ArgumentNullException.ThrowIfNull(model); int index = 4; int mainDeviceLength = CalculateMainDeviceDataLength(bytes, index); if (mainDeviceLength > 0) { byte[] mainDeviceData = bytes.Slice(index, mainDeviceLength).ToArray(); - model.MainDevice = DeviceMessageSerializerProvider.InfoPar.Parser(mainDeviceData); + model.MainDevice = DeviceMessageSerializerProvider.InfoV1Par.Parser(mainDeviceData); index += mainDeviceLength; } - int childDeviceLength = bytes.Length - index - crcLength; + int childDeviceLength = bytes.Length - index; if (childDeviceLength < 0) throw new ArgumentException("Invalid data length for child devices"); if (childDeviceLength > 0) { byte[] childDeviceData = bytes.Slice(index, childDeviceLength).ToArray(); - model.ChildDevice = DeviceMessageSerializerProvider.ChildPar.Parser(childDeviceData); + model.ChildDevice = DeviceMessageSerializerProvider.ChildV1Par.Parser(childDeviceData); index += childDeviceLength; } } + public ReadOnlySpan Serializer(IDeviceMessage model) + { + ArgumentNullException.ThrowIfNull(model); + var arrayBufferWriter = new ArrayBufferWriter(); + DeviceMessageSerializerProvider.ChildV1Ser.Serializer(arrayBufferWriter, model.ChildDevice ?? new DeviceMessageChild()); + DeviceMessageSerializerProvider.InfoV1Ser.Serializer(arrayBufferWriter, model.MainDevice ?? new DeviceMessageInfo()); + DeviceMessageSerializerProvider.HeaderSer.Serializer(arrayBufferWriter, model.Header ?? new DeviceMessageHeader()); + return arrayBufferWriter.WrittenSpan; + } + private static int CalculateMainDeviceDataLength(ReadOnlySpan bytes, int startIndex) { int index = startIndex; if (index >= bytes.Length) return 0; byte didLength = bytes[index++]; - index += didLength; + index += didLength; if (index >= bytes.Length) return index - startIndex; - index++; + index++; if (index >= bytes.Length) return index - startIndex; byte readingCount = bytes[index++]; for (int i = 0; i < readingCount; i++) { if (index + 2 > bytes.Length) return bytes.Length - startIndex; - index += 2; + index += 2; if (index >= bytes.Length) break; byte stateCount = bytes[index++]; for (int j = 0; j < stateCount; j++) diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageChildSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageChildSerializer.cs index 78a88489bcc5ad8d9978c08f5d761ff1c7a9af6d..4cdafecfd6d67cf3b921c75a617f2980dec1e4d4 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageChildSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageChildSerializer.cs @@ -10,9 +10,6 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers { } - public override void Serializer(ArrayBufferWriter writer) => Serializer(writer, Model); - - public override void Serializer(ArrayBufferWriter writer, IDeviceMessageChild model) { ArgumentNullException.ThrowIfNull(model); diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingSerializer.cs index 9e4978ed0c28dae6259c84ad2f72961662a70f8c..0c37650b168d26455ad0e44ddd63a7177b43e35d 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingSerializer.cs @@ -10,8 +10,6 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers { } - public override void Serializer(ArrayBufferWriter writer) => Serializer(writer, Model); - public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfoReading model) { ArgumentNullException.ThrowIfNull(model); diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingStateSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingStateSerializer.cs index 2a798e7a9c1947be338c74ab94a7935b64ce0fef..400ada75f5164f6c1dc06e898038edf16057555c 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingStateSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingStateSerializer.cs @@ -11,9 +11,6 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers public DeviceMessageInfoReadingStateSerializer() : base(new DeviceMessageInfoReadingState()) { } - - public override void Serializer(ArrayBufferWriter writer) => Serializer(writer, Model); - public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfoReadingState model) { if (model == null) throw new ArgumentNullException(nameof(model)); diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingStatesSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingStatesSerializer.cs index 765e7dd1acb3f88434ef0c514541103a6451b665..42556258246d2833fb8905b23a5f9cf5772aaebe 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingStatesSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingStatesSerializer.cs @@ -9,10 +9,6 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers public DeviceMessageInfoReadingStatesSerializer() : base(new DeviceMessageInfoReadingStates()) { } - - public override void Serializer(ArrayBufferWriter writer) => Serializer(writer, Model); - - public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfoReadingStates model) { ArgumentNullException.ThrowIfNull(model); diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingsSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingsSerializer.cs index 3661c1e2d873b38700c8681380a8626ba29fa6cb..74f0c497f4f29961d9592a8d84f045dbdada14fb 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingsSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoReadingsSerializer.cs @@ -10,8 +10,6 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers { } - public override void Serializer(ArrayBufferWriter writer) => Serializer(writer, Model); - public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfoReadings model) { ArgumentNullException.ThrowIfNull(model); diff --git a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoSerializer.cs index 70122ae7088dcc632927ba38c8e0e23c9260b62c..9191b1361d2b9b63b66601b838b8f72ec0474bec 100644 --- a/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoSerializer.cs +++ b/DeviceCommons/DeviceMessages/Serialization/V1/Serializers/DeviceMessageInfoSerializer.cs @@ -10,8 +10,6 @@ namespace DeviceCommons.DeviceMessages.Serialization.V1.Serializers { } - public override void Serializer(ArrayBufferWriter writer) => Serializer(writer, Model); - public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfo model) { if (string.IsNullOrEmpty(model.DID)) diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageChildParser.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageChildParser.cs new file mode 100644 index 0000000000000000000000000000000000000000..a21ab885c580c802473f269ef54e3ef150ef9cf7 --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageChildParser.cs @@ -0,0 +1,29 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; +using System.Text; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Parsers +{ + public class DeviceMessageChildParser : AbstractMessageParser, IDeviceMessageChildParser + { + public DeviceMessageChildParser() : base(new DeviceMessageChild()) + { + } + + public override IDeviceMessageChild Parser(ReadOnlySpan bytes) + { + byte count = bytes[0]; + IDeviceMessageChild model = new DeviceMessageChild(); + var childArray = new IDeviceMessageInfo[count]; + var bytesTemp = bytes[1..]; + for (int i = 0; i < count; i++) + { + childArray[i] = DeviceMessageSerializerProvider.InfoV2Par.Parser(bytesTemp); + bytesTemp = bytesTemp[childArray[i].DataLength..]; + } + model.ChildArray = childArray; + return model; + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoParser.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoParser.cs new file mode 100644 index 0000000000000000000000000000000000000000..a365bdb1679a7163335f73fcbe17d08921c68183 --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoParser.cs @@ -0,0 +1,26 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Parsers +{ + public class DeviceMessageInfoParser : AbstractMessageParser, IDeviceMessageInfoParser + { + public DeviceMessageInfoParser() : base(new DeviceMessageInfo()) + { + + } + + public override IDeviceMessageInfo Parser(ReadOnlySpan bytes) + { + int currentIndex = 1; + IDeviceMessageInfo model = new DeviceMessageInfo(); + model.DIDBytes = bytes.Slice(currentIndex, bytes[0]).ToArray(); + currentIndex += bytes[0]; + model.DeviceType = bytes.Slice(currentIndex, 1)[0]; + currentIndex++; + model.Reading = DeviceMessageSerializerProvider.InfoReadingsV2Par.Parser(bytes[currentIndex..]); + return model; + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingParser.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingParser.cs new file mode 100644 index 0000000000000000000000000000000000000000..6b595384047f6c86690df25af1877ff9d3beb1c7 --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingParser.cs @@ -0,0 +1,23 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Parsers +{ + public class DeviceMessageInfoReadingParser : AbstractMessageParser, IDeviceMessageInfoReadingParser + { + public DeviceMessageInfoReadingParser() : base(new DeviceMessageInfoReading()) + { + } + + public override IDeviceMessageInfoReading Parser(ReadOnlySpan bytes) + { + IDeviceMessageInfoReading model = new DeviceMessageInfoReading + { + Offset = bytes[..2].ToArray(), + State = DeviceMessageSerializerProvider.InfoReadingStatesV2Par.Parser(bytes[2..]) + }; + return model; + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingStateParser.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingStateParser.cs new file mode 100644 index 0000000000000000000000000000000000000000..9696d19fcb41f5b91d3e0e3ca0dc55c25e69159b --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingStateParser.cs @@ -0,0 +1,39 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Enums; +using DeviceCommons.DeviceMessages.Models.V1; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Parsers +{ + public class DeviceMessageInfoReadingStateParser : AbstractMessageParser, IDeviceMessageInfoReadingStateParser + { + public DeviceMessageInfoReadingStateParser() : base(new DeviceMessageInfoReadingState()) + { + } + + public override IDeviceMessageInfoReadingState Parser(ReadOnlySpan bytes) + { + IDeviceMessageInfoReadingState model = new DeviceMessageInfoReadingState + { + SID = bytes[0], + Type = bytes[1] + }; + StateValueTypeEnum type = (StateValueTypeEnum)bytes[1]; + var valueLength = DeviceMessageUtilities.GetValueLength((StateValueTypeEnum)bytes[1], bytes, 2); + if(type == StateValueTypeEnum.String) + { + model.Value = bytes.Slice(3, valueLength).ToArray(); + } + else if(type == StateValueTypeEnum.Binary) + { + model.Value = bytes.Slice(4, valueLength).ToArray(); + } + else + { + model.Value = bytes.Slice(2, valueLength).ToArray(); + } + + return model; + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingStatesParser.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingStatesParser.cs new file mode 100644 index 0000000000000000000000000000000000000000..d1f574f27ed796b2278ecd5e165dbc11f293a53a --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingStatesParser.cs @@ -0,0 +1,27 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Parsers +{ + public class DeviceMessageInfoReadingStatesParser : AbstractMessageParser, IDeviceMessageInfoReadingStatesParser + { + public DeviceMessageInfoReadingStatesParser() : base(new DeviceMessageInfoReadingStates()) + { + } + + public override IDeviceMessageInfoReadingStates Parser(ReadOnlySpan bytes) + { + byte count = bytes[0]; + IDeviceMessageInfoReadingStates model = new DeviceMessageInfoReadingStates(); + model.StateArray = new IDeviceMessageInfoReadingState[count]; + var bytesTemp = bytes[1..]; + for (int i = 0; i < count; i++) + { + model.StateArray[i] = DeviceMessageSerializerProvider.InfoReadingStateV2Par.Parser(bytesTemp); + bytesTemp = bytesTemp[model.StateArray[i].DataLength..]; + } + return model; + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingsParser.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingsParser.cs new file mode 100644 index 0000000000000000000000000000000000000000..52e85772b1fc184b3a12d15a2e420197f0153d2a --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Parsers/DeviceMessageInfoReadingsParser.cs @@ -0,0 +1,27 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Parsers +{ + public class DeviceMessageInfoReadingsParser : AbstractMessageParser, IDeviceMessageInfoReadingsParser + { + public DeviceMessageInfoReadingsParser() : base(new DeviceMessageInfoReadings()) + { + } + + public override IDeviceMessageInfoReadings Parser(ReadOnlySpan bytes) + { + byte count = bytes[0]; + IDeviceMessageInfoReadings model = new DeviceMessageInfoReadings(); + model.ReadingArray = new IDeviceMessageInfoReading[count]; + var bytesTemp = bytes[1..]; + for (int i = 0; i < count; i++) + { + model.ReadingArray[i] = DeviceMessageSerializerProvider.InfoReadingV2Par.Parser(bytesTemp); + bytesTemp = bytesTemp[model.ReadingArray[i].DataLength..]; + } + return model; + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/ProcessVersionData.cs b/DeviceCommons/DeviceMessages/Serialization/V2/ProcessVersionData.cs new file mode 100644 index 0000000000000000000000000000000000000000..453e987b21f4d79302577918ae165174c3e92951 --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/ProcessVersionData.cs @@ -0,0 +1,38 @@ +using DeviceCommons.DeviceMessages.Models; +using DeviceCommons.DeviceMessages.Models.V1; +using DeviceCommons.DeviceMessages.Serialization.V2.Serializers; +using DeviceCommons.DeviceMessages.Serialization.V2.Parsers; +using System.Buffers; +using DeviceCommons.DataHandling; + +namespace DeviceCommons.DeviceMessages.Serialization.V2 +{ + public class ProcessVersionData : IProcessVersion + { + public void Parser(IDeviceMessage model, ReadOnlySpan bytes) + { + ArgumentNullException.ThrowIfNull(model); + var deviceTemp = DeviceMessageSerializerProvider.ChildV2Par.Parser(bytes[4..]); + ArgumentNullException.ThrowIfNull(deviceTemp.ChildArray); + model.MainDevice = deviceTemp.ChildArray[0]; + model.ChildDevice ??= new DeviceMessageChild(); + model.ChildDevice.ChildArray = deviceTemp.ChildArray.AsSpan()[1..].ToArray(); + } + + public ReadOnlySpan Serializer(IDeviceMessage model) + { + ArgumentNullException.ThrowIfNull(model); + ArgumentNullException.ThrowIfNull(model.MainDevice); + ArgumentNullException.ThrowIfNull(model.ChildDevice); + ArgumentNullException.ThrowIfNull(model.ChildDevice.ChildArray); + var childTemp = new IDeviceMessageInfo[model.ChildDevice.Count + 1]; + childTemp[0] = model.MainDevice; + model.ChildDevice.ChildArray.CopyTo(childTemp, 1); + model.ChildDevice.ChildArray = childTemp; + var arrayBufferWriter = new ArrayBufferWriter(); + DeviceMessageSerializerProvider.HeaderSer.Serializer(arrayBufferWriter, model.Header ?? new DeviceMessageHeader()); + DeviceMessageSerializerProvider.ChildV2Ser.Serializer(arrayBufferWriter, model.ChildDevice ?? new DeviceMessageChild()); + return arrayBufferWriter.WrittenSpan; + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageChildSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageChildSerializer.cs new file mode 100644 index 0000000000000000000000000000000000000000..c0593ca4d0d3e2b0232faa2c56aa49d5eb161756 --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageChildSerializer.cs @@ -0,0 +1,28 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; +using System.Buffers; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Serializers +{ + public class DeviceMessageChildSerializer : AbstractMessageSerializer, IDeviceMessageChildSerializer + { + public DeviceMessageChildSerializer() : base(new DeviceMessageChild()) + { + } + + public override void Serializer(ArrayBufferWriter writer, IDeviceMessageChild message) + { + ArgumentNullException.ThrowIfNull(message); + ArgumentNullException.ThrowIfNull(message.ChildArray); + writer.Write([message.Count]); + if (message.Count > 0) + { + foreach (var child in message.ChildArray) + { + DeviceMessageSerializerProvider.InfoV2Ser.Serializer(writer, child); + } + } + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageHeaderSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageHeaderSerializer.cs new file mode 100644 index 0000000000000000000000000000000000000000..d6b9b8eb35612ce302fb0d6e872b51c18da79547 --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageHeaderSerializer.cs @@ -0,0 +1,21 @@ +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models; +using System.Buffers; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Serializers +{ + public class DeviceMessageHeaderSerializer : AbstractMessageSerializer, IDeviceMessageHeaderSerializer + { + public DeviceMessageHeaderSerializer() : base(new DeviceMessageHeader()) + { + } + + private readonly static int HEADERLENGTH = 4; + public override void Serializer(ArrayBufferWriter writer, IDeviceMessageHeader model) + { + writer.Write(model.Header); + writer.Write([model.Version]); + writer.Write([model.Mark]); + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingSerializer.cs new file mode 100644 index 0000000000000000000000000000000000000000..0b396ca6cf6e7cc3fc614a347972321275006ac0 --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingSerializer.cs @@ -0,0 +1,22 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; +using System.Buffers; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Serializers +{ + public class DeviceMessageInfoReadingSerializer : AbstractMessageSerializer, IDeviceMessageInfoReadingSerializer + { + public DeviceMessageInfoReadingSerializer() : base(new DeviceMessageInfoReading()) + { + } + + public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfoReading message) + { + ArgumentNullException.ThrowIfNull(message); + ArgumentNullException.ThrowIfNull(message.State); + writer.Write(message.Offset); + DeviceMessageSerializerProvider.InfoReadingStatesV2Ser.Serializer(writer, message.State); + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingStateSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingStateSerializer.cs new file mode 100644 index 0000000000000000000000000000000000000000..a08c110170dc9aad8eeedf358bb2d237725fab7d --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingStateSerializer.cs @@ -0,0 +1,36 @@ +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Enums; +using DeviceCommons.DeviceMessages.Models.V1; +using System.Buffers; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Serializers +{ + public class DeviceMessageInfoReadingStateSerializer : AbstractMessageSerializer, IDeviceMessageInfoReadingStateSerializer + { + public DeviceMessageInfoReadingStateSerializer() : base(new DeviceMessageInfoReadingState()) + { + + } + + public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfoReadingState message) + { + ArgumentNullException.ThrowIfNull(message); + ArgumentNullException.ThrowIfNull(message.SID); + ArgumentNullException.ThrowIfNull(message.ValueType); + ArgumentNullException.ThrowIfNull(message.Value); + writer.Write([message.SID]); + writer.Write([message.Type]); + if (message.ValueType == StateValueTypeEnum.String) + { + if (message.Value.Length > byte.MaxValue) throw new IndexOutOfRangeException(nameof(message.Value)); + writer.Write([(byte)message.Value.Length]); + } + else if (message.ValueType == StateValueTypeEnum.Binary) + { + if (message.Value.Length > ushort.MaxValue) throw new IndexOutOfRangeException(nameof(message.Value)); + writer.Write(BitConverter.GetBytes((UInt16)message.Value.Length)); + } + writer.Write(message.Value); + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingStatesSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingStatesSerializer.cs new file mode 100644 index 0000000000000000000000000000000000000000..21a7ad23ea6a5cee4726cabe241f34905f7e59aa --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingStatesSerializer.cs @@ -0,0 +1,28 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; +using System.Buffers; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Serializers +{ + public class DeviceMessageInfoReadingStatesSerializer : AbstractMessageSerializer, IDeviceMessageInfoReadingStatesSerializer + { + public DeviceMessageInfoReadingStatesSerializer() : base(new DeviceMessageInfoReadingStates()) + { + } + + public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfoReadingStates message) + { + ArgumentNullException.ThrowIfNull(message); + ArgumentNullException.ThrowIfNull(message.StateArray); + writer.Write([message.Count]); + if (message.Count > 0) + { + foreach (var state in message.StateArray) + { + DeviceMessageSerializerProvider.InfoReadingStateV2Ser.Serializer(writer, state); + } + } + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingsSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingsSerializer.cs new file mode 100644 index 0000000000000000000000000000000000000000..eb53ac0564cdc895dd7c0f0d5bea09b6f0885334 --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoReadingsSerializer.cs @@ -0,0 +1,28 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; +using System.Buffers; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Serializers +{ + public class DeviceMessageInfoReadingsSerializer : AbstractMessageSerializer, IDeviceMessageInfoReadingsSerializer + { + public DeviceMessageInfoReadingsSerializer() : base(new DeviceMessageInfoReadings()) + { + } + + public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfoReadings message) + { + ArgumentNullException.ThrowIfNull(message); + ArgumentNullException.ThrowIfNull(message.ReadingArray); + writer.Write([message.Count]); + if (message.Count > 0) + { + foreach (var reading in message.ReadingArray) + { + DeviceMessageSerializerProvider.InfoReadingV2Ser.Serializer(writer, reading); + } + } + } + } +} diff --git a/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoSerializer.cs b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoSerializer.cs new file mode 100644 index 0000000000000000000000000000000000000000..cf7602b95d44f6fb17744d7a623bd62470ab745a --- /dev/null +++ b/DeviceCommons/DeviceMessages/Serialization/V2/Serializers/DeviceMessageInfoSerializer.cs @@ -0,0 +1,24 @@ +using DeviceCommons.DataHandling; +using DeviceCommons.DeviceMessages.Abstractions; +using DeviceCommons.DeviceMessages.Models.V1; +using System.Buffers; + +namespace DeviceCommons.DeviceMessages.Serialization.V2.Serializers +{ + public class DeviceMessageInfoSerializer : AbstractMessageSerializer, IDeviceMessageInfoSerializer + { + public DeviceMessageInfoSerializer() : base(new DeviceMessageInfo()) + { + } + + public override void Serializer(ArrayBufferWriter writer, IDeviceMessageInfo message) + { + ArgumentNullException.ThrowIfNull(message); + ArgumentNullException.ThrowIfNull(message.Reading); + writer.Write([message.Length]); + writer.Write(message.DIDBytes); + writer.Write([message.DeviceType]); + DeviceMessageSerializerProvider.InfoReadingsV2Ser.Serializer(writer, message.Reading); + } + } +} diff --git a/TestProject1/BaseUnitTest.cs b/TestProject1/BaseUnitTest.cs index e0fa52369a6a4e1e77a9d87f01645f6ccfabfebf..0130b8beb92b25aaafc001a5d8a445d21081036b 100644 --- a/TestProject1/BaseUnitTest.cs +++ b/TestProject1/BaseUnitTest.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Diagnostics; namespace TestProject1 { @@ -13,7 +8,7 @@ namespace TestProject1 { Debug.WriteLine(""); Debug.WriteLine("-----------------------------------------------------------------------"); - Debug.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} =>"); + Debug.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss:fff} =>"); Debug.WriteLine($"{message}"); } } diff --git a/TestProject1/BasicStructureUnitTest.cs b/TestProject1/BasicStructureUnitTest.cs index fb8fd3b202a941a8d88701d5fd8535b26fd3d634..e2b741dd35c9afcd42a4a660deea2677524a865b 100644 --- a/TestProject1/BasicStructureUnitTest.cs +++ b/TestProject1/BasicStructureUnitTest.cs @@ -1,4 +1,5 @@ using DeviceCommons.DeviceMessages.Enums; +using DeviceCommons.DeviceMessages.Models; using DeviceCommons.DeviceMessages.Models.V1; using DeviceCommons.DeviceMessages.Serialization; using DeviceCommons.DeviceMessages.Serialization.V1.Parsers; diff --git a/TestProject1/BoundaryUnitTest.cs b/TestProject1/BoundaryUnitTest.cs index 750d6cd93b483ca940c3b08896965df52d1da150..b45feed8e0c0d314c31d3e53a38b32cd0e69fbc7 100644 --- a/TestProject1/BoundaryUnitTest.cs +++ b/TestProject1/BoundaryUnitTest.cs @@ -1,4 +1,5 @@ using DeviceCommons.DeviceMessages.Enums; +using DeviceCommons.DeviceMessages.Models; using DeviceCommons.DeviceMessages.Models.V1; using DeviceCommons.DeviceMessages.Serialization; using DeviceCommons.DeviceMessages.Serialization.V1.Parsers; diff --git a/TestProject1/BuildUnitTest.cs b/TestProject1/BuildUnitTest.cs index 74614d86ce01f8ead4cb09dec64fe1e566b13232..1fbe691362ffbf4589af9c68f690d12bac008b3e 100644 --- a/TestProject1/BuildUnitTest.cs +++ b/TestProject1/BuildUnitTest.cs @@ -1,5 +1,4 @@ -using BenchmarkDotNet.Attributes; -using DeviceCommons.DeviceMessages.Builders; +using DeviceCommons.DeviceMessages.Builders; using DeviceCommons.DeviceMessages.Enums; using DeviceCommons.DeviceMessages.Serialization; using System.Diagnostics; @@ -34,31 +33,74 @@ namespace TestProject1 [Fact] public void Test3() { - IDeviceMessageBuilder deviceMessage = DeviceMessageBuilder.Create() - .WithHeader(version: 2, crcType: CRCTypeEnum.CRC8) - .WithMainDevice("Device", 148, - config: rs => + Stopwatch sw = Stopwatch.StartNew(); + Random random = new(); + while (true) + { + sw.Restart(); + IDeviceMessageBuilder deviceMessage = DeviceMessageBuilder.Create() + .WithHeader(version: 1, crcType: CRCTypeEnum.CRC16) + .WithMainDevice("Device", 148, + config: rs => + { + rs.AddReading((short)(260 * random.Next(1, 5)), config: r => + { + for (int i = 1; i <= 3; i++) + { + r.AddState((byte)i, $"State{i}", StateValueTypeEnum.String); + } + }); + rs.AddReading((short)(260 * random.Next(6, 10)), config: r => + { + for (int i = 1; i <= 3; i++) + { + r.AddState(9, Encoding.UTF8.GetBytes("Binary"), StateValueTypeEnum.Binary); + } + }); + } + ) + .WithChildDevice("Device1", 149, (rs) => { rs.AddReading(260 * 1, config: r => { - for (int i = 1; i <= 3; i++) - { - r.AddState((byte)i, $"State{i}", StateValueTypeEnum.String); - } + for (int i = 1; i <= 4; i++) r.AddState((byte)i, $"State{i}", StateValueTypeEnum.String); }); rs.AddReading(260 * 2, config: r => { - for (int i = 1; i <= 3; i++) - { - r.AddState(9, Encoding.UTF8.GetBytes("Binary"), StateValueTypeEnum.Binary); - } + for (int i = 1; i <= 4; i++) r.AddState((byte)i, $"State{i}", StateValueTypeEnum.String); }); - } - ); - var model = deviceMessage.Build(); - var builder = deviceMessage.BuildHex().ToUpper(); - LogWrite(builder); - PAR.Parser(builder); + rs.AddReading(260 * 3, config: r => + { + for (int i = 1; i <= 4; i++) r.AddState((byte)i, $"State{i}", StateValueTypeEnum.String); + }); + }) + .WithChildDevice("Device2", 149, (rs) => + { + rs.AddReading(260 * 1, config: r => + { + for (int i = 1; i <= 4; i++) r.AddState((byte)i, $"State{i}", StateValueTypeEnum.String); + }); + rs.AddReading(260 * 2, config: r => + { + for (int i = 1; i <= 4; i++) r.AddState((byte)i, $"State{i}", StateValueTypeEnum.String); + }); + rs.AddReading(260 * 3, config: r => + { + for (int i = 1; i <= 4; i++) r.AddState((byte)i, $"State{i}", StateValueTypeEnum.String); + }); + }); + //var model = deviceMessage.Build(); + + var bytes = deviceMessage.BuildBytes(); + sw.Stop(); + + var builder = deviceMessage.BuildHex().ToUpper(); + + LogWrite(builder); + sw.Restart(); + PAR.Parser(builder); + sw.Stop(); + } } [Fact] diff --git a/TestProject1/ComprehensiveUnitTest.cs b/TestProject1/ComprehensiveUnitTest.cs index f4777766d03ca6649b6ed3199d5a41c9a8d5977c..83eb13dac6665a459c4bfd0e1e103fbc42d8d422 100644 --- a/TestProject1/ComprehensiveUnitTest.cs +++ b/TestProject1/ComprehensiveUnitTest.cs @@ -1,11 +1,9 @@ using DeviceCommons.DeviceMessages.Builders; using DeviceCommons.DeviceMessages.Enums; -using DeviceCommons.DeviceMessages.Models.V1; using DeviceCommons.DeviceMessages.Serialization; using DeviceCommons.Exceptions; using System.Buffers; using System.Text; -using Xunit; using Xunit.Abstractions; namespace DeviceCommons.Tests @@ -131,15 +129,20 @@ namespace DeviceCommons.Tests // Act var arrayBufferWriter = new ArrayBufferWriter(); - _serializer.Serializer(arrayBufferWriter, message); - var bytes = arrayBufferWriter.WrittenSpan.ToArray(); - var parsedMessage = _parser.Parser(bytes); + Assert.Throws(() => + { + _serializer.Serializer(arrayBufferWriter, message); - // Assert - Assert.NotNull(parsedMessage); - Assert.Equal(string.Empty, parsedMessage.MainDevice.DID); - Assert.Equal(0, parsedMessage.MainDevice.DeviceType); + var bytes = arrayBufferWriter.WrittenSpan.ToArray(); + + var parsedMessage = _parser.Parser(bytes); + + // Assert + Assert.NotNull(parsedMessage); + Assert.Equal(string.Empty, parsedMessage.MainDevice.DID); + Assert.Equal(0, parsedMessage.MainDevice.DeviceType); + }); } [Fact] @@ -183,9 +186,9 @@ namespace DeviceCommons.Tests Assert.NotNull(parsedMessage); Assert.NotNull(parsedMessage.ChildDevice); Assert.Equal(3, parsedMessage.ChildDevice.Count); - Assert.Equal("Child1", parsedMessage.ChildDevice.ChildArray[2].DID); + Assert.Equal("Child1", parsedMessage.ChildDevice.ChildArray[0].DID); Assert.Equal("Child2", parsedMessage.ChildDevice.ChildArray[1].DID); - Assert.Equal("Child3", parsedMessage.ChildDevice.ChildArray[0].DID); + Assert.Equal("Child3", parsedMessage.ChildDevice.ChildArray[2].DID); } [Fact]