From 14224e4180bd54dea70a1dcfd226fc26dfa55522 Mon Sep 17 00:00:00 2001 From: Max Gortman Date: Tue, 3 Nov 2020 12:19:38 -0800 Subject: [PATCH] Add support for Maximum QoS property on CONNACK --- .../Client/Connecting/MqttClientAuthenticateResult.cs | 3 +++ Source/MQTTnet/Formatter/V5/MqttV500DataConverter.cs | 1 + Source/MQTTnet/Formatter/V5/MqttV500PacketDecoder.cs | 4 ++++ Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs | 1 + .../MQTTnet/Formatter/V5/MqttV500PropertiesReader.cs | 10 ++++++++++ .../MQTTnet/Formatter/V5/MqttV500PropertiesWriter.cs | 11 +++++++++++ Source/MQTTnet/Packets/MqttConnAckPacketProperties.cs | 3 +++ 7 files changed, 33 insertions(+) diff --git a/Source/MQTTnet/Client/Connecting/MqttClientAuthenticateResult.cs b/Source/MQTTnet/Client/Connecting/MqttClientAuthenticateResult.cs index 21d646ba..f7ff7253 100644 --- a/Source/MQTTnet/Client/Connecting/MqttClientAuthenticateResult.cs +++ b/Source/MQTTnet/Client/Connecting/MqttClientAuthenticateResult.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using MQTTnet.Packets; +using MQTTnet.Protocol; namespace MQTTnet.Client.Connecting { @@ -25,6 +26,8 @@ namespace MQTTnet.Client.Connecting public string ReasonString { get; set; } public ushort? ReceiveMaximum { get; set; } + + public MqttQualityOfServiceLevel? MaximumQoS { get; set; } public string ResponseInformation { get; set; } diff --git a/Source/MQTTnet/Formatter/V5/MqttV500DataConverter.cs b/Source/MQTTnet/Formatter/V5/MqttV500DataConverter.cs index f55c3476..b5d7103d 100644 --- a/Source/MQTTnet/Formatter/V5/MqttV500DataConverter.cs +++ b/Source/MQTTnet/Formatter/V5/MqttV500DataConverter.cs @@ -93,6 +93,7 @@ namespace MQTTnet.Formatter.V5 MaximumPacketSize = connAckPacket.Properties?.MaximumPacketSize, ReasonString = connAckPacket.Properties?.ReasonString, ReceiveMaximum = connAckPacket.Properties?.ReceiveMaximum, + MaximumQoS = connAckPacket.Properties?.MaximumQoS, ResponseInformation = connAckPacket.Properties?.ResponseInformation, TopicAliasMaximum = connAckPacket.Properties?.TopicAliasMaximum, ServerReference = connAckPacket.Properties?.ServerReference, diff --git a/Source/MQTTnet/Formatter/V5/MqttV500PacketDecoder.cs b/Source/MQTTnet/Formatter/V5/MqttV500PacketDecoder.cs index cdbceda7..be8d74f4 100644 --- a/Source/MQTTnet/Formatter/V5/MqttV500PacketDecoder.cs +++ b/Source/MQTTnet/Formatter/V5/MqttV500PacketDecoder.cs @@ -254,6 +254,10 @@ namespace MQTTnet.Formatter.V5 { packet.Properties.ReceiveMaximum = propertiesReader.ReadReceiveMaximum(); } + else if (propertiesReader.CurrentPropertyId == MqttPropertyId.MaximumQoS) + { + packet.Properties.MaximumQoS = propertiesReader.ReadMaximumQoS(); + } else if (propertiesReader.CurrentPropertyId == MqttPropertyId.AssignedClientIdentifier) { packet.Properties.AssignedClientIdentifier = propertiesReader.ReadAssignedClientIdentifier(); diff --git a/Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs b/Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs index 9ebc7408..daff40f8 100644 --- a/Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs +++ b/Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs @@ -203,6 +203,7 @@ namespace MQTTnet.Formatter.V5 propertiesWriter.WriteAuthenticationData(packet.Properties.AuthenticationData); propertiesWriter.WriteRetainAvailable(packet.Properties.RetainAvailable); propertiesWriter.WriteReceiveMaximum(packet.Properties.ReceiveMaximum); + propertiesWriter.WriteMaximumQoS(packet.Properties.MaximumQoS); propertiesWriter.WriteAssignedClientIdentifier(packet.Properties.AssignedClientIdentifier); propertiesWriter.WriteTopicAliasMaximum(packet.Properties.TopicAliasMaximum); propertiesWriter.WriteReasonString(packet.Properties.ReasonString); diff --git a/Source/MQTTnet/Formatter/V5/MqttV500PropertiesReader.cs b/Source/MQTTnet/Formatter/V5/MqttV500PropertiesReader.cs index 443cf177..3282dbda 100644 --- a/Source/MQTTnet/Formatter/V5/MqttV500PropertiesReader.cs +++ b/Source/MQTTnet/Formatter/V5/MqttV500PropertiesReader.cs @@ -82,6 +82,16 @@ namespace MQTTnet.Formatter.V5 return _body.ReadTwoByteInteger(); } + public MqttQualityOfServiceLevel ReadMaximumQoS() + { + byte value = _body.ReadByte(); + if (value > 1) + { + throw new MqttProtocolViolationException($"Unexpected Maximum QoS value: {value}"); + } + return (MqttQualityOfServiceLevel)value; + } + public string ReadAssignedClientIdentifier() { return _body.ReadStringWithLengthPrefix(); diff --git a/Source/MQTTnet/Formatter/V5/MqttV500PropertiesWriter.cs b/Source/MQTTnet/Formatter/V5/MqttV500PropertiesWriter.cs index f632586b..cb1b23ed 100644 --- a/Source/MQTTnet/Formatter/V5/MqttV500PropertiesWriter.cs +++ b/Source/MQTTnet/Formatter/V5/MqttV500PropertiesWriter.cs @@ -133,6 +133,17 @@ namespace MQTTnet.Formatter.V5 Write(MqttPropertyId.ReceiveMaximum, value); } + public void WriteMaximumQoS(MqttQualityOfServiceLevel? value) + { + if (!value.HasValue || value.Value > MqttQualityOfServiceLevel.AtLeastOnce) + { + return; + } + + _packetWriter.Write((byte)MqttPropertyId.MaximumQoS); + _packetWriter.Write((byte)value.Value); + } + public void WriteMaximumPacketSize(uint? value) { WriteAsFourByteInteger(MqttPropertyId.MaximumPacketSize, value); diff --git a/Source/MQTTnet/Packets/MqttConnAckPacketProperties.cs b/Source/MQTTnet/Packets/MqttConnAckPacketProperties.cs index d59735c6..686f2886 100644 --- a/Source/MQTTnet/Packets/MqttConnAckPacketProperties.cs +++ b/Source/MQTTnet/Packets/MqttConnAckPacketProperties.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using MQTTnet.Protocol; namespace MQTTnet.Packets { @@ -8,6 +9,8 @@ namespace MQTTnet.Packets public ushort? ReceiveMaximum { get; set; } + public MqttQualityOfServiceLevel? MaximumQoS { get; set; } + public bool? RetainAvailable { get; set; } public uint? MaximumPacketSize { get; set; }