Add support for Maximum QoS property on CONNACK

This commit is contained in:
Max Gortman
2020-11-03 12:19:38 -08:00
parent 1a9460776b
commit 14224e4180
7 changed files with 33 additions and 0 deletions
@@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using MQTTnet.Packets; using MQTTnet.Packets;
using MQTTnet.Protocol;
namespace MQTTnet.Client.Connecting namespace MQTTnet.Client.Connecting
{ {
@@ -25,6 +26,8 @@ namespace MQTTnet.Client.Connecting
public string ReasonString { get; set; } public string ReasonString { get; set; }
public ushort? ReceiveMaximum { get; set; } public ushort? ReceiveMaximum { get; set; }
public MqttQualityOfServiceLevel? MaximumQoS { get; set; }
public string ResponseInformation { get; set; } public string ResponseInformation { get; set; }
@@ -93,6 +93,7 @@ namespace MQTTnet.Formatter.V5
MaximumPacketSize = connAckPacket.Properties?.MaximumPacketSize, MaximumPacketSize = connAckPacket.Properties?.MaximumPacketSize,
ReasonString = connAckPacket.Properties?.ReasonString, ReasonString = connAckPacket.Properties?.ReasonString,
ReceiveMaximum = connAckPacket.Properties?.ReceiveMaximum, ReceiveMaximum = connAckPacket.Properties?.ReceiveMaximum,
MaximumQoS = connAckPacket.Properties?.MaximumQoS,
ResponseInformation = connAckPacket.Properties?.ResponseInformation, ResponseInformation = connAckPacket.Properties?.ResponseInformation,
TopicAliasMaximum = connAckPacket.Properties?.TopicAliasMaximum, TopicAliasMaximum = connAckPacket.Properties?.TopicAliasMaximum,
ServerReference = connAckPacket.Properties?.ServerReference, ServerReference = connAckPacket.Properties?.ServerReference,
@@ -254,6 +254,10 @@ namespace MQTTnet.Formatter.V5
{ {
packet.Properties.ReceiveMaximum = propertiesReader.ReadReceiveMaximum(); packet.Properties.ReceiveMaximum = propertiesReader.ReadReceiveMaximum();
} }
else if (propertiesReader.CurrentPropertyId == MqttPropertyId.MaximumQoS)
{
packet.Properties.MaximumQoS = propertiesReader.ReadMaximumQoS();
}
else if (propertiesReader.CurrentPropertyId == MqttPropertyId.AssignedClientIdentifier) else if (propertiesReader.CurrentPropertyId == MqttPropertyId.AssignedClientIdentifier)
{ {
packet.Properties.AssignedClientIdentifier = propertiesReader.ReadAssignedClientIdentifier(); packet.Properties.AssignedClientIdentifier = propertiesReader.ReadAssignedClientIdentifier();
@@ -203,6 +203,7 @@ namespace MQTTnet.Formatter.V5
propertiesWriter.WriteAuthenticationData(packet.Properties.AuthenticationData); propertiesWriter.WriteAuthenticationData(packet.Properties.AuthenticationData);
propertiesWriter.WriteRetainAvailable(packet.Properties.RetainAvailable); propertiesWriter.WriteRetainAvailable(packet.Properties.RetainAvailable);
propertiesWriter.WriteReceiveMaximum(packet.Properties.ReceiveMaximum); propertiesWriter.WriteReceiveMaximum(packet.Properties.ReceiveMaximum);
propertiesWriter.WriteMaximumQoS(packet.Properties.MaximumQoS);
propertiesWriter.WriteAssignedClientIdentifier(packet.Properties.AssignedClientIdentifier); propertiesWriter.WriteAssignedClientIdentifier(packet.Properties.AssignedClientIdentifier);
propertiesWriter.WriteTopicAliasMaximum(packet.Properties.TopicAliasMaximum); propertiesWriter.WriteTopicAliasMaximum(packet.Properties.TopicAliasMaximum);
propertiesWriter.WriteReasonString(packet.Properties.ReasonString); propertiesWriter.WriteReasonString(packet.Properties.ReasonString);
@@ -82,6 +82,16 @@ namespace MQTTnet.Formatter.V5
return _body.ReadTwoByteInteger(); 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() public string ReadAssignedClientIdentifier()
{ {
return _body.ReadStringWithLengthPrefix(); return _body.ReadStringWithLengthPrefix();
@@ -133,6 +133,17 @@ namespace MQTTnet.Formatter.V5
Write(MqttPropertyId.ReceiveMaximum, value); 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) public void WriteMaximumPacketSize(uint? value)
{ {
WriteAsFourByteInteger(MqttPropertyId.MaximumPacketSize, value); WriteAsFourByteInteger(MqttPropertyId.MaximumPacketSize, value);
@@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using MQTTnet.Protocol;
namespace MQTTnet.Packets namespace MQTTnet.Packets
{ {
@@ -8,6 +9,8 @@ namespace MQTTnet.Packets
public ushort? ReceiveMaximum { get; set; } public ushort? ReceiveMaximum { get; set; }
public MqttQualityOfServiceLevel? MaximumQoS { get; set; }
public bool? RetainAvailable { get; set; } public bool? RetainAvailable { get; set; }
public uint? MaximumPacketSize { get; set; } public uint? MaximumPacketSize { get; set; }