mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-18 02:13:00 +08:00
Refactoring
This commit is contained in:
@@ -15,7 +15,7 @@ namespace MQTTnet.Core.Server
|
|||||||
public sealed class MqttClientSession : IDisposable
|
public sealed class MqttClientSession : IDisposable
|
||||||
{
|
{
|
||||||
private readonly HashSet<ushort> _unacknowledgedPublishPackets = new HashSet<ushort>();
|
private readonly HashSet<ushort> _unacknowledgedPublishPackets = new HashSet<ushort>();
|
||||||
|
|
||||||
private readonly MqttClientSubscriptionsManager _subscriptionsManager = new MqttClientSubscriptionsManager();
|
private readonly MqttClientSubscriptionsManager _subscriptionsManager = new MqttClientSubscriptionsManager();
|
||||||
private readonly MqttClientSessionsManager _mqttClientSessionsManager;
|
private readonly MqttClientSessionsManager _mqttClientSessionsManager;
|
||||||
private readonly MqttClientPendingMessagesQueue _pendingMessagesQueue;
|
private readonly MqttClientPendingMessagesQueue _pendingMessagesQueue;
|
||||||
@@ -186,34 +186,40 @@ namespace MQTTnet.Core.Server
|
|||||||
await _mqttClientSessionsManager.RetainedMessagesManager.HandleMessageAsync(ClientId, publishPacket);
|
await _mqttClientSessionsManager.RetainedMessagesManager.HandleMessageAsync(ClientId, publishPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (publishPacket.QualityOfServiceLevel == MqttQualityOfServiceLevel.AtMostOnce)
|
switch (publishPacket.QualityOfServiceLevel)
|
||||||
{
|
{
|
||||||
_mqttClientSessionsManager.DispatchPublishPacket(this, publishPacket);
|
case MqttQualityOfServiceLevel.AtMostOnce:
|
||||||
return;
|
{
|
||||||
|
_mqttClientSessionsManager.DispatchPublishPacket(this, publishPacket);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case MqttQualityOfServiceLevel.AtLeastOnce:
|
||||||
|
{
|
||||||
|
_mqttClientSessionsManager.DispatchPublishPacket(this, publishPacket);
|
||||||
|
|
||||||
|
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token,
|
||||||
|
new MqttPubAckPacket { PacketIdentifier = publishPacket.PacketIdentifier });
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case MqttQualityOfServiceLevel.ExactlyOnce:
|
||||||
|
{
|
||||||
|
// QoS 2 is implement as method "B" [4.3.3 QoS 2: Exactly once delivery]
|
||||||
|
lock (_unacknowledgedPublishPackets)
|
||||||
|
{
|
||||||
|
_unacknowledgedPublishPackets.Add(publishPacket.PacketIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
_mqttClientSessionsManager.DispatchPublishPacket(this, publishPacket);
|
||||||
|
|
||||||
|
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token,
|
||||||
|
new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier });
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
throw new MqttCommunicationException("Received a not supported QoS level.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (publishPacket.QualityOfServiceLevel == MqttQualityOfServiceLevel.AtLeastOnce)
|
|
||||||
{
|
|
||||||
_mqttClientSessionsManager.DispatchPublishPacket(this, publishPacket);
|
|
||||||
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, new MqttPubAckPacket { PacketIdentifier = publishPacket.PacketIdentifier });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (publishPacket.QualityOfServiceLevel == MqttQualityOfServiceLevel.ExactlyOnce)
|
|
||||||
{
|
|
||||||
// QoS 2 is implement as method "B" [4.3.3 QoS 2: Exactly once delivery]
|
|
||||||
lock (_unacknowledgedPublishPackets)
|
|
||||||
{
|
|
||||||
_unacknowledgedPublishPackets.Add(publishPacket.PacketIdentifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
_mqttClientSessionsManager.DispatchPublishPacket(this, publishPacket);
|
|
||||||
|
|
||||||
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new MqttCommunicationException("Received a not supported QoS level.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task HandleIncomingPubRelPacketAsync(IMqttCommunicationAdapter adapter, MqttPubRelPacket pubRelPacket)
|
private Task HandleIncomingPubRelPacketAsync(IMqttCommunicationAdapter adapter, MqttPubRelPacket pubRelPacket)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ namespace MQTTnet.Core.Server
|
|||||||
{
|
{
|
||||||
public static class MqttTopicFilterComparer
|
public static class MqttTopicFilterComparer
|
||||||
{
|
{
|
||||||
private const char TopicLevelSeparator = '/';
|
private static readonly char[] TopicLevelSeparator = { '/' };
|
||||||
|
|
||||||
public static bool IsMatch(string topic, string filter)
|
public static bool IsMatch(string topic, string filter)
|
||||||
{
|
{
|
||||||
@@ -16,19 +16,15 @@ namespace MQTTnet.Core.Server
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var fragmentsTopic = topic.Split(new[] { TopicLevelSeparator }, StringSplitOptions.None);
|
var fragmentsTopic = topic.Split(TopicLevelSeparator, StringSplitOptions.None);
|
||||||
var fragmentsFilter = filter.Split(new[] { TopicLevelSeparator }, StringSplitOptions.None);
|
var fragmentsFilter = filter.Split(TopicLevelSeparator, StringSplitOptions.None);
|
||||||
|
|
||||||
for (var i = 0; i < fragmentsFilter.Length; i++)
|
for (var i = 0; i < fragmentsFilter.Length; i++)
|
||||||
{
|
{
|
||||||
if (fragmentsFilter[i] == "+")
|
switch (fragmentsFilter[i])
|
||||||
{
|
{
|
||||||
continue;
|
case "+": continue;
|
||||||
}
|
case "#" when i == fragmentsFilter.Length - 1: return true;
|
||||||
|
|
||||||
if (fragmentsFilter[i] == "#" && i == fragmentsFilter.Length - 1)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= fragmentsTopic.Length)
|
if (i >= fragmentsTopic.Length)
|
||||||
@@ -36,18 +32,13 @@ namespace MQTTnet.Core.Server
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.Equals(fragmentsFilter[i], fragmentsTopic[i]))
|
if (!string.Equals(fragmentsFilter[i], fragmentsTopic[i], StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fragmentsTopic.Length > fragmentsFilter.Length)
|
return fragmentsTopic.Length <= fragmentsFilter.Length;
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user