diff --git a/Source/MQTTnet.AspnetCore/Client/MqttClientConnectionContextFactory.cs b/Source/MQTTnet.AspnetCore/Client/MqttClientConnectionContextFactory.cs index 93253857..b5801f46 100644 --- a/Source/MQTTnet.AspnetCore/Client/MqttClientConnectionContextFactory.cs +++ b/Source/MQTTnet.AspnetCore/Client/MqttClientConnectionContextFactory.cs @@ -4,7 +4,7 @@ using MQTTnet.Adapter; using MQTTnet.AspNetCore.Client.Tcp; using MQTTnet.Client; using MQTTnet.Diagnostics; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.AspNetCore.Client { diff --git a/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs b/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs index 1b54ef55..aa2d7d8c 100644 --- a/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs +++ b/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs @@ -3,11 +3,11 @@ using MQTTnet.Adapter; using MQTTnet.AspNetCore.Client.Tcp; using MQTTnet.Exceptions; using MQTTnet.Packets; -using MQTTnet.Serializer; using System; using System.IO.Pipelines; using System.Threading; using System.Threading.Tasks; +using MQTTnet.Formatter; namespace MQTTnet.AspNetCore { @@ -72,7 +72,7 @@ namespace MQTTnet.AspNetCore { if (!buffer.IsEmpty) { - if (PacketSerializerAdapter.Serializer.TryDeserialize(buffer, out var packet, out consumed, out observed)) + if (PacketSerializerAdapter.Formatter.TryDeserialize(buffer, out var packet, out consumed, out observed)) { return packet; } @@ -107,7 +107,7 @@ namespace MQTTnet.AspNetCore public async Task SendPacketAsync(MqttBasePacket packet, CancellationToken cancellationToken) { - var buffer = PacketSerializerAdapter.Serialize(packet).AsMemory(); + var buffer = PacketSerializerAdapter.Encode(packet).AsMemory(); var output = Connection.Transport.Output; await _writerSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); diff --git a/Source/MQTTnet.AspnetCore/MqttConnectionHandler.cs b/Source/MQTTnet.AspnetCore/MqttConnectionHandler.cs index 77a8734b..f533ed7c 100644 --- a/Source/MQTTnet.AspnetCore/MqttConnectionHandler.cs +++ b/Source/MQTTnet.AspnetCore/MqttConnectionHandler.cs @@ -1,10 +1,10 @@ using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Connections.Features; using MQTTnet.Adapter; -using MQTTnet.Serializer; using MQTTnet.Server; using System; using System.Threading.Tasks; +using MQTTnet.Formatter; namespace MQTTnet.AspNetCore { diff --git a/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs b/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs index 4dc75a44..ee310222 100644 --- a/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs +++ b/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs @@ -3,8 +3,8 @@ using System.Net.WebSockets; using System.Threading.Tasks; using MQTTnet.Adapter; using MQTTnet.Diagnostics; +using MQTTnet.Formatter; using MQTTnet.Implementations; -using MQTTnet.Serializer; using MQTTnet.Server; namespace MQTTnet.AspNetCore diff --git a/Source/MQTTnet.AspnetCore/ReaderExtensions.cs b/Source/MQTTnet.AspnetCore/ReaderExtensions.cs index 6c770b9e..d7c192b9 100644 --- a/Source/MQTTnet.AspnetCore/ReaderExtensions.cs +++ b/Source/MQTTnet.AspnetCore/ReaderExtensions.cs @@ -2,15 +2,17 @@ using System.Buffers; using MQTTnet.Adapter; using MQTTnet.Exceptions; +using MQTTnet.Formatter; using MQTTnet.Packets; -using MQTTnet.Serializer; namespace MQTTnet.AspNetCore { public static class ReaderExtensions { - public static bool TryDeserialize(this IMqttPacketSerializer serializer, in ReadOnlySequence input, out MqttBasePacket packet, out SequencePosition consumed, out SequencePosition observed) + public static bool TryDeserialize(this IMqttPacketFormatter formatter, in ReadOnlySequence input, out MqttBasePacket packet, out SequencePosition consumed, out SequencePosition observed) { + if (formatter == null) throw new ArgumentNullException(nameof(formatter)); + packet = null; consumed = input.Start; observed = input.End; @@ -33,7 +35,7 @@ namespace MQTTnet.AspNetCore var bodySlice = copy.Slice(0, bodyLength); var buffer = bodySlice.GetArray(); - packet = serializer.Deserialize(new ReceivedMqttPacket(fixedheader, new MqttPacketBodyReader(buffer, 0, buffer.Length))); + packet = formatter.Decode(new ReceivedMqttPacket(fixedheader, new MqttPacketBodyReader(buffer, 0, buffer.Length))); consumed = bodySlice.End; observed = bodySlice.End; return true; diff --git a/Source/MQTTnet/Adapter/IMqttChannelAdapter.cs b/Source/MQTTnet/Adapter/IMqttChannelAdapter.cs index 9aa5cacc..82003204 100644 --- a/Source/MQTTnet/Adapter/IMqttChannelAdapter.cs +++ b/Source/MQTTnet/Adapter/IMqttChannelAdapter.cs @@ -1,8 +1,8 @@ using System; using System.Threading; using System.Threading.Tasks; +using MQTTnet.Formatter; using MQTTnet.Packets; -using MQTTnet.Serializer; namespace MQTTnet.Adapter { diff --git a/Source/MQTTnet/Adapter/MqttChannelAdapter.cs b/Source/MQTTnet/Adapter/MqttChannelAdapter.cs index dc95152f..463b898a 100644 --- a/Source/MQTTnet/Adapter/MqttChannelAdapter.cs +++ b/Source/MQTTnet/Adapter/MqttChannelAdapter.cs @@ -7,9 +7,9 @@ using System.Threading.Tasks; using MQTTnet.Channel; using MQTTnet.Diagnostics; using MQTTnet.Exceptions; +using MQTTnet.Formatter; using MQTTnet.Internal; using MQTTnet.Packets; -using MQTTnet.Serializer; namespace MQTTnet.Adapter { @@ -96,7 +96,7 @@ namespace MQTTnet.Adapter await _writerSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try { - var packetData = PacketSerializerAdapter.Serialize(packet); + var packetData = PacketSerializerAdapter.Encode(packet); await _channel.WriteAsync(packetData.Array, packetData.Offset, packetData.Count, cancellationToken).ConfigureAwait(false); PacketSerializerAdapter.FreeBuffer(); @@ -144,7 +144,7 @@ namespace MQTTnet.Adapter PacketSerializerAdapter.DetectProtocolVersion(receivedMqttPacket); } - var packet = PacketSerializerAdapter.Deserialize(receivedMqttPacket); + var packet = PacketSerializerAdapter.Decode(receivedMqttPacket); if (packet == null) { throw new MqttProtocolViolationException("Received malformed packet."); diff --git a/Source/MQTTnet/Adapter/ReceivedMqttPacket.cs b/Source/MQTTnet/Adapter/ReceivedMqttPacket.cs index 3a92d4de..007b9eb6 100644 --- a/Source/MQTTnet/Adapter/ReceivedMqttPacket.cs +++ b/Source/MQTTnet/Adapter/ReceivedMqttPacket.cs @@ -1,4 +1,4 @@ -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Adapter { diff --git a/Source/MQTTnet/Client/IMqttClientOptions.cs b/Source/MQTTnet/Client/IMqttClientOptions.cs index 176f5e43..8825a64e 100644 --- a/Source/MQTTnet/Client/IMqttClientOptions.cs +++ b/Source/MQTTnet/Client/IMqttClientOptions.cs @@ -1,5 +1,5 @@ using System; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Client { diff --git a/Source/MQTTnet/Client/MqttClientOptions.cs b/Source/MQTTnet/Client/MqttClientOptions.cs index 7d3ad5d8..1e5182cb 100644 --- a/Source/MQTTnet/Client/MqttClientOptions.cs +++ b/Source/MQTTnet/Client/MqttClientOptions.cs @@ -1,5 +1,5 @@ using System; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Client { diff --git a/Source/MQTTnet/Client/MqttClientOptionsBuilder.cs b/Source/MQTTnet/Client/MqttClientOptionsBuilder.cs index 85e2b4d8..34ecb941 100644 --- a/Source/MQTTnet/Client/MqttClientOptionsBuilder.cs +++ b/Source/MQTTnet/Client/MqttClientOptionsBuilder.cs @@ -1,6 +1,6 @@ using System; using System.Linq; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Client { diff --git a/Source/MQTTnet/Formatter/IMqttPacketFormatter.cs b/Source/MQTTnet/Formatter/IMqttPacketFormatter.cs new file mode 100644 index 00000000..b4a26b84 --- /dev/null +++ b/Source/MQTTnet/Formatter/IMqttPacketFormatter.cs @@ -0,0 +1,15 @@ +using System; +using MQTTnet.Adapter; +using MQTTnet.Packets; + +namespace MQTTnet.Formatter +{ + public interface IMqttPacketFormatter + { + ArraySegment Encode(MqttBasePacket mqttPacket); + + MqttBasePacket Decode(ReceivedMqttPacket receivedMqttPacket); + + void FreeBuffer(); + } +} \ No newline at end of file diff --git a/Source/MQTTnet/Serializer/MqttFixedHeader.cs b/Source/MQTTnet/Formatter/MqttFixedHeader.cs similarity index 90% rename from Source/MQTTnet/Serializer/MqttFixedHeader.cs rename to Source/MQTTnet/Formatter/MqttFixedHeader.cs index a8c2015b..c9cd3ce1 100644 --- a/Source/MQTTnet/Serializer/MqttFixedHeader.cs +++ b/Source/MQTTnet/Formatter/MqttFixedHeader.cs @@ -1,4 +1,4 @@ -namespace MQTTnet.Serializer +namespace MQTTnet.Formatter { public struct MqttFixedHeader { diff --git a/Source/MQTTnet/Serializer/MqttPacketBodyReader.cs b/Source/MQTTnet/Formatter/MqttPacketBodyReader.cs similarity index 98% rename from Source/MQTTnet/Serializer/MqttPacketBodyReader.cs rename to Source/MQTTnet/Formatter/MqttPacketBodyReader.cs index ad3d789b..3e477475 100644 --- a/Source/MQTTnet/Serializer/MqttPacketBodyReader.cs +++ b/Source/MQTTnet/Formatter/MqttPacketBodyReader.cs @@ -1,7 +1,7 @@ using System; using System.Text; -namespace MQTTnet.Serializer +namespace MQTTnet.Formatter { public class MqttPacketBodyReader { diff --git a/Source/MQTTnet/Serializer/MqttPacketReader.cs b/Source/MQTTnet/Formatter/MqttPacketReader.cs similarity index 99% rename from Source/MQTTnet/Serializer/MqttPacketReader.cs rename to Source/MQTTnet/Formatter/MqttPacketReader.cs index f115b507..4a12efc5 100644 --- a/Source/MQTTnet/Serializer/MqttPacketReader.cs +++ b/Source/MQTTnet/Formatter/MqttPacketReader.cs @@ -4,7 +4,7 @@ using MQTTnet.Channel; using MQTTnet.Exceptions; using MQTTnet.Internal; -namespace MQTTnet.Serializer +namespace MQTTnet.Formatter { public static class MqttPacketReader { diff --git a/Source/MQTTnet/Serializer/MqttPacketSerializerAdapter.cs b/Source/MQTTnet/Formatter/MqttPacketSerializerAdapter.cs similarity index 81% rename from Source/MQTTnet/Serializer/MqttPacketSerializerAdapter.cs rename to Source/MQTTnet/Formatter/MqttPacketSerializerAdapter.cs index 4a4a164a..82bfa99c 100644 --- a/Source/MQTTnet/Serializer/MqttPacketSerializerAdapter.cs +++ b/Source/MQTTnet/Formatter/MqttPacketSerializerAdapter.cs @@ -1,9 +1,12 @@ using System; using MQTTnet.Adapter; using MQTTnet.Exceptions; +using MQTTnet.Formatter.V310; +using MQTTnet.Formatter.V311; +using MQTTnet.Formatter.V500; using MQTTnet.Packets; -namespace MQTTnet.Serializer +namespace MQTTnet.Formatter { public class MqttPacketSerializerAdapter { @@ -18,31 +21,31 @@ namespace MQTTnet.Serializer public MqttProtocolVersion? ProtocolVersion { get; private set; } - public IMqttPacketSerializer Serializer { get; private set; } + public IMqttPacketFormatter Formatter { get; private set; } - public ArraySegment Serialize(MqttBasePacket packet) + public ArraySegment Encode(MqttBasePacket packet) { - if (Serializer == null) + if (Formatter == null) { throw new InvalidOperationException("Protocol version not set or detected."); } - return Serializer.Serialize(packet); + return Formatter.Encode(packet); } - public MqttBasePacket Deserialize(ReceivedMqttPacket receivedMqttPacket) + public MqttBasePacket Decode(ReceivedMqttPacket receivedMqttPacket) { - if (Serializer == null) + if (Formatter == null) { throw new InvalidOperationException("Protocol version not set or detected."); } - return Serializer.Deserialize(receivedMqttPacket); + return Formatter.Decode(receivedMqttPacket); } public void FreeBuffer() { - Serializer?.FreeBuffer(); + Formatter?.FreeBuffer(); } public void DetectProtocolVersion(ReceivedMqttPacket receivedMqttPacket) @@ -65,20 +68,20 @@ namespace MQTTnet.Serializer { case MqttProtocolVersion.V500: { - Serializer = new MqttV500PacketSerializer(); + Formatter = new MqttV500PacketFormatter(); break; } case MqttProtocolVersion.V311: { - Serializer = new MqttV311PacketSerializer(); + Formatter = new MqttV311PacketFormatter(); break; } case MqttProtocolVersion.V310: { - Serializer = new MqttV310PacketSerializer(); + Formatter = new MqttV310PacketFormatter(); break; } diff --git a/Source/MQTTnet/Serializer/MqttPacketWriter.cs b/Source/MQTTnet/Formatter/MqttPacketWriter.cs similarity index 99% rename from Source/MQTTnet/Serializer/MqttPacketWriter.cs rename to Source/MQTTnet/Formatter/MqttPacketWriter.cs index 3df5d964..9fb8ed43 100644 --- a/Source/MQTTnet/Serializer/MqttPacketWriter.cs +++ b/Source/MQTTnet/Formatter/MqttPacketWriter.cs @@ -3,7 +3,7 @@ using System.Runtime.CompilerServices; using System.Text; using MQTTnet.Protocol; -namespace MQTTnet.Serializer +namespace MQTTnet.Formatter { /// /// This is a custom implementation of a memory stream which provides only MQTTnet relevant features. diff --git a/Source/MQTTnet/Serializer/MqttProtocolVersion.cs b/Source/MQTTnet/Formatter/MqttProtocolVersion.cs similarity index 76% rename from Source/MQTTnet/Serializer/MqttProtocolVersion.cs rename to Source/MQTTnet/Formatter/MqttProtocolVersion.cs index 576f7df7..c5e05e5e 100644 --- a/Source/MQTTnet/Serializer/MqttProtocolVersion.cs +++ b/Source/MQTTnet/Formatter/MqttProtocolVersion.cs @@ -1,4 +1,4 @@ -namespace MQTTnet.Serializer +namespace MQTTnet.Formatter { public enum MqttProtocolVersion { diff --git a/Source/MQTTnet/Serializer/MqttV310PacketSerializer.cs b/Source/MQTTnet/Formatter/V310/MqttV310PacketFormatter.cs similarity index 97% rename from Source/MQTTnet/Serializer/MqttV310PacketSerializer.cs rename to Source/MQTTnet/Formatter/V310/MqttV310PacketFormatter.cs index 74c96a90..338b506d 100644 --- a/Source/MQTTnet/Serializer/MqttV310PacketSerializer.cs +++ b/Source/MQTTnet/Formatter/V310/MqttV310PacketFormatter.cs @@ -1,19 +1,20 @@ -using MQTTnet.Exceptions; -using MQTTnet.Packets; -using MQTTnet.Protocol; -using System; +using System; using System.Linq; using MQTTnet.Adapter; +using MQTTnet.Exceptions; +using MQTTnet.Internal; +using MQTTnet.Packets; +using MQTTnet.Protocol; -namespace MQTTnet.Serializer +namespace MQTTnet.Formatter.V310 { - public class MqttV310PacketSerializer : IMqttPacketSerializer + public class MqttV310PacketFormatter : IMqttPacketFormatter { private const int FixedHeaderSize = 1; private readonly MqttPacketWriter _packetWriter = new MqttPacketWriter(); - public ArraySegment Serialize(MqttBasePacket packet) + public ArraySegment Encode(MqttBasePacket packet) { if (packet == null) throw new ArgumentNullException(nameof(packet)); @@ -38,7 +39,7 @@ namespace MQTTnet.Serializer return new ArraySegment(buffer, headerOffset, _packetWriter.Length - headerOffset); } - public MqttBasePacket Deserialize(ReceivedMqttPacket receivedMqttPacket) + public MqttBasePacket Decode(ReceivedMqttPacket receivedMqttPacket) { if (receivedMqttPacket == null) throw new ArgumentNullException(nameof(receivedMqttPacket)); @@ -300,11 +301,6 @@ namespace MQTTnet.Serializer { throw new MqttProtocolViolationException("CleanSession must be set if ClientId is empty [MQTT-3.1.3-7]."); } - - if (packet.Properties != null) - { - throw new MqttProtocolViolationException("Properties are only supported in MQTT Version 5."); - } } // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local diff --git a/Source/MQTTnet/Serializer/MqttV311PacketSerializer.cs b/Source/MQTTnet/Formatter/V311/MqttV311PacketFormatter.cs similarity index 95% rename from Source/MQTTnet/Serializer/MqttV311PacketSerializer.cs rename to Source/MQTTnet/Formatter/V311/MqttV311PacketFormatter.cs index c70629e5..a02b9b37 100644 --- a/Source/MQTTnet/Serializer/MqttV311PacketSerializer.cs +++ b/Source/MQTTnet/Formatter/V311/MqttV311PacketFormatter.cs @@ -1,10 +1,11 @@ using MQTTnet.Exceptions; +using MQTTnet.Formatter.V310; using MQTTnet.Packets; using MQTTnet.Protocol; -namespace MQTTnet.Serializer +namespace MQTTnet.Formatter.V311 { - public class MqttV311PacketSerializer : MqttV310PacketSerializer + public class MqttV311PacketFormatter : MqttV310PacketFormatter { protected override byte SerializeConnectPacket(MqttConnectPacket packet, MqttPacketWriter packetWriter) { diff --git a/Source/MQTTnet/Formatter/V500/MqttV500PacketDecoder.cs b/Source/MQTTnet/Formatter/V500/MqttV500PacketDecoder.cs new file mode 100644 index 00000000..f98ab7f6 --- /dev/null +++ b/Source/MQTTnet/Formatter/V500/MqttV500PacketDecoder.cs @@ -0,0 +1,6 @@ +namespace MQTTnet.Formatter.V500 +{ + public class MqttV500PacketDecoder + { + } +} diff --git a/Source/MQTTnet/Formatter/V500/MqttV500PacketEncoder.cs b/Source/MQTTnet/Formatter/V500/MqttV500PacketEncoder.cs new file mode 100644 index 00000000..f697d89f --- /dev/null +++ b/Source/MQTTnet/Formatter/V500/MqttV500PacketEncoder.cs @@ -0,0 +1,6 @@ +namespace MQTTnet.Formatter.V500 +{ + public class MqttV500PacketEncoder + { + } +} diff --git a/Source/MQTTnet/Formatter/V500/MqttV500PacketFormatter.cs b/Source/MQTTnet/Formatter/V500/MqttV500PacketFormatter.cs new file mode 100644 index 00000000..08b8491b --- /dev/null +++ b/Source/MQTTnet/Formatter/V500/MqttV500PacketFormatter.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using MQTTnet.Exceptions; +using MQTTnet.Formatter.V311; +using MQTTnet.Packets; +using MQTTnet.Packets.Properties; +using MQTTnet.Protocol; + +namespace MQTTnet.Formatter.V500 +{ + public class MqttV500PacketFormatter : MqttV311PacketFormatter + { + private readonly MqttV500PacketEncoder _encoder = new MqttV500PacketEncoder(); + private readonly MqttV500PacketDecoder _decoder = new MqttV500PacketDecoder(); + + protected override byte SerializeConnectPacket(MqttConnectPacket packet, MqttPacketWriter packetWriter) + { + ValidateConnectPacket(packet); + + packetWriter.WriteWithLengthPrefix("MQTT"); + packetWriter.Write(5); // [3.1.2.2 Protocol Version] + + byte connectFlags = 0x0; + if (packet.CleanSession) + { + connectFlags |= 0x2; + } + + if (packet.WillMessage != null) + { + connectFlags |= 0x4; + connectFlags |= (byte)((byte)packet.WillMessage.QualityOfServiceLevel << 3); + + if (packet.WillMessage.Retain) + { + connectFlags |= 0x20; + } + } + + if (packet.Password != null && packet.Username == null) + { + throw new MqttProtocolViolationException("If the User Name Flag is set to 0, the Password Flag MUST be set to 0 [MQTT-3.1.2-22]."); + } + + if (packet.Password != null) + { + connectFlags |= 0x40; + } + + if (packet.Username != null) + { + connectFlags |= 0x80; + } + + packetWriter.Write(connectFlags); + packetWriter.Write(packet.KeepAlivePeriod); + packetWriter.WriteWithLengthPrefix(packet.ClientId); + + if (packet.WillMessage != null) + { + packetWriter.WriteWithLengthPrefix(packet.WillMessage.Topic); + packetWriter.WriteWithLengthPrefix(packet.WillMessage.Payload); + } + + if (packet.Username != null) + { + packetWriter.WriteWithLengthPrefix(packet.Username); + } + + if (packet.Password != null) + { + packetWriter.WriteWithLengthPrefix(packet.Password); + } + + WriteProperty(MqttMessagePropertyID.WillDelayInterval, packet.WillDelayIntervalProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.SessionExpiryInterval, packet.SessionExpiryIntervalProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.AuthenticationMethod, packet.AuthenticationMethodProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.AuthenticationData, packet.AuthenticationDataProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.RequestProblemInformation, packet.RequestProblemInformationProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.RequestResponseInformation, packet.RequestResponseInformationProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.ReceiveMaximum, packet.ReceiveMaximumProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.TopicAlias, packet.TopicAliasMaximumProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.MaximumPacketSize, packet.MaximumPacketSizeProperty, packetWriter); + WriteUserProperties(packet.UserPropertiesProperty, packetWriter); + + return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Connect); + } + + protected override byte SerializeConnAckPacket(MqttConnAckPacket packet, MqttPacketWriter packetWriter) + { + byte connectAcknowledgeFlags = 0x0; + if (packet.IsSessionPresent) + { + connectAcknowledgeFlags |= 0x1; + } + + packetWriter.Write(connectAcknowledgeFlags); + packetWriter.Write((byte)packet.ConnectReturnCode); + + WriteProperty(MqttMessagePropertyID.SessionExpiryInterval, packet.SessionExpiryIntervalProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.AuthenticationMethod, packet.AuthenticationMethodProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.AuthenticationData, packet.AuthenticationDataProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.ReceiveMaximum, packet.ReceiveMaximumProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.TopicAlias, packet.TopicAliasMaximumProperty, packetWriter); + WriteProperty(MqttMessagePropertyID.MaximumPacketSize, packet.MaximumPacketSizeProperty, packetWriter); + WriteUserProperties(packet.UserPropertiesProperty, packetWriter); + + return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck); + } + + private static void WriteProperty(MqttMessagePropertyID id, bool? value, MqttPacketWriter target) + { + if (!value.HasValue) + { + return; + } + + target.Write((byte)id); + target.Write(value.Value ? (byte)0x1 : (byte)0x0); + } + + private static void WriteProperty(MqttMessagePropertyID id, ushort? value, MqttPacketWriter target) + { + if (!value.HasValue) + { + return; + } + + target.Write((byte)id); + target.Write(value.Value); + } + + private static void WriteProperty(MqttMessagePropertyID id, uint? value, MqttPacketWriter target) + { + if (!value.HasValue) + { + return; + } + + // TODO: Check if order must be reversed like for ushort. + target.Write((byte)id); + var bytes = BitConverter.GetBytes(value.Value); + target.Write(bytes, 0, bytes.Length); + } + + private static void WriteProperty(MqttMessagePropertyID id, string value, MqttPacketWriter target) + { + if (value == null) + { + return; + } + + target.Write((byte)id); + target.WriteWithLengthPrefix(value); + } + + private static void WriteProperty(MqttMessagePropertyID id, byte[] value, MqttPacketWriter target) + { + if (value == null) + { + return; + } + + target.Write((byte)id); + target.WriteWithLengthPrefix(value); + } + + private static void WriteUserProperties(List userProperties, MqttPacketWriter target) + { + if (userProperties == null || userProperties.Count == 0) + { + return; + } + + var propertyWriter = new MqttPacketWriter(); + foreach (var property in userProperties) + { + propertyWriter.WriteWithLengthPrefix(property.Name); + propertyWriter.WriteWithLengthPrefix(property.Value); + } + + target.Write((byte)MqttMessagePropertyID.UserProperty); + target.WriteVariableLengthInteger((uint)propertyWriter.Length); + target.Write(propertyWriter); + } + } +} diff --git a/Source/MQTTnet/Implementations/MqttClientAdapterFactory.cs b/Source/MQTTnet/Implementations/MqttClientAdapterFactory.cs index 169d18e2..9bf40964 100644 --- a/Source/MQTTnet/Implementations/MqttClientAdapterFactory.cs +++ b/Source/MQTTnet/Implementations/MqttClientAdapterFactory.cs @@ -2,7 +2,7 @@ using MQTTnet.Adapter; using MQTTnet.Client; using MQTTnet.Diagnostics; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Implementations { diff --git a/Source/MQTTnet/Implementations/MqttTcpServerAdapter.Uwp.cs b/Source/MQTTnet/Implementations/MqttTcpServerAdapter.Uwp.cs index d494b910..ec226b22 100644 --- a/Source/MQTTnet/Implementations/MqttTcpServerAdapter.Uwp.cs +++ b/Source/MQTTnet/Implementations/MqttTcpServerAdapter.Uwp.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using Windows.Networking.Sockets; using MQTTnet.Adapter; using MQTTnet.Diagnostics; -using MQTTnet.Serializer; +using MQTTnet.Formatter; using MQTTnet.Server; namespace MQTTnet.Implementations diff --git a/Source/MQTTnet/Implementations/MqttTcpServerListener.cs b/Source/MQTTnet/Implementations/MqttTcpServerListener.cs index 59da016a..8c6258e0 100644 --- a/Source/MQTTnet/Implementations/MqttTcpServerListener.cs +++ b/Source/MQTTnet/Implementations/MqttTcpServerListener.cs @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using MQTTnet.Adapter; using MQTTnet.Diagnostics; -using MQTTnet.Serializer; +using MQTTnet.Formatter; using MQTTnet.Server; namespace MQTTnet.Implementations diff --git a/Source/MQTTnet/Serializer/Extensions.cs b/Source/MQTTnet/Internal/ArraySegmentExtensions.cs similarity index 85% rename from Source/MQTTnet/Serializer/Extensions.cs rename to Source/MQTTnet/Internal/ArraySegmentExtensions.cs index 00ad7cfb..f0054f47 100644 --- a/Source/MQTTnet/Serializer/Extensions.cs +++ b/Source/MQTTnet/Internal/ArraySegmentExtensions.cs @@ -1,8 +1,8 @@ using System; -namespace MQTTnet.Serializer +namespace MQTTnet.Internal { - public static class Extensions + public static class ArraySegmentExtensions { public static byte[] ToArray(this ArraySegment source) { diff --git a/Source/MQTTnet/MQTTnet.csproj b/Source/MQTTnet/MQTTnet.csproj index 68099169..8b4038d0 100644 --- a/Source/MQTTnet/MQTTnet.csproj +++ b/Source/MQTTnet/MQTTnet.csproj @@ -69,4 +69,10 @@ + + + C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.1.0\ref\netcoreapp2.1\System.Net.Requests.dll + + + \ No newline at end of file diff --git a/Source/MQTTnet/Packets/MqttAuthPacket.cs b/Source/MQTTnet/Packets/MqttAuthPacket.cs new file mode 100644 index 00000000..aa8e9a60 --- /dev/null +++ b/Source/MQTTnet/Packets/MqttAuthPacket.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using MQTTnet.Packets.Properties; +using MQTTnet.Protocol; + +namespace MQTTnet.Packets +{ + /// + /// Added in MQTTv5.0.0. + /// + public class MqttAuthPacket : MqttBasePacket + { + public MqttAuthenticateReasonCode ReasonCode { get; set; } + + public List Properties { get; set; } + } +} diff --git a/Source/MQTTnet/Packets/MqttBasePublishPacket.cs b/Source/MQTTnet/Packets/MqttBasePublishPacket.cs index ffafc537..67e68879 100644 --- a/Source/MQTTnet/Packets/MqttBasePublishPacket.cs +++ b/Source/MQTTnet/Packets/MqttBasePublishPacket.cs @@ -1,7 +1,15 @@ -namespace MQTTnet.Packets +using System.Collections.Generic; +using MQTTnet.Packets.Properties; + +namespace MQTTnet.Packets { public class MqttBasePublishPacket : MqttBasePacket, IMqttPacketWithIdentifier { public ushort? PacketIdentifier { get; set; } + + /// + /// Added in MQTTv5.0.0. + /// + public List Properties { get; set; } } } diff --git a/Source/MQTTnet/Packets/MqttConnAckPacket.cs b/Source/MQTTnet/Packets/MqttConnAckPacket.cs index c4532167..d79b44af 100644 --- a/Source/MQTTnet/Packets/MqttConnAckPacket.cs +++ b/Source/MQTTnet/Packets/MqttConnAckPacket.cs @@ -1,15 +1,53 @@ -using MQTTnet.Protocol; +using System.Collections.Generic; +using MQTTnet.Protocol; namespace MQTTnet.Packets { public class MqttConnAckPacket : MqttBasePacket { + public MqttConnectReturnCode ConnectReturnCode { get; set; } + /// /// Added in MQTTv3.1.1. /// public bool IsSessionPresent { get; set; } - public MqttConnectReturnCode ConnectReturnCode { get; set; } + #region Added in MQTTv5 + + public uint? SessionExpiryIntervalProperty { get; set; } + + // TODO: Add enum + public byte? ReceiveMaximumProperty { get; set; } + + public bool? RetainAvailableProperty { get; set; } + + public uint? MaximumPacketSizeProperty { get; set; } + + public string AssignedClientIdentifierProperty { get; set; } + + public ushort? TopicAliasMaximumProperty { get; set; } + + public string ReasonStringProperty { get; set; } + + public List UserPropertiesProperty { get; set; } + + public bool? WildcardSubscriptionAvailableProperty { get; set; } + + public bool? SubscriptionIdentifiersAvailableProperty { get; set; } + + public bool? SharedSubscriptionAvailableProperty { get; set; } + + public ushort? ServerKeepAliveProperty { get; set; } + + public string ResponseInformationProperty { get; set; } + + public string ServerReferenceProperty { get; set; } + + public string AuthenticationMethodProperty { get; set; } + + public byte[] AuthenticationDataProperty { get; set; } + + #endregion public override string ToString() { diff --git a/Source/MQTTnet/Packets/MqttConnectPacket.cs b/Source/MQTTnet/Packets/MqttConnectPacket.cs index ec1b953a..0708123b 100644 --- a/Source/MQTTnet/Packets/MqttConnectPacket.cs +++ b/Source/MQTTnet/Packets/MqttConnectPacket.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using MQTTnet.Packets.Properties; namespace MQTTnet.Packets { @@ -24,7 +23,29 @@ namespace MQTTnet.Packets public MqttApplicationMessage WillMessage { get; set; } - public List Properties { get; set; } + #region Added in MQTTv5 + + public uint? WillDelayIntervalProperty { get; set; } + + public uint? SessionExpiryIntervalProperty { get; set; } + + public string AuthenticationMethodProperty { get; set; } + + public byte[] AuthenticationDataProperty { get; set; } + + public bool? RequestProblemInformationProperty { get; set; } + + public bool? RequestResponseInformationProperty { get; set; } + + public ushort? ReceiveMaximumProperty { get; set; } + + public ushort? TopicAliasMaximumProperty { get; set; } + + public uint? MaximumPacketSizeProperty { get; set; } + + public List UserPropertiesProperty { get; set; } + + #endregion public override string ToString() { diff --git a/Source/MQTTnet/Packets/MqttDisconnectPacket.cs b/Source/MQTTnet/Packets/MqttDisconnectPacket.cs index 621829a2..5dbbd497 100644 --- a/Source/MQTTnet/Packets/MqttDisconnectPacket.cs +++ b/Source/MQTTnet/Packets/MqttDisconnectPacket.cs @@ -1,7 +1,15 @@ -namespace MQTTnet.Packets +using System.Collections.Generic; +using MQTTnet.Packets.Properties; + +namespace MQTTnet.Packets { public class MqttDisconnectPacket : MqttBasePacket { + /// + /// Added in MQTTv5.0.0. + /// + public List Properties { get; set; } + public override string ToString() { return "Disconnect"; diff --git a/Source/MQTTnet/Packets/MqttPublishPacket.cs b/Source/MQTTnet/Packets/MqttPublishPacket.cs index 55144a9e..374f913b 100644 --- a/Source/MQTTnet/Packets/MqttPublishPacket.cs +++ b/Source/MQTTnet/Packets/MqttPublishPacket.cs @@ -1,4 +1,6 @@ -using MQTTnet.Protocol; +using System.Collections.Generic; +using MQTTnet.Packets.Properties; +using MQTTnet.Protocol; namespace MQTTnet.Packets { @@ -14,6 +16,11 @@ namespace MQTTnet.Packets public byte[] Payload { get; set; } + /// + /// Added in MQTTv5.0.0. + /// + public List Properties { get; set; } + public override string ToString() { return "Publish: [Topic=" + Topic + "]" + diff --git a/Source/MQTTnet/Packets/MqttSubscribePacket.cs b/Source/MQTTnet/Packets/MqttSubscribePacket.cs index 60086c47..89a1efe6 100644 --- a/Source/MQTTnet/Packets/MqttSubscribePacket.cs +++ b/Source/MQTTnet/Packets/MqttSubscribePacket.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using MQTTnet.Packets.Properties; namespace MQTTnet.Packets { @@ -9,6 +10,11 @@ namespace MQTTnet.Packets public IList TopicFilters { get; set; } = new List(); + /// + /// Added in MQTTv5.0.0. + /// + public List Properties { get; set; } + public override string ToString() { var topicFiltersText = string.Join(",", TopicFilters.Select(f => f.Topic + "@" + f.QualityOfServiceLevel)); diff --git a/Source/MQTTnet/Packets/MqttUserProperty.cs b/Source/MQTTnet/Packets/MqttUserProperty.cs new file mode 100644 index 00000000..eaf9eae3 --- /dev/null +++ b/Source/MQTTnet/Packets/MqttUserProperty.cs @@ -0,0 +1,17 @@ +using System; + +namespace MQTTnet.Packets +{ + public class MqttUserProperty + { + public MqttUserProperty(string name, string value) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + Value = value ?? throw new ArgumentNullException(nameof(value)); + } + + public string Name { get; } + + public string Value { get; } + } +} diff --git a/Source/MQTTnet/Packets/Properties/AssignedClientIdentifierProperty.cs b/Source/MQTTnet/Packets/Properties/AssignedClientIdentifierProperty.cs index b7fd3cd7..bda8e20e 100644 --- a/Source/MQTTnet/Packets/Properties/AssignedClientIdentifierProperty.cs +++ b/Source/MQTTnet/Packets/Properties/AssignedClientIdentifierProperty.cs @@ -1,9 +1,11 @@ -namespace MQTTnet.Packets.Properties +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties { public class AssignedClientIdentifierProperty : StringProperty { public AssignedClientIdentifierProperty(string value) - : base((byte)PropertyID.AssignedClientIdentifer, value) + : base((byte)MqttMessagePropertyID.AssignedClientIdentifer, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/AuthenticationDataProperty.cs b/Source/MQTTnet/Packets/Properties/AuthenticationDataProperty.cs index 021d9e94..48cba80e 100644 --- a/Source/MQTTnet/Packets/Properties/AuthenticationDataProperty.cs +++ b/Source/MQTTnet/Packets/Properties/AuthenticationDataProperty.cs @@ -1,11 +1,12 @@ using System; +using MQTTnet.Packets.Properties.BaseTypes; namespace MQTTnet.Packets.Properties { public class AuthenticationDataProperty : BinaryDataProperty { public AuthenticationDataProperty(ArraySegment data) - : base((byte)PropertyID.AuthenticationData, data) + : base((byte)MqttMessagePropertyID.AuthenticationData, data) { } } diff --git a/Source/MQTTnet/Packets/Properties/AuthenticationMethodProperty.cs b/Source/MQTTnet/Packets/Properties/AuthenticationMethodProperty.cs index 7de63c3d..9693278b 100644 --- a/Source/MQTTnet/Packets/Properties/AuthenticationMethodProperty.cs +++ b/Source/MQTTnet/Packets/Properties/AuthenticationMethodProperty.cs @@ -1,9 +1,11 @@ -namespace MQTTnet.Packets.Properties +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties { public class AuthenticationMethodProperty : StringProperty { public AuthenticationMethodProperty(string value) - : base((byte)PropertyID.AuthenticationMethod, value) + : base((byte)MqttMessagePropertyID.AuthenticationMethod, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/BaseTypes/BinaryDataProperty.cs b/Source/MQTTnet/Packets/Properties/BaseTypes/BinaryDataProperty.cs index 2037b8ef..484d5ee7 100644 --- a/Source/MQTTnet/Packets/Properties/BaseTypes/BinaryDataProperty.cs +++ b/Source/MQTTnet/Packets/Properties/BaseTypes/BinaryDataProperty.cs @@ -1,7 +1,7 @@ using System; -using MQTTnet.Serializer; +using MQTTnet.Formatter; -namespace MQTTnet.Packets.Properties +namespace MQTTnet.Packets.Properties.BaseTypes { public class BinaryDataProperty : IProperty { @@ -24,6 +24,7 @@ namespace MQTTnet.Packets.Properties { if (writer == null) throw new ArgumentNullException(nameof(writer)); + writer.Write(Id); writer.Write((ushort)Data.Count); writer.Write(Data); } diff --git a/Source/MQTTnet/Packets/Properties/BaseTypes/ByteProperty.cs b/Source/MQTTnet/Packets/Properties/BaseTypes/ByteProperty.cs index e3e41210..1bfb9aab 100644 --- a/Source/MQTTnet/Packets/Properties/BaseTypes/ByteProperty.cs +++ b/Source/MQTTnet/Packets/Properties/BaseTypes/ByteProperty.cs @@ -1,7 +1,7 @@ using System; -using MQTTnet.Serializer; +using MQTTnet.Formatter; -namespace MQTTnet.Packets.Properties +namespace MQTTnet.Packets.Properties.BaseTypes { public class ByteProperty : IProperty { @@ -18,7 +18,8 @@ namespace MQTTnet.Packets.Properties public void WriteTo(MqttPacketWriter writer) { if (writer == null) throw new ArgumentNullException(nameof(writer)); - + + writer.Write(Id); writer.Write(Value); } } diff --git a/Source/MQTTnet/Packets/Properties/BaseTypes/FourByteIntegerProperty.cs b/Source/MQTTnet/Packets/Properties/BaseTypes/FourByteIntegerProperty.cs index 56aafe34..594ec3e0 100644 --- a/Source/MQTTnet/Packets/Properties/BaseTypes/FourByteIntegerProperty.cs +++ b/Source/MQTTnet/Packets/Properties/BaseTypes/FourByteIntegerProperty.cs @@ -1,5 +1,5 @@ using System; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Packets.Properties.BaseTypes { @@ -20,6 +20,7 @@ namespace MQTTnet.Packets.Properties.BaseTypes if (writer == null) throw new ArgumentNullException(nameof(writer)); // TODO: Check if order must be reversed like for ushort. + writer.Write(Id); var bytes = BitConverter.GetBytes(Value); writer.Write(bytes, 0, bytes.Length); } diff --git a/Source/MQTTnet/Packets/Properties/BaseTypes/StringProperty.cs b/Source/MQTTnet/Packets/Properties/BaseTypes/StringProperty.cs index b7910698..ff3c1fbf 100644 --- a/Source/MQTTnet/Packets/Properties/BaseTypes/StringProperty.cs +++ b/Source/MQTTnet/Packets/Properties/BaseTypes/StringProperty.cs @@ -1,7 +1,7 @@ using System; -using MQTTnet.Serializer; +using MQTTnet.Formatter; -namespace MQTTnet.Packets.Properties +namespace MQTTnet.Packets.Properties.BaseTypes { public class StringProperty : IProperty { @@ -19,6 +19,7 @@ namespace MQTTnet.Packets.Properties { if (writer == null) throw new ArgumentNullException(nameof(writer)); + writer.Write(Id); writer.WriteWithLengthPrefix(Value); } } diff --git a/Source/MQTTnet/Packets/Properties/BaseTypes/TwoByteIntegerProperty.cs b/Source/MQTTnet/Packets/Properties/BaseTypes/TwoByteIntegerProperty.cs index 4ed67766..8e5a4da0 100644 --- a/Source/MQTTnet/Packets/Properties/BaseTypes/TwoByteIntegerProperty.cs +++ b/Source/MQTTnet/Packets/Properties/BaseTypes/TwoByteIntegerProperty.cs @@ -1,5 +1,5 @@ using System; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Packets.Properties.BaseTypes { @@ -19,6 +19,7 @@ namespace MQTTnet.Packets.Properties.BaseTypes { if (writer == null) throw new ArgumentNullException(nameof(writer)); + writer.Write(Id); writer.Write(Value); } } diff --git a/Source/MQTTnet/Packets/Properties/BaseTypes/VariableByteIntegerProperty.cs b/Source/MQTTnet/Packets/Properties/BaseTypes/VariableByteIntegerProperty.cs index 26eef480..e1fd355c 100644 --- a/Source/MQTTnet/Packets/Properties/BaseTypes/VariableByteIntegerProperty.cs +++ b/Source/MQTTnet/Packets/Properties/BaseTypes/VariableByteIntegerProperty.cs @@ -1,5 +1,5 @@ using System; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Packets.Properties.BaseTypes { @@ -20,6 +20,8 @@ namespace MQTTnet.Packets.Properties.BaseTypes if (writer == null) throw new ArgumentNullException(nameof(writer)); var buffer = MqttPacketWriter.EncodeVariableByteInteger(Value); + + writer.Write(Id); writer.Write(buffer); } } diff --git a/Source/MQTTnet/Packets/Properties/ContentTypeProperty.cs b/Source/MQTTnet/Packets/Properties/ContentTypeProperty.cs index 1e7ec422..459b70d6 100644 --- a/Source/MQTTnet/Packets/Properties/ContentTypeProperty.cs +++ b/Source/MQTTnet/Packets/Properties/ContentTypeProperty.cs @@ -1,9 +1,11 @@ -namespace MQTTnet.Packets.Properties +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties { public class ContentTypeProperty : StringProperty { public ContentTypeProperty(string value) - : base((byte)PropertyID.ContentType, value) + : base((byte)MqttMessagePropertyID.ContentType, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/CorrelationDataProperty.cs b/Source/MQTTnet/Packets/Properties/CorrelationDataProperty.cs index f9104e8c..8b517e3c 100644 --- a/Source/MQTTnet/Packets/Properties/CorrelationDataProperty.cs +++ b/Source/MQTTnet/Packets/Properties/CorrelationDataProperty.cs @@ -1,11 +1,12 @@ using System; +using MQTTnet.Packets.Properties.BaseTypes; namespace MQTTnet.Packets.Properties { public class CorrelationDataProperty : BinaryDataProperty { public CorrelationDataProperty(ArraySegment data) - : base((byte)PropertyID.CorrelationData, data) + : base((byte)MqttMessagePropertyID.CorrelationData, data) { } } diff --git a/Source/MQTTnet/Packets/Properties/IProperty.cs b/Source/MQTTnet/Packets/Properties/IProperty.cs index 739e0cd4..484e48ba 100644 --- a/Source/MQTTnet/Packets/Properties/IProperty.cs +++ b/Source/MQTTnet/Packets/Properties/IProperty.cs @@ -1,4 +1,4 @@ -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Packets.Properties { diff --git a/Source/MQTTnet/Packets/Properties/MaximumPacketSizeProperty.cs b/Source/MQTTnet/Packets/Properties/MaximumPacketSizeProperty.cs new file mode 100644 index 00000000..be060648 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/MaximumPacketSizeProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class MaximumPacketSizeProperty : FourByteIntegerValue + { + public MaximumPacketSizeProperty(uint value) + : base((byte)MqttMessagePropertyID.MaximumPacketSize, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/MaximumQoSProperty.cs b/Source/MQTTnet/Packets/Properties/MaximumQoSProperty.cs new file mode 100644 index 00000000..168b8ca0 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/MaximumQoSProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class MaximumQoSProperty : ByteProperty + { + public MaximumQoSProperty(byte value) + : base((byte)MqttMessagePropertyID.MaximumQoS, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/MessageExpiryIntervalProperty.cs b/Source/MQTTnet/Packets/Properties/MessageExpiryIntervalProperty.cs index 3526935d..6b944f04 100644 --- a/Source/MQTTnet/Packets/Properties/MessageExpiryIntervalProperty.cs +++ b/Source/MQTTnet/Packets/Properties/MessageExpiryIntervalProperty.cs @@ -5,7 +5,7 @@ namespace MQTTnet.Packets.Properties public class MessageExpiryIntervalProperty : FourByteIntegerValue { public MessageExpiryIntervalProperty(uint value) - : base((byte)PropertyID.MessageExpiryInterval, value) + : base((byte)MqttMessagePropertyID.MessageExpiryInterval, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/PropertyID.cs b/Source/MQTTnet/Packets/Properties/MqttMessagePropertyID.cs similarity index 96% rename from Source/MQTTnet/Packets/Properties/PropertyID.cs rename to Source/MQTTnet/Packets/Properties/MqttMessagePropertyID.cs index 69a809ea..2b8666d9 100644 --- a/Source/MQTTnet/Packets/Properties/PropertyID.cs +++ b/Source/MQTTnet/Packets/Properties/MqttMessagePropertyID.cs @@ -1,6 +1,6 @@ namespace MQTTnet.Packets.Properties { - public enum PropertyID + public enum MqttMessagePropertyID { PayloadFormatIndicator = 1, MessageExpiryInterval = 2, diff --git a/Source/MQTTnet/Packets/Properties/PayloadFormatIndicatorProperty.cs b/Source/MQTTnet/Packets/Properties/PayloadFormatIndicatorProperty.cs index f30f5b16..79a7d22d 100644 --- a/Source/MQTTnet/Packets/Properties/PayloadFormatIndicatorProperty.cs +++ b/Source/MQTTnet/Packets/Properties/PayloadFormatIndicatorProperty.cs @@ -1,9 +1,11 @@ -namespace MQTTnet.Packets.Properties +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties { public class PayloadFormatIndicatorProperty : ByteProperty { public PayloadFormatIndicatorProperty(byte value) - : base((byte)PropertyID.PayloadFormatIndicator, value) + : base((byte)MqttMessagePropertyID.PayloadFormatIndicator, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/ReasonStringProperty.cs b/Source/MQTTnet/Packets/Properties/ReasonStringProperty.cs new file mode 100644 index 00000000..1a3d4f15 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/ReasonStringProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class ReasonStringProperty : StringProperty + { + public ReasonStringProperty(string value) + : base((byte)MqttMessagePropertyID.ReasonString, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/ReceiveMaximumProperty.cs b/Source/MQTTnet/Packets/Properties/ReceiveMaximumProperty.cs new file mode 100644 index 00000000..3263eb03 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/ReceiveMaximumProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class ReceiveMaximumProperty : TwoByteIntegerProperty + { + public ReceiveMaximumProperty(ushort value) + : base((byte)MqttMessagePropertyID.ReceiveMaximum, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/RequestProblemInformationProperty.cs b/Source/MQTTnet/Packets/Properties/RequestProblemInformationProperty.cs index 456c9733..537257c6 100644 --- a/Source/MQTTnet/Packets/Properties/RequestProblemInformationProperty.cs +++ b/Source/MQTTnet/Packets/Properties/RequestProblemInformationProperty.cs @@ -1,9 +1,11 @@ -namespace MQTTnet.Packets.Properties +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties { public class RequestProblemInformationProperty : ByteProperty { public RequestProblemInformationProperty(byte value) - : base((byte)PropertyID.RequestProblemInformation, value) + : base((byte)MqttMessagePropertyID.RequestProblemInformation, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/RequestResponseInformationProperty.cs b/Source/MQTTnet/Packets/Properties/RequestResponseInformationProperty.cs index 9119675b..881f7eae 100644 --- a/Source/MQTTnet/Packets/Properties/RequestResponseInformationProperty.cs +++ b/Source/MQTTnet/Packets/Properties/RequestResponseInformationProperty.cs @@ -1,9 +1,11 @@ -namespace MQTTnet.Packets.Properties +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties { public class RequestResponseInformationProperty : ByteProperty { public RequestResponseInformationProperty(byte value) - : base((byte)PropertyID.RequestResponseInformation, value) + : base((byte)MqttMessagePropertyID.RequestResponseInformation, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/ResponseInformationProperty.cs b/Source/MQTTnet/Packets/Properties/ResponseInformationProperty.cs new file mode 100644 index 00000000..e080f992 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/ResponseInformationProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class ResponseInformationProperty : StringProperty + { + public ResponseInformationProperty(string value) + : base((byte)MqttMessagePropertyID.ResponseInformation, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/ResponseTopicProperty.cs b/Source/MQTTnet/Packets/Properties/ResponseTopicProperty.cs index ad41bf85..5f221863 100644 --- a/Source/MQTTnet/Packets/Properties/ResponseTopicProperty.cs +++ b/Source/MQTTnet/Packets/Properties/ResponseTopicProperty.cs @@ -1,9 +1,11 @@ -namespace MQTTnet.Packets.Properties +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties { public class ResponseTopicProperty : StringProperty { public ResponseTopicProperty(string value) - : base((byte)PropertyID.ResponseTopic, value) + : base((byte)MqttMessagePropertyID.ResponseTopic, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/RetainAvailableProperty.cs b/Source/MQTTnet/Packets/Properties/RetainAvailableProperty.cs new file mode 100644 index 00000000..f407bdcc --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/RetainAvailableProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class RetainAvailableProperty : ByteProperty + { + public RetainAvailableProperty(byte value) + : base((byte)MqttMessagePropertyID.RetainAvailable, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/ServerKeepAliveProperty.cs b/Source/MQTTnet/Packets/Properties/ServerKeepAliveProperty.cs index a247fb47..272860c4 100644 --- a/Source/MQTTnet/Packets/Properties/ServerKeepAliveProperty.cs +++ b/Source/MQTTnet/Packets/Properties/ServerKeepAliveProperty.cs @@ -5,7 +5,7 @@ namespace MQTTnet.Packets.Properties public class ServerKeepAliveProperty : TwoByteIntegerProperty { public ServerKeepAliveProperty(ushort value) - : base((byte)PropertyID.ServerKeepAlive, value) + : base((byte)MqttMessagePropertyID.ServerKeepAlive, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/ServerReferenceProperty.cs b/Source/MQTTnet/Packets/Properties/ServerReferenceProperty.cs new file mode 100644 index 00000000..2b50e793 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/ServerReferenceProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class ServerReferenceProperty : StringProperty + { + public ServerReferenceProperty(string value) + : base((byte)MqttMessagePropertyID.ServerReference, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/SessionExpiryIntervalProperty.cs b/Source/MQTTnet/Packets/Properties/SessionExpiryIntervalProperty.cs index f28422e3..651de5d2 100644 --- a/Source/MQTTnet/Packets/Properties/SessionExpiryIntervalProperty.cs +++ b/Source/MQTTnet/Packets/Properties/SessionExpiryIntervalProperty.cs @@ -5,7 +5,7 @@ namespace MQTTnet.Packets.Properties public class SessionExpiryIntervalProperty : FourByteIntegerValue { public SessionExpiryIntervalProperty(uint value) - : base((byte)PropertyID.SessionExpiryInterval, value) + : base((byte)MqttMessagePropertyID.SessionExpiryInterval, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/SharedSubscriptionAvailableProperty.cs b/Source/MQTTnet/Packets/Properties/SharedSubscriptionAvailableProperty.cs new file mode 100644 index 00000000..8461fa38 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/SharedSubscriptionAvailableProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class SharedSubscriptionAvailableProperty : ByteProperty + { + public SharedSubscriptionAvailableProperty(byte value) + : base((byte)MqttMessagePropertyID.SharedSubscriptionAvailable, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/SubscriptionIdentifierAvailable.cs b/Source/MQTTnet/Packets/Properties/SubscriptionIdentifierAvailable.cs new file mode 100644 index 00000000..d4789b23 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/SubscriptionIdentifierAvailable.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class SubscriptionIdentifierAvailable : ByteProperty + { + public SubscriptionIdentifierAvailable(byte value) + : base((byte)MqttMessagePropertyID.SubscriptionIdentifierAvailable, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/SubscriptionIdentifierProperty.cs b/Source/MQTTnet/Packets/Properties/SubscriptionIdentifierProperty.cs index dca6ad58..9f9a56fe 100644 --- a/Source/MQTTnet/Packets/Properties/SubscriptionIdentifierProperty.cs +++ b/Source/MQTTnet/Packets/Properties/SubscriptionIdentifierProperty.cs @@ -5,7 +5,7 @@ namespace MQTTnet.Packets.Properties public class SubscriptionIdentifierProperty : VariableByteIntegerProperty { public SubscriptionIdentifierProperty(uint value) - : base((byte)PropertyID.SubscriptionIdentifier, value) + : base((byte)MqttMessagePropertyID.SubscriptionIdentifier, value) { } } diff --git a/Source/MQTTnet/Packets/Properties/TopicAliasMaximumProperty.cs b/Source/MQTTnet/Packets/Properties/TopicAliasMaximumProperty.cs new file mode 100644 index 00000000..02c36c08 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/TopicAliasMaximumProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class TopicAliasMaximumProperty : TwoByteIntegerProperty + { + public TopicAliasMaximumProperty(ushort value) + : base((byte)MqttMessagePropertyID.TopicAliasMaximum, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/TopicAliasProperty.cs b/Source/MQTTnet/Packets/Properties/TopicAliasProperty.cs new file mode 100644 index 00000000..41c4495e --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/TopicAliasProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class TopicAliasProperty : TwoByteIntegerProperty + { + public TopicAliasProperty(ushort value) + : base((byte)MqttMessagePropertyID.TopicAlias, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/UserPropertyProperty.cs b/Source/MQTTnet/Packets/Properties/UserPropertyProperty.cs new file mode 100644 index 00000000..0708d3f4 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/UserPropertyProperty.cs @@ -0,0 +1,29 @@ +using System; +using MQTTnet.Formatter; + +namespace MQTTnet.Packets.Properties +{ + public class UserPropertyProperty : IProperty + { + public UserPropertyProperty(string name, string value) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + Value = value ?? throw new ArgumentNullException(nameof(value)); + } + + public byte Id { get; } = (byte)MqttMessagePropertyID.UserProperty; + + public string Name { get; } + + public string Value { get; } + + public void WriteTo(MqttPacketWriter writer) + { + if (writer == null) throw new ArgumentNullException(nameof(writer)); + + writer.Write(Id); + writer.WriteWithLengthPrefix(Name); + writer.WriteWithLengthPrefix(Value); + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/WildcardSubscriptionAvailableProperty.cs b/Source/MQTTnet/Packets/Properties/WildcardSubscriptionAvailableProperty.cs new file mode 100644 index 00000000..7c901ec4 --- /dev/null +++ b/Source/MQTTnet/Packets/Properties/WildcardSubscriptionAvailableProperty.cs @@ -0,0 +1,12 @@ +using MQTTnet.Packets.Properties.BaseTypes; + +namespace MQTTnet.Packets.Properties +{ + public class WildcardSubscriptionAvailableProperty : ByteProperty + { + public WildcardSubscriptionAvailableProperty(byte value) + : base((byte)MqttMessagePropertyID.WildcardSubscriptionAvailable, value) + { + } + } +} diff --git a/Source/MQTTnet/Packets/Properties/WillDelayIntervalProperty.cs b/Source/MQTTnet/Packets/Properties/WillDelayIntervalProperty.cs index e285f868..f40bfbc3 100644 --- a/Source/MQTTnet/Packets/Properties/WillDelayIntervalProperty.cs +++ b/Source/MQTTnet/Packets/Properties/WillDelayIntervalProperty.cs @@ -5,7 +5,7 @@ namespace MQTTnet.Packets.Properties public class WillDelayIntervalProperty : FourByteIntegerValue { public WillDelayIntervalProperty(uint value) - : base((byte)PropertyID.WillDelayInterval, value) + : base((byte)MqttMessagePropertyID.WillDelayInterval, value) { } } diff --git a/Source/MQTTnet/Protocol/MqttAuthenticateReasonCode.cs b/Source/MQTTnet/Protocol/MqttAuthenticateReasonCode.cs new file mode 100644 index 00000000..48d79481 --- /dev/null +++ b/Source/MQTTnet/Protocol/MqttAuthenticateReasonCode.cs @@ -0,0 +1,9 @@ +namespace MQTTnet.Protocol +{ + public enum MqttAuthenticateReasonCode + { + Success = 0, + ContinueAuthentication = 24, + ReAuthenticate = 25 + } +} diff --git a/Source/MQTTnet/Serializer/IMqttPacketSerializer.cs b/Source/MQTTnet/Serializer/IMqttPacketSerializer.cs deleted file mode 100644 index 47d1cd8e..00000000 --- a/Source/MQTTnet/Serializer/IMqttPacketSerializer.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using MQTTnet.Adapter; -using MQTTnet.Packets; - -namespace MQTTnet.Serializer -{ - public interface IMqttPacketSerializer - { - ArraySegment Serialize(MqttBasePacket mqttPacket); - - MqttBasePacket Deserialize(ReceivedMqttPacket receivedMqttPacket); - - void FreeBuffer(); - } -} \ No newline at end of file diff --git a/Source/MQTTnet/Serializer/MqttV500PacketSerializer.cs b/Source/MQTTnet/Serializer/MqttV500PacketSerializer.cs deleted file mode 100644 index e0241555..00000000 --- a/Source/MQTTnet/Serializer/MqttV500PacketSerializer.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using MQTTnet.Adapter; -using MQTTnet.Exceptions; -using MQTTnet.Packets; -using MQTTnet.Protocol; - -namespace MQTTnet.Serializer -{ - public class MqttV500PacketSerializer : MqttV311PacketSerializer - { - //public ArraySegment Serialize(MqttBasePacket mqttPacket) - //{ - // throw new NotImplementedException(); - //} - - //public MqttBasePacket Deserialize(ReceivedMqttPacket receivedMqttPacket) - //{ - // throw new NotImplementedException(); - //} - - protected override byte SerializeConnectPacket(MqttConnectPacket packet, MqttPacketWriter packetWriter) - { - ValidateConnectPacket(packet); - - packetWriter.WriteWithLengthPrefix("MQTT"); - packetWriter.Write(5); // [3.1.2.2 Protocol Version] - - byte connectFlags = 0x0; - if (packet.CleanSession) - { - connectFlags |= 0x2; - } - - if (packet.WillMessage != null) - { - connectFlags |= 0x4; - connectFlags |= (byte)((byte)packet.WillMessage.QualityOfServiceLevel << 3); - - if (packet.WillMessage.Retain) - { - connectFlags |= 0x20; - } - } - - if (packet.Password != null && packet.Username == null) - { - throw new MqttProtocolViolationException("If the User Name Flag is set to 0, the Password Flag MUST be set to 0 [MQTT-3.1.2-22]."); - } - - if (packet.Password != null) - { - connectFlags |= 0x40; - } - - if (packet.Username != null) - { - connectFlags |= 0x80; - } - - packetWriter.Write(connectFlags); - packetWriter.Write(packet.KeepAlivePeriod); - packetWriter.WriteWithLengthPrefix(packet.ClientId); - - if (packet.WillMessage != null) - { - packetWriter.WriteWithLengthPrefix(packet.WillMessage.Topic); - packetWriter.WriteWithLengthPrefix(packet.WillMessage.Payload); - } - - if (packet.Username != null) - { - packetWriter.WriteWithLengthPrefix(packet.Username); - } - - if (packet.Password != null) - { - packetWriter.WriteWithLengthPrefix(packet.Password); - } - - if (packet.Properties != null) - { - var propertyWriter = new MqttPacketWriter(); - foreach (var property in packet.Properties) - { - propertyWriter.Write(property.Id); - property.WriteTo(propertyWriter); - } - - packetWriter.WriteVariableLengthInteger((uint)propertyWriter.Length); - packetWriter.Write(propertyWriter); - } - - return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Connect); - } - } -} diff --git a/Source/MQTTnet/Server/IMqttClientSessionStatus.cs b/Source/MQTTnet/Server/IMqttClientSessionStatus.cs index d9c55938..38b52e2e 100644 --- a/Source/MQTTnet/Server/IMqttClientSessionStatus.cs +++ b/Source/MQTTnet/Server/IMqttClientSessionStatus.cs @@ -1,6 +1,6 @@ using System; using System.Threading.Tasks; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Server { diff --git a/Source/MQTTnet/Server/MqttClientSessionStatus.cs b/Source/MQTTnet/Server/MqttClientSessionStatus.cs index 4d83357e..7381f94f 100644 --- a/Source/MQTTnet/Server/MqttClientSessionStatus.cs +++ b/Source/MQTTnet/Server/MqttClientSessionStatus.cs @@ -1,6 +1,6 @@ using System; using System.Threading.Tasks; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Server { diff --git a/Tests/MQTTnet.AspNetCore.Tests/MqttConnectionContextTest.cs b/Tests/MQTTnet.AspNetCore.Tests/MqttConnectionContextTest.cs index 2ec621de..4461a135 100644 --- a/Tests/MQTTnet.AspNetCore.Tests/MqttConnectionContextTest.cs +++ b/Tests/MQTTnet.AspNetCore.Tests/MqttConnectionContextTest.cs @@ -3,11 +3,11 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.AspNetCore.Tests.Mockups; using MQTTnet.Exceptions; using MQTTnet.Packets; -using MQTTnet.Serializer; using System; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MQTTnet.Formatter; namespace MQTTnet.AspNetCore.Tests { diff --git a/Tests/MQTTnet.AspNetCore.Tests/ReaderExtensionsTest.cs b/Tests/MQTTnet.AspNetCore.Tests/ReaderExtensionsTest.cs index 332f3eaa..7d5e55ac 100644 --- a/Tests/MQTTnet.AspNetCore.Tests/ReaderExtensionsTest.cs +++ b/Tests/MQTTnet.AspNetCore.Tests/ReaderExtensionsTest.cs @@ -2,8 +2,8 @@ using System.Buffers; using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.AspNetCore; +using MQTTnet.Formatter.V311; using MQTTnet.Packets; -using MQTTnet.Serializer; namespace MQTTnet.AspNetCore.Tests { @@ -13,9 +13,9 @@ namespace MQTTnet.AspNetCore.Tests [TestMethod] public void TestTryDeserialize() { - var serializer = new MqttV311PacketSerializer(); + var serializer = new MqttV311PacketFormatter(); - var buffer = serializer.Serialize(new MqttPublishPacket() {Topic = "a", Payload = new byte[5]}); + var buffer = serializer.Encode(new MqttPublishPacket() {Topic = "a", Payload = new byte[5]}); var sequence = new ReadOnlySequence(buffer.Array, buffer.Offset, buffer.Count); diff --git a/Tests/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs b/Tests/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs index 5ec3c0f6..fb7443cb 100644 --- a/Tests/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs +++ b/Tests/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs @@ -3,10 +3,10 @@ using MQTTnet.Adapter; using MQTTnet.Diagnostics; using MQTTnet.Internal; using MQTTnet.Packets; -using MQTTnet.Serializer; using System; using System.IO; using System.Threading; +using MQTTnet.Formatter; namespace MQTTnet.Benchmarks { @@ -28,7 +28,7 @@ namespace MQTTnet.Benchmarks _packet = message.ToPublishPacket(); var serializer = new MqttPacketSerializerAdapter(MqttProtocolVersion.V311); - var serializedPacket = Join(serializer.Serialize(_packet)); + var serializedPacket = Join(serializer.Encode(_packet)); _iterations = 10000; diff --git a/Tests/MQTTnet.Benchmarks/SerializerBenchmark.cs b/Tests/MQTTnet.Benchmarks/SerializerBenchmark.cs index fa407085..53caec15 100644 --- a/Tests/MQTTnet.Benchmarks/SerializerBenchmark.cs +++ b/Tests/MQTTnet.Benchmarks/SerializerBenchmark.cs @@ -1,12 +1,13 @@ using BenchmarkDotNet.Attributes; using MQTTnet.Packets; -using MQTTnet.Serializer; using MQTTnet.Internal; using System; using System.Threading; using System.Threading.Tasks; using MQTTnet.Adapter; using MQTTnet.Channel; +using MQTTnet.Formatter; +using MQTTnet.Formatter.V311; namespace MQTTnet.Benchmarks { @@ -17,7 +18,7 @@ namespace MQTTnet.Benchmarks { private MqttBasePacket _packet; private ArraySegment _serializedPacket; - private IMqttPacketSerializer _serializer; + private IMqttPacketFormatter _serializer; [GlobalSetup] public void Setup() @@ -27,8 +28,8 @@ namespace MQTTnet.Benchmarks .Build(); _packet = message.ToPublishPacket(); - _serializer = new MqttV311PacketSerializer(); - _serializedPacket = _serializer.Serialize(_packet); + _serializer = new MqttV311PacketFormatter(); + _serializedPacket = _serializer.Encode(_packet); } [Benchmark] @@ -36,7 +37,7 @@ namespace MQTTnet.Benchmarks { for (var i = 0; i < 10000; i++) { - _serializer.Serialize(_packet); + _serializer.Encode(_packet); _serializer.FreeBuffer(); } } @@ -58,7 +59,7 @@ namespace MQTTnet.Benchmarks header.Flags, new MqttPacketBodyReader(_serializedPacket.Array, _serializedPacket.Count - header.RemainingLength, _serializedPacket.Array.Length)); - _serializer.Deserialize(receivedPacket); + _serializer.Decode(receivedPacket); } } diff --git a/Tests/MQTTnet.Core.Tests/MqttPacketReaderTests.cs b/Tests/MQTTnet.Core.Tests/MqttPacketReaderTests.cs index 39aeeff2..eb2ad8f7 100644 --- a/Tests/MQTTnet.Core.Tests/MqttPacketReaderTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttPacketReaderTests.cs @@ -2,8 +2,8 @@ using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.Exceptions; +using MQTTnet.Formatter; using MQTTnet.Internal; -using MQTTnet.Serializer; namespace MQTTnet.Core.Tests { diff --git a/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs b/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs index 59b68496..ebb379f6 100644 --- a/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs @@ -5,10 +5,12 @@ using System.Text; using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.Adapter; +using MQTTnet.Formatter; +using MQTTnet.Formatter.V310; +using MQTTnet.Formatter.V311; using MQTTnet.Internal; using MQTTnet.Packets; using MQTTnet.Protocol; -using MQTTnet.Serializer; namespace MQTTnet.Core.Tests { @@ -153,7 +155,7 @@ namespace MQTTnet.Core.Tests [TestMethod] public void Serialize_LargePacket() { - var serializer = new MqttV311PacketSerializer(); + var serializer = new MqttV311PacketFormatter(); const int payloadLength = 80000; @@ -176,7 +178,7 @@ namespace MQTTnet.Core.Tests Payload = payload }; - var buffer = serializer.Serialize(publishPacket); + var buffer = serializer.Encode(publishPacket); var testChannel = new TestMqttChannel(new MemoryStream(buffer.Array, buffer.Offset, buffer.Count)); var header = MqttPacketReader.ReadFixedHeaderAsync( @@ -191,7 +193,7 @@ namespace MQTTnet.Core.Tests header.Flags, new MqttPacketBodyReader(buffer.Array, eof - header.RemainingLength, buffer.Count + buffer.Offset)); - var packet = (MqttPublishPacket)serializer.Deserialize(receivedPacket); + var packet = (MqttPublishPacket)serializer.Decode(receivedPacket); Assert.AreEqual(publishPacket.Topic, packet.Topic); Assert.IsTrue(publishPacket.Payload.SequenceEqual(packet.Payload)); @@ -509,42 +511,42 @@ namespace MQTTnet.Core.Tests private static void SerializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311) { - IMqttPacketSerializer serializer; + IMqttPacketFormatter serializer; if (protocolVersion == MqttProtocolVersion.V311) { - serializer = new MqttV311PacketSerializer(); + serializer = new MqttV311PacketFormatter(); } else if (protocolVersion == MqttProtocolVersion.V310) { - serializer = new MqttV310PacketSerializer(); + serializer = new MqttV310PacketFormatter(); } else { throw new NotSupportedException(); } - var data = serializer.Serialize(packet); + var data = serializer.Encode(packet); Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(data))); } private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311) { - IMqttPacketSerializer serializer; + IMqttPacketFormatter serializer; if (protocolVersion == MqttProtocolVersion.V311) { - serializer = new MqttV311PacketSerializer(); + serializer = new MqttV311PacketFormatter(); } else if (protocolVersion == MqttProtocolVersion.V310) { - serializer = new MqttV310PacketSerializer(); + serializer = new MqttV310PacketFormatter(); } else { throw new NotSupportedException(); } - var buffer1 = serializer.Serialize(packet); + var buffer1 = serializer.Encode(packet); using (var headerStream = new MemoryStream(Join(buffer1))) { @@ -555,8 +557,8 @@ namespace MQTTnet.Core.Tests using (var bodyStream = new MemoryStream(Join(buffer1), (int)headerStream.Position, header.RemainingLength)) { - var deserializedPacket = serializer.Deserialize(new ReceivedMqttPacket(header.Flags, new MqttPacketBodyReader(bodyStream.ToArray(), 0, (int)bodyStream.Length))); - var buffer2 = serializer.Serialize(deserializedPacket); + var deserializedPacket = serializer.Decode(new ReceivedMqttPacket(header.Flags, new MqttPacketBodyReader(bodyStream.ToArray(), 0, (int)bodyStream.Length))); + var buffer2 = serializer.Encode(deserializedPacket); Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(buffer2))); } @@ -566,21 +568,21 @@ namespace MQTTnet.Core.Tests private static T Roundtrip(T packet, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311) where T : MqttBasePacket { - IMqttPacketSerializer serializer; + IMqttPacketFormatter serializer; if (protocolVersion == MqttProtocolVersion.V311) { - serializer = new MqttV311PacketSerializer(); + serializer = new MqttV311PacketFormatter(); } else if (protocolVersion == MqttProtocolVersion.V310) { - serializer = new MqttV310PacketSerializer(); + serializer = new MqttV310PacketFormatter(); } else { throw new NotSupportedException(); } - var buffer1 = serializer.Serialize(packet); + var buffer1 = serializer.Encode(packet); using (var headerStream = new MemoryStream(Join(buffer1))) { @@ -592,7 +594,7 @@ namespace MQTTnet.Core.Tests using (var bodyStream = new MemoryStream(Join(buffer1), (int)headerStream.Position, header.RemainingLength)) { - return (T)serializer.Deserialize(new ReceivedMqttPacket(header.Flags, new MqttPacketBodyReader(bodyStream.ToArray(), 0, (int)bodyStream.Length))); + return (T)serializer.Decode(new ReceivedMqttPacket(header.Flags, new MqttPacketBodyReader(bodyStream.ToArray(), 0, (int)bodyStream.Length))); } } } diff --git a/Tests/MQTTnet.Core.Tests/MqttPacketWriterTests.cs b/Tests/MQTTnet.Core.Tests/MqttPacketWriterTests.cs index 8b73b739..a3209144 100644 --- a/Tests/MQTTnet.Core.Tests/MqttPacketWriterTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttPacketWriterTests.cs @@ -1,5 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -using MQTTnet.Serializer; +using MQTTnet.Formatter; namespace MQTTnet.Core.Tests { diff --git a/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapter.cs b/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapter.cs index 1902de4e..ceb44e13 100644 --- a/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapter.cs +++ b/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapter.cs @@ -3,8 +3,8 @@ using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; using MQTTnet.Adapter; +using MQTTnet.Formatter; using MQTTnet.Packets; -using MQTTnet.Serializer; namespace MQTTnet.Core.Tests { diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml index c99ebd84..44f3486b 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml +++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml @@ -37,6 +37,7 @@ + Server: @@ -57,12 +58,19 @@ Keep Alive interval: - Protocol: + Transport: - TCP - WS + TCP + WS Use TLS + + Protocol: + + 5.0.0 + 3.1.1 + 3.1.0 + Clean session diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs index 633f351e..6992b3cc 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs +++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs @@ -12,9 +12,9 @@ using MQTTnet.Diagnostics; using MQTTnet.Exceptions; using MQTTnet.Extensions.ManagedClient; using MQTTnet.Extensions.Rpc; +using MQTTnet.Formatter; using MQTTnet.Implementations; using MQTTnet.Protocol; -using MQTTnet.Serializer; using MQTTnet.Server; using MqttClientConnectedEventArgs = MQTTnet.Client.MqttClientConnectedEventArgs; using MqttClientDisconnectedEventArgs = MQTTnet.Client.MqttClientDisconnectedEventArgs; @@ -124,7 +124,20 @@ namespace MQTTnet.TestApp.UniversalWindows options.CleanSession = CleanSession.IsChecked == true; options.KeepAlivePeriod = TimeSpan.FromSeconds(double.Parse(KeepAliveInterval.Text)); - + + if (UseMqtt310.IsChecked == true) + { + options.ProtocolVersion = MqttProtocolVersion.V310; + } + else if (UseMqtt311.IsChecked == true) + { + options.ProtocolVersion = MqttProtocolVersion.V311; + } + else if (UseMqtt500.IsChecked == true) + { + options.ProtocolVersion = MqttProtocolVersion.V500; + } + try { if (_mqttClient != null) @@ -426,14 +439,14 @@ namespace MQTTnet.TestApp.UniversalWindows _sessions.Clear(); } - private async void RefreshSessions(object sender, RoutedEventArgs e) + private void RefreshSessions(object sender, RoutedEventArgs e) { if (_mqttServer == null) { return; } - var sessions = await _mqttServer.GetClientSessionsStatusAsync(); + var sessions = _mqttServer.GetClientSessionsStatus(); _sessions.Clear(); foreach (var session in sessions)