Restore interfaces.

This commit is contained in:
Christian
2022-04-05 20:00:49 +02:00
parent cf2974cd34
commit 7cf454952f
31 changed files with 293 additions and 137 deletions
@@ -37,8 +37,8 @@ namespace MQTTnet.Benchmarks
CancellationTokenSource _cancellationTokenSource; CancellationTokenSource _cancellationTokenSource;
MqttServer _mqttServer; MqttServer _mqttServer;
List<MQTTnet.Client.MqttClient> _mqttSubscriberClients; List<IMqttClient> _mqttSubscriberClients;
Dictionary<string, MQTTnet.Client.MqttClient> _mqttPublisherClientsByPublisherName; Dictionary<string, IMqttClient> _mqttPublisherClientsByPublisherName;
Dictionary<string, List<string>> _topicsByPublisher; Dictionary<string, List<string>> _topicsByPublisher;
Dictionary<string, string> _publisherByTopic; Dictionary<string, string> _publisherByTopic;
@@ -74,7 +74,7 @@ namespace MQTTnet.Benchmarks
_mqttServer.StartAsync().GetAwaiter().GetResult(); _mqttServer.StartAsync().GetAwaiter().GetResult();
// Create publisher clients // Create publisher clients
_mqttPublisherClientsByPublisherName = new Dictionary<string, MQTTnet.Client.MqttClient>(); _mqttPublisherClientsByPublisherName = new Dictionary<string, IMqttClient>();
foreach (var pt in _topicsByPublisher) foreach (var pt in _topicsByPublisher)
{ {
var publisherName = pt.Key; var publisherName = pt.Key;
@@ -89,7 +89,7 @@ namespace MQTTnet.Benchmarks
} }
// Create subscriber clients // Create subscriber clients
_mqttSubscriberClients = new List<MQTTnet.Client.MqttClient>(); _mqttSubscriberClients = new List<IMqttClient>();
for (var i = 0; i < NumSubscribers; i++) for (var i = 0; i < NumSubscribers; i++)
{ {
var mqttSubscriberClient = factory.CreateMqttClient(); var mqttSubscriberClient = factory.CreateMqttClient();
@@ -16,7 +16,7 @@ namespace MQTTnet.Benchmarks
public class MessageProcessingBenchmark public class MessageProcessingBenchmark
{ {
MqttServer _mqttServer; MqttServer _mqttServer;
MqttClient _mqttClient; IMqttClient _mqttClient;
MqttApplicationMessage _message; MqttApplicationMessage _message;
[GlobalSetup] [GlobalSetup]
@@ -18,7 +18,7 @@ namespace MQTTnet.Benchmarks
public class MessageProcessingMqttConnectionContextBenchmark public class MessageProcessingMqttConnectionContextBenchmark
{ {
IWebHost _host; IWebHost _host;
MqttClient _mqttClient; IMqttClient _mqttClient;
MqttApplicationMessage _message; MqttApplicationMessage _message;
[GlobalSetup] [GlobalSetup]
@@ -11,7 +11,7 @@ namespace MQTTnet.Benchmarks
public class SubscribeBenchmark public class SubscribeBenchmark
{ {
MqttServer _mqttServer; MqttServer _mqttServer;
MQTTnet.Client.MqttClient _mqttClient; IMqttClient _mqttClient;
const int NumPublishers = 1; const int NumPublishers = 1;
const int NumTopicsPerPublisher = 10000; const int NumTopicsPerPublisher = 10000;
@@ -54,6 +54,7 @@ namespace MQTTnet.Benchmarks
var subscribeOptions = new MqttClientSubscribeOptionsBuilder() var subscribeOptions = new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(topic, Protocol.MqttQualityOfServiceLevel.AtMostOnce) .WithTopicFilter(topic, Protocol.MqttQualityOfServiceLevel.AtMostOnce)
.Build(); .Build();
_mqttClient.SubscribeAsync(subscribeOptions).GetAwaiter().GetResult(); _mqttClient.SubscribeAsync(subscribeOptions).GetAwaiter().GetResult();
} }
} }
@@ -1,5 +1,4 @@
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using MQTTnet.Client; using MQTTnet.Client;
using MQTTnet.Server; using MQTTnet.Server;
using System.Collections.Generic; using System.Collections.Generic;
@@ -11,7 +10,7 @@ namespace MQTTnet.Benchmarks
public class UnsubscribeBenchmark public class UnsubscribeBenchmark
{ {
MqttServer _mqttServer; MqttServer _mqttServer;
MQTTnet.Client.MqttClient _mqttClient; IMqttClient _mqttClient;
const int NumPublishers = 1; const int NumPublishers = 1;
const int NumTopicsPerPublisher = 10000; const int NumTopicsPerPublisher = 10000;
@@ -40,7 +39,7 @@ namespace MQTTnet.Benchmarks
foreach (var topic in _topics) foreach (var topic in _topics)
{ {
var subscribeOptions = new MqttClientSubscribeOptionsBuilder() var subscribeOptions = new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(topic, Protocol.MqttQualityOfServiceLevel.AtMostOnce) .WithTopicFilter(topic)
.Build(); .Build();
_mqttClient.SubscribeAsync(subscribeOptions).GetAwaiter().GetResult(); _mqttClient.SubscribeAsync(subscribeOptions).GetAwaiter().GetResult();
} }
@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Client;
using MQTTnet.Packets;
namespace MQTTnet.Extensions.ManagedClient
{
public interface IManagedMqttClient : IDisposable
{
event Func<ApplicationMessageProcessedEventArgs, Task> ApplicationMessageProcessedAsync;
event Func<MqttApplicationMessageReceivedEventArgs, Task> ApplicationMessageReceivedAsync;
event Func<EventArgs, Task> ConnectedAsync;
event Func<ConnectingFailedEventArgs, Task> ConnectingFailedAsync;
event Func<EventArgs, Task> ConnectionStateChangedAsync;
event Func<EventArgs, Task> DisconnectedAsync;
IApplicationMessageSkippedHandler ApplicationMessageSkippedHandler { get; set; }
IMqttClient InternalClient { get; }
bool IsConnected { get; }
bool IsStarted { get; }
ManagedMqttClientOptions Options { get; }
int PendingApplicationMessagesCount { get; }
ISynchronizingSubscriptionsFailedHandler SynchronizingSubscriptionsFailedHandler { get; set; }
Task EnqueueAsync(MqttApplicationMessage applicationMessage);
Task EnqueueAsync(ManagedMqttApplicationMessage applicationMessage);
Task PingAsync(CancellationToken cancellationToken = default);
Task StartAsync(ManagedMqttClientOptions options);
Task StopAsync();
Task SubscribeAsync(ICollection<MqttTopicFilter> topicFilters);
Task UnsubscribeAsync(ICollection<string> topics);
}
}
@@ -14,11 +14,10 @@ using MQTTnet.Internal;
using MQTTnet.Packets; using MQTTnet.Packets;
using MQTTnet.Protocol; using MQTTnet.Protocol;
using MQTTnet.Server; using MQTTnet.Server;
using MqttClient = MQTTnet.Client.MqttClient;
namespace MQTTnet.Extensions.ManagedClient namespace MQTTnet.Extensions.ManagedClient
{ {
public sealed class ManagedMqttClient : Disposable public sealed class ManagedMqttClient : Disposable, IManagedMqttClient
{ {
readonly AsyncEvent<ApplicationMessageProcessedEventArgs> _applicationMessageProcessedEvent = new AsyncEvent<ApplicationMessageProcessedEventArgs>(); readonly AsyncEvent<ApplicationMessageProcessedEventArgs> _applicationMessageProcessedEvent = new AsyncEvent<ApplicationMessageProcessedEventArgs>();
readonly AsyncEvent<ConnectingFailedEventArgs> _connectingFailedEvent = new AsyncEvent<ConnectingFailedEventArgs>(); readonly AsyncEvent<ConnectingFailedEventArgs> _connectingFailedEvent = new AsyncEvent<ConnectingFailedEventArgs>();
@@ -62,7 +61,7 @@ namespace MQTTnet.Extensions.ManagedClient
ManagedMqttClientStorageManager _storageManager; ManagedMqttClientStorageManager _storageManager;
public ManagedMqttClient(MqttClient mqttClient, IMqttNetLogger logger) public ManagedMqttClient(IMqttClient mqttClient, IMqttNetLogger logger)
{ {
InternalClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient)); InternalClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
@@ -112,7 +111,7 @@ namespace MQTTnet.Extensions.ManagedClient
public IApplicationMessageSkippedHandler ApplicationMessageSkippedHandler { get; set; } public IApplicationMessageSkippedHandler ApplicationMessageSkippedHandler { get; set; }
public MqttClient InternalClient { get; } public IMqttClient InternalClient { get; }
public bool IsConnected => InternalClient.IsConnected; public bool IsConnected => InternalClient.IsConnected;
@@ -203,7 +202,7 @@ namespace MQTTnet.Extensions.ManagedClient
} }
} }
public Task PingAsync(CancellationToken cancellationToken) public Task PingAsync(CancellationToken cancellationToken = default)
{ {
return InternalClient.PingAsync(cancellationToken); return InternalClient.PingAsync(cancellationToken);
} }
@@ -13,7 +13,7 @@ namespace MQTTnet.Extensions.ManagedClient
public static class ManagedMqttClientExtensions public static class ManagedMqttClientExtensions
{ {
public static Task EnqueueAsync( public static Task EnqueueAsync(
this ManagedMqttClient managedMqttClient, this IManagedMqttClient managedMqttClient,
string topic, string topic,
string payload = null, string payload = null,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
@@ -39,7 +39,7 @@ namespace MQTTnet.Extensions.ManagedClient
} }
public static Task SubscribeAsync( public static Task SubscribeAsync(
this ManagedMqttClient managedMqttClient, this IManagedMqttClient managedMqttClient,
string topic, string topic,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce) MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce)
{ {
@@ -60,7 +60,7 @@ namespace MQTTnet.Extensions.ManagedClient
}); });
} }
public static Task UnsubscribeAsync(this ManagedMqttClient managedMqttClient, string topic) public static Task UnsubscribeAsync(this IManagedMqttClient managedMqttClient, string topic)
{ {
if (managedMqttClient == null) if (managedMqttClient == null)
{ {
@@ -10,7 +10,7 @@ namespace MQTTnet.Extensions.ManagedClient
{ {
public static class MqttFactoryExtensions public static class MqttFactoryExtensions
{ {
public static ManagedMqttClient CreateManagedMqttClient(this MqttFactory factory, MqttClient mqttClient = null) public static IManagedMqttClient CreateManagedMqttClient(this MqttFactory factory, IMqttClient mqttClient = null)
{ {
if (factory == null) throw new ArgumentNullException(nameof(factory)); if (factory == null) throw new ArgumentNullException(nameof(factory));
@@ -22,7 +22,7 @@ namespace MQTTnet.Extensions.ManagedClient
return new ManagedMqttClient(mqttClient, factory.DefaultLogger); return new ManagedMqttClient(mqttClient, factory.DefaultLogger);
} }
public static ManagedMqttClient CreateManagedMqttClient(this MqttFactory factory, IMqttNetLogger logger) public static IManagedMqttClient CreateManagedMqttClient(this MqttFactory factory, IMqttNetLogger logger)
{ {
if (factory == null) throw new ArgumentNullException(nameof(factory)); if (factory == null) throw new ArgumentNullException(nameof(factory));
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null) throw new ArgumentNullException(nameof(logger));
@@ -0,0 +1,14 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Protocol;
namespace MQTTnet.Extensions.Rpc
{
public interface IMqttRpcClient : IDisposable
{
Task<byte[]> ExecuteAsync(TimeSpan timeout, string methodName, byte[] payload, MqttQualityOfServiceLevel qualityOfServiceLevel);
Task<byte[]> ExecuteAsync(string methodName, byte[] payload, MqttQualityOfServiceLevel qualityOfServiceLevel, CancellationToken cancellationToken = default);
}
}
@@ -9,7 +9,7 @@ namespace MQTTnet.Extensions.Rpc
{ {
public static class MqttFactoryExtensions public static class MqttFactoryExtensions
{ {
public static MqttRpcClient CreateMqttRpcClient(this MqttFactory factory, MqttClient mqttClient) public static IMqttRpcClient CreateMqttRpcClient(this MqttFactory factory, IMqttClient mqttClient)
{ {
return factory.CreateMqttRpcClient(mqttClient, new MqttRpcClientOptions return factory.CreateMqttRpcClient(mqttClient, new MqttRpcClientOptions
{ {
@@ -17,10 +17,8 @@ namespace MQTTnet.Extensions.Rpc
}); });
} }
public static MqttRpcClient CreateMqttRpcClient(this MqttFactory factory, MqttClient mqttClient, MqttRpcClientOptions rpcClientOptions) public static IMqttRpcClient CreateMqttRpcClient(this MqttFactory _, IMqttClient mqttClient, MqttRpcClientOptions rpcClientOptions)
{ {
if (factory == null) throw new ArgumentNullException(nameof(factory));
if (mqttClient == null) if (mqttClient == null)
{ {
throw new ArgumentNullException(nameof(mqttClient)); throw new ArgumentNullException(nameof(mqttClient));
@@ -13,13 +13,13 @@ using MQTTnet.Implementations;
namespace MQTTnet.Extensions.Rpc namespace MQTTnet.Extensions.Rpc
{ {
public sealed class MqttRpcClient : IDisposable public sealed class MqttRpcClient : IMqttRpcClient
{ {
readonly ConcurrentDictionary<string, TaskCompletionSource<byte[]>> _waitingCalls = new ConcurrentDictionary<string, TaskCompletionSource<byte[]>>(); readonly ConcurrentDictionary<string, TaskCompletionSource<byte[]>> _waitingCalls = new ConcurrentDictionary<string, TaskCompletionSource<byte[]>>();
readonly MqttClient _mqttClient; readonly IMqttClient _mqttClient;
readonly MqttRpcClientOptions _options; readonly MqttRpcClientOptions _options;
public MqttRpcClient(MqttClient mqttClient, MqttRpcClientOptions options) public MqttRpcClient(IMqttClient mqttClient, MqttRpcClientOptions options)
{ {
_mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient)); _mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
_options = options ?? throw new ArgumentNullException(nameof(options)); _options = options ?? throw new ArgumentNullException(nameof(options));
@@ -47,7 +47,7 @@ namespace MQTTnet.Extensions.Rpc
} }
} }
public async Task<byte[]> ExecuteAsync(string methodName, byte[] payload, MqttQualityOfServiceLevel qualityOfServiceLevel, CancellationToken cancellationToken) public async Task<byte[]> ExecuteAsync(string methodName, byte[] payload, MqttQualityOfServiceLevel qualityOfServiceLevel, CancellationToken cancellationToken = default)
{ {
if (methodName == null) throw new ArgumentNullException(nameof(methodName)); if (methodName == null) throw new ArgumentNullException(nameof(methodName));
@@ -11,7 +11,7 @@ namespace MQTTnet.Extensions.Rpc
{ {
public static class MqttRpcClientExtensions public static class MqttRpcClientExtensions
{ {
public static Task<byte[]> ExecuteAsync(this MqttRpcClient client, TimeSpan timeout, string methodName, string payload, MqttQualityOfServiceLevel qualityOfServiceLevel) public static Task<byte[]> ExecuteAsync(this IMqttRpcClient client, TimeSpan timeout, string methodName, string payload, MqttQualityOfServiceLevel qualityOfServiceLevel)
{ {
if (client == null) throw new ArgumentNullException(nameof(client)); if (client == null) throw new ArgumentNullException(nameof(client));
@@ -21,7 +21,7 @@ namespace MQTTnet.Extensions.Rpc
/// </summary> /// </summary>
public MqttQualityOfServiceLevel QualityOfServiceLevel { get; set; } public MqttQualityOfServiceLevel QualityOfServiceLevel { get; set; }
public MqttClient MqttClient { get; set; } public IMqttClient MqttClient { get; set; }
public MqttRpcClientOptions Options { get; set; } public MqttRpcClientOptions Options { get; set; }
} }
+17 -20
View File
@@ -33,8 +33,8 @@ namespace MQTTnet.TestApp
CancellationTokenSource _cancellationTokenSource; CancellationTokenSource _cancellationTokenSource;
MqttServer _mqttServer; MqttServer _mqttServer;
Dictionary<string, Client.MqttClient> _mqttPublisherClientsByPublisherName; Dictionary<string, IMqttClient> _mqttPublisherClientsByPublisherName;
List<Client.MqttClient> _mqttSubscriberClients; List<IMqttClient> _mqttSubscriberClients;
Dictionary<string, List<string>> _topicsByPublisher; Dictionary<string, List<string>> _topicsByPublisher;
Dictionary<string, List<string>> _singleWildcardTopicsByPublisher; Dictionary<string, List<string>> _singleWildcardTopicsByPublisher;
@@ -85,7 +85,7 @@ namespace MQTTnet.TestApp
var stopWatch = new System.Diagnostics.Stopwatch(); var stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start(); stopWatch.Start();
_mqttPublisherClientsByPublisherName = new Dictionary<string, Client.MqttClient>(); _mqttPublisherClientsByPublisherName = new Dictionary<string, IMqttClient>();
foreach (var pt in _topicsByPublisher) foreach (var pt in _topicsByPublisher)
{ {
var publisherName = pt.Key; var publisherName = pt.Key;
@@ -99,10 +99,10 @@ namespace MQTTnet.TestApp
} }
stopWatch.Stop(); stopWatch.Stop();
Console.Write(string.Format("{0} publisher(s) connected in {1:0.000} seconds, ", NumPublishers, stopWatch.ElapsedMilliseconds / 1000.0)); Console.Write($"{NumPublishers} publisher(s) connected in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
Console.WriteLine(string.Format("connections per second: {0:0.000}", NumPublishers / (stopWatch.ElapsedMilliseconds / 1000.0))); Console.WriteLine($"connections per second: {NumPublishers / (stopWatch.ElapsedMilliseconds / 1000.0):0.000}");
_mqttSubscriberClients = new List<Client.MqttClient>(); _mqttSubscriberClients = new List<IMqttClient>();
for (var i = 0; i < NumSubscribers; ++i) for (var i = 0; i < NumSubscribers; ++i)
{ {
var mqttClient = factory.CreateMqttClient(); var mqttClient = factory.CreateMqttClient();
@@ -147,7 +147,6 @@ namespace MQTTnet.TestApp
_mqttServer.Dispose(); _mqttServer.Dispose();
} }
/// <summary> /// <summary>
/// Measure no-wildcard topic subscription message exchange performance /// Measure no-wildcard topic subscription message exchange performance
/// </summary> /// </summary>
@@ -174,16 +173,16 @@ namespace MQTTnet.TestApp
/// <summary> /// <summary>
/// Subcribe to all topics, then run message exchange /// Subscribe to all topics, then run message exchange
/// </summary> /// </summary>
public async Task ProcessMessages(Dictionary<string, List<string>> topicsByPublisher, string topicTypeDescription) public async Task ProcessMessages(Dictionary<string, List<string>> topicsByPublisher, string topicTypeDescription)
{ {
var numTopics = CountTopics(topicsByPublisher); var numTopics = CountTopics(topicsByPublisher);
Console.WriteLine(); Console.WriteLine();
Console.Write(string.Format("Subscribing to {0} topics ", numTopics)); Console.Write($"Subscribing to {numTopics} topics ");
ConsoleWriteInfo(string.Format("({0})", topicTypeDescription)); ConsoleWriteInfo($"({topicTypeDescription})");
Console.WriteLine(string.Format(" for {0} subscriber(s)...", NumSubscribers)); Console.WriteLine($" for {NumSubscribers} subscriber(s)...");
var stopWatch = new System.Diagnostics.Stopwatch(); var stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start(); stopWatch.Start();
@@ -204,12 +203,12 @@ namespace MQTTnet.TestApp
stopWatch.Stop(); stopWatch.Stop();
Console.Write(string.Format("{0} subscriber(s) subscribed in {1:0.000} seconds, ", NumSubscribers, stopWatch.ElapsedMilliseconds / 1000.0)); Console.Write($"{NumSubscribers} subscriber(s) subscribed in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
Console.WriteLine(string.Format("subscribe calls per second: {0:0.000}", numTopics / (stopWatch.ElapsedMilliseconds / 1000.0))); Console.WriteLine($"subscribe calls per second: {numTopics / (stopWatch.ElapsedMilliseconds / 1000.0):0.000}");
await PublishAllAsync(); await PublishAllAsync();
Console.WriteLine(string.Format("Unsubscribing {0} topics ({1}) for {2} subscriber(s)...", numTopics, topicTypeDescription, NumSubscribers)); Console.WriteLine($"Unsubscribing {numTopics} topics ({topicTypeDescription}) for {NumSubscribers} subscriber(s)...");
stopWatch.Restart(); stopWatch.Restart();
@@ -234,11 +233,10 @@ namespace MQTTnet.TestApp
stopWatch.Stop(); stopWatch.Stop();
Console.Write(string.Format("{0} subscriber(s) unsubscribed in {1:0.000} seconds, ", NumSubscribers, stopWatch.ElapsedMilliseconds / 1000.0)); Console.Write($"{NumSubscribers} subscriber(s) unsubscribed in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
Console.WriteLine(string.Format("unsubscribe calls per second: {0:0.000}", numTopics / (stopWatch.ElapsedMilliseconds / 1000.0))); Console.WriteLine($"unsubscribe calls per second: {numTopics / (stopWatch.ElapsedMilliseconds / 1000.0):0.000}");
} }
/// <summary> /// <summary>
/// Publish messages in batches of NumPublishCallsPerBatch, wait for messages sent to subscriber /// Publish messages in batches of NumPublishCallsPerBatch, wait for messages sent to subscriber
/// </summary> /// </summary>
@@ -289,7 +287,6 @@ namespace MQTTnet.TestApp
} }
catch catch
{ {
} }
_cancellationTokenSource.Dispose(); _cancellationTokenSource.Dispose();
@@ -305,8 +302,8 @@ namespace MQTTnet.TestApp
stopWatch.Stop(); stopWatch.Stop();
System.Console.Write(string.Format("{0} messages published and received in {1:0.000} seconds, ", totalNumMessagesReceived, stopWatch.ElapsedMilliseconds / 1000.0)); Console.Write($"{totalNumMessagesReceived} messages published and received in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
ConsoleWriteLineSuccess(string.Format("messages per second: {0}", (int)(totalNumMessagesReceived / (stopWatch.ElapsedMilliseconds / 1000.0)))); ConsoleWriteLineSuccess($"messages per second: {(int)(totalNumMessagesReceived / (stopWatch.ElapsedMilliseconds / 1000.0))}");
} }
int CountTopics(Dictionary<string, List<string>> topicsByPublisher) int CountTopics(Dictionary<string, List<string>> topicsByPublisher)
+1 -1
View File
@@ -201,7 +201,7 @@ namespace MQTTnet.TestApp
}; };
} }
static Task PublishSingleMessage(MqttClient client, MqttApplicationMessage applicationMessage, ref int count) static Task PublishSingleMessage(IMqttClient client, MqttApplicationMessage applicationMessage, ref int count)
{ {
Interlocked.Increment(ref count); Interlocked.Increment(ref count);
return Task.Run(() => client.PublishAsync(applicationMessage)); return Task.Run(() => client.PublishAsync(applicationMessage));
@@ -177,7 +177,7 @@ namespace MQTTnet.Tests.Client
} }
} }
async Task<MqttConnAckPacket> Authenticate(LowLevelMqttClient client) async Task<MqttConnAckPacket> Authenticate(ILowLevelMqttClient client)
{ {
await client.SendAsync( await client.SendAsync(
new MqttConnectPacket new MqttConnectPacket
@@ -193,7 +193,7 @@ namespace MQTTnet.Tests.Client
return await client.ReceiveAsync(CancellationToken.None).ConfigureAwait(false) as MqttConnAckPacket; return await client.ReceiveAsync(CancellationToken.None).ConfigureAwait(false) as MqttConnAckPacket;
} }
async Task<MqttSubAckPacket> Subscribe(LowLevelMqttClient client, string topic) async Task<MqttSubAckPacket> Subscribe(ILowLevelMqttClient client, string topic)
{ {
await client.SendAsync( await client.SendAsync(
new MqttSubscribePacket new MqttSubscribePacket
@@ -389,7 +389,7 @@ namespace MQTTnet.Tests.Client
async Task<ManagedMqttClient> CreateManagedClientAsync( async Task<ManagedMqttClient> CreateManagedClientAsync(
TestEnvironment testEnvironment, TestEnvironment testEnvironment,
MqttClient underlyingClient = null, IMqttClient underlyingClient = null,
TimeSpan? connectionCheckInterval = null, TimeSpan? connectionCheckInterval = null,
string host = "localhost") string host = "localhost")
{ {
@@ -226,7 +226,7 @@ namespace MQTTnet.Tests.Client
{ {
await testEnvironment.StartServer(); await testEnvironment.StartServer();
var clients = new List<MqttClient>(); var clients = new List<IMqttClient>();
for (var i = 0; i < 100; i++) for (var i = 0; i < 100; i++)
{ {
clients.Add(await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("a"))); clients.Add(await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("a")));
@@ -204,7 +204,7 @@ namespace MQTTnet.Tests
{ {
var disconnectPacket = new MqttDisconnectPacket var disconnectPacket = new MqttDisconnectPacket
{ {
ReasonCode = MqttDisconnectReasonCode.NormalDisconnection, ReasonCode = MqttDisconnectReasonCode.NormalDisconnection, // MQTTv3 has no other values than this.
ReasonString = "ReasonString", ReasonString = "ReasonString",
ServerReference = "ServerReference", ServerReference = "ServerReference",
SessionExpiryInterval = 234, SessionExpiryInterval = 234,
@@ -216,7 +216,6 @@ namespace MQTTnet.Tests
var deserialized = MqttPacketSerializationHelper.EncodeAndDecodePacket(disconnectPacket, MqttProtocolVersion.V311); var deserialized = MqttPacketSerializationHelper.EncodeAndDecodePacket(disconnectPacket, MqttProtocolVersion.V311);
Assert.AreEqual(disconnectPacket.ReasonCode, deserialized.ReasonCode); Assert.AreEqual(disconnectPacket.ReasonCode, deserialized.ReasonCode);
Assert.AreEqual(null, deserialized.ReasonString); // Not supported in v3.1.1 Assert.AreEqual(null, deserialized.ReasonString); // Not supported in v3.1.1
Assert.AreEqual(null, deserialized.ServerReference); // Not supported in v3.1.1 Assert.AreEqual(null, deserialized.ServerReference); // Not supported in v3.1.1
@@ -166,7 +166,7 @@ namespace MQTTnet.Tests
{ {
var disconnectPacket = new MqttDisconnectPacket var disconnectPacket = new MqttDisconnectPacket
{ {
ReasonCode = MqttDisconnectReasonCode.NormalDisconnection, ReasonCode = MqttDisconnectReasonCode.QuotaExceeded,
ReasonString = "ReasonString", ReasonString = "ReasonString",
ServerReference = "ServerReference", ServerReference = "ServerReference",
SessionExpiryInterval = 234, SessionExpiryInterval = 234,
@@ -15,7 +15,7 @@ namespace MQTTnet.Tests.Mockups
{ {
readonly List<MqttApplicationMessageReceivedEventArgs> _receivedEventArgs = new List<MqttApplicationMessageReceivedEventArgs>(); readonly List<MqttApplicationMessageReceivedEventArgs> _receivedEventArgs = new List<MqttApplicationMessageReceivedEventArgs>();
public TestApplicationMessageReceivedHandler(MqttClient mqttClient) public TestApplicationMessageReceivedHandler(IMqttClient mqttClient)
{ {
mqttClient.ApplicationMessageReceivedAsync += MqttClientOnApplicationMessageReceivedAsync; mqttClient.ApplicationMessageReceivedAsync += MqttClientOnApplicationMessageReceivedAsync;
} }
+10 -11
View File
@@ -17,17 +17,16 @@ using MQTTnet.Implementations;
using MQTTnet.LowLevelClient; using MQTTnet.LowLevelClient;
using MQTTnet.Protocol; using MQTTnet.Protocol;
using MQTTnet.Server; using MQTTnet.Server;
using MqttClient = MQTTnet.Client.MqttClient;
namespace MQTTnet.Tests.Mockups namespace MQTTnet.Tests.Mockups
{ {
public sealed class TestEnvironment : IDisposable public sealed class TestEnvironment : IDisposable
{ {
readonly List<string> _clientErrors = new List<string>(); readonly List<string> _clientErrors = new List<string>();
readonly List<MqttClient> _clients = new List<MqttClient>(); readonly List<IMqttClient> _clients = new List<IMqttClient>();
readonly List<Exception> _exceptions = new List<Exception>(); readonly List<Exception> _exceptions = new List<Exception>();
readonly List<LowLevelMqttClient> _lowLevelClients = new List<LowLevelMqttClient>(); readonly List<ILowLevelMqttClient> _lowLevelClients = new List<ILowLevelMqttClient>();
readonly MqttProtocolVersion _protocolVersion; readonly MqttProtocolVersion _protocolVersion;
readonly List<string> _serverErrors = new List<string>(); readonly List<string> _serverErrors = new List<string>();
@@ -91,12 +90,12 @@ namespace MQTTnet.Tests.Mockups
public TestContext TestContext { get; } public TestContext TestContext { get; }
public Task<MqttClient> ConnectClient() public Task<IMqttClient> ConnectClient()
{ {
return ConnectClient(Factory.CreateClientOptionsBuilder().WithProtocolVersion(_protocolVersion)); return ConnectClient(Factory.CreateClientOptionsBuilder().WithProtocolVersion(_protocolVersion));
} }
public async Task<MqttClient> ConnectClient(Action<MqttClientOptionsBuilder> configureOptions, TimeSpan timeout = default) public async Task<IMqttClient> ConnectClient(Action<MqttClientOptionsBuilder> configureOptions, TimeSpan timeout = default)
{ {
if (configureOptions == null) if (configureOptions == null)
{ {
@@ -128,7 +127,7 @@ namespace MQTTnet.Tests.Mockups
return client; return client;
} }
public async Task<MqttClient> ConnectClient(MqttClientOptionsBuilder options, TimeSpan timeout = default) public async Task<IMqttClient> ConnectClient(MqttClientOptionsBuilder options, TimeSpan timeout = default)
{ {
if (options == null) if (options == null)
{ {
@@ -154,7 +153,7 @@ namespace MQTTnet.Tests.Mockups
return client; return client;
} }
public async Task<MqttClient> ConnectClient(MqttClientOptions options, TimeSpan timeout = default) public async Task<IMqttClient> ConnectClient(MqttClientOptions options, TimeSpan timeout = default)
{ {
if (options == null) if (options == null)
{ {
@@ -178,7 +177,7 @@ namespace MQTTnet.Tests.Mockups
return client; return client;
} }
public async Task<LowLevelMqttClient> ConnectLowLevelClient(Action<MqttClientOptionsBuilder> optionsBuilder = null) public async Task<ILowLevelMqttClient> ConnectLowLevelClient(Action<MqttClientOptionsBuilder> optionsBuilder = null)
{ {
var options = new MqttClientOptionsBuilder(); var options = new MqttClientOptionsBuilder();
options = options.WithTcpServer("127.0.0.1", ServerPort); options = options.WithTcpServer("127.0.0.1", ServerPort);
@@ -195,12 +194,12 @@ namespace MQTTnet.Tests.Mockups
return new MqttRpcClient(await ConnectClient(), options); return new MqttRpcClient(await ConnectClient(), options);
} }
public TestApplicationMessageReceivedHandler CreateApplicationMessageHandler(MqttClient mqttClient) public TestApplicationMessageReceivedHandler CreateApplicationMessageHandler(IMqttClient mqttClient)
{ {
return new TestApplicationMessageReceivedHandler(mqttClient); return new TestApplicationMessageReceivedHandler(mqttClient);
} }
public MqttClient CreateClient() public IMqttClient CreateClient()
{ {
lock (_clients) lock (_clients)
{ {
@@ -228,7 +227,7 @@ namespace MQTTnet.Tests.Mockups
} }
} }
public LowLevelMqttClient CreateLowLevelClient() public ILowLevelMqttClient CreateLowLevelClient()
{ {
lock (_clients) lock (_clients)
{ {
+2 -2
View File
@@ -277,7 +277,7 @@ namespace MQTTnet.Tests.Server
} }
} }
async Task<MqttClient> ConnectAndSubscribe(TestEnvironment testEnvironment, MqttClientOptionsBuilder options, Action onReceive) async Task<IMqttClient> ConnectAndSubscribe(TestEnvironment testEnvironment, MqttClientOptionsBuilder options, Action onReceive)
{ {
try try
{ {
@@ -302,7 +302,7 @@ namespace MQTTnet.Tests.Server
} }
} }
async Task<MqttClient> TryConnect(TestEnvironment testEnvironment, MqttClientOptionsBuilder options) async Task<IMqttClient> TryConnect(TestEnvironment testEnvironment, MqttClientOptionsBuilder options)
{ {
try try
{ {
+38
View File
@@ -0,0 +1,38 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Diagnostics;
namespace MQTTnet.Client
{
public interface IMqttClient : IDisposable
{
event Func<MqttClientConnectedEventArgs, Task> ConnectedAsync;
event Func<MqttClientConnectingEventArgs, Task> ConnectingAsync;
event Func<MqttClientDisconnectedEventArgs, Task> DisconnectedAsync;
event Func<MqttApplicationMessageReceivedEventArgs, Task> ApplicationMessageReceivedAsync;
event Func<InspectMqttPacketEventArgs, Task> InspectPackage;
bool IsConnected { get; }
MqttClientOptions Options { get; }
Task<MqttClientConnectResult> ConnectAsync(MqttClientOptions options, CancellationToken cancellationToken = default);
Task DisconnectAsync(MqttClientDisconnectOptions options, CancellationToken cancellationToken = default);
Task PingAsync(CancellationToken cancellationToken = default);
Task SendExtendedAuthenticationExchangeDataAsync(MqttExtendedAuthenticationExchangeData data, CancellationToken cancellationToken = default);
Task<MqttClientSubscribeResult> SubscribeAsync(MqttClientSubscribeOptions options, CancellationToken cancellationToken = default);
Task<MqttClientUnsubscribeResult> UnsubscribeAsync(MqttClientUnsubscribeOptions options, CancellationToken cancellationToken = default);
Task<MqttClientPublishResult> PublishAsync(MqttApplicationMessage applicationMessage, CancellationToken cancellationToken = default);
}
}
+1 -1
View File
@@ -17,7 +17,7 @@ using MQTTnet.Implementations;
namespace MQTTnet.Client namespace MQTTnet.Client
{ {
public sealed class MqttClient : Disposable public sealed class MqttClient : Disposable, IMqttClient
{ {
readonly MqttPacketFactories _packetFactories = new MqttPacketFactories(); readonly MqttPacketFactories _packetFactories = new MqttPacketFactories();
+10 -13
View File
@@ -14,7 +14,7 @@ namespace MQTTnet.Client
{ {
public static class MqttClientExtensions public static class MqttClientExtensions
{ {
public static Task DisconnectAsync(this MqttClient client, MqttClientDisconnectReason reason = MqttClientDisconnectReason.NormalDisconnection, string reasonString = null) public static Task DisconnectAsync(this IMqttClient client, MqttClientDisconnectReason reason = MqttClientDisconnectReason.NormalDisconnection, string reasonString = null)
{ {
if (client == null) if (client == null)
{ {
@@ -31,7 +31,7 @@ namespace MQTTnet.Client
} }
public static Task<MqttClientPublishResult> PublishBinaryAsync( public static Task<MqttClientPublishResult> PublishBinaryAsync(
this MqttClient mqttClient, this IMqttClient mqttClient,
string topic, string topic,
IEnumerable<byte> payload = null, IEnumerable<byte> payload = null,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
@@ -58,7 +58,7 @@ namespace MQTTnet.Client
} }
public static Task<MqttClientPublishResult> PublishStringAsync( public static Task<MqttClientPublishResult> PublishStringAsync(
this MqttClient mqttClient, this IMqttClient mqttClient,
string topic, string topic,
string payload = null, string payload = null,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
@@ -69,7 +69,7 @@ namespace MQTTnet.Client
return mqttClient.PublishBinaryAsync(topic, payloadBuffer, qualityOfServiceLevel, retain, cancellationToken); return mqttClient.PublishBinaryAsync(topic, payloadBuffer, qualityOfServiceLevel, retain, cancellationToken);
} }
public static Task SendExtendedAuthenticationExchangeDataAsync(this MqttClient client, MqttExtendedAuthenticationExchangeData data) public static Task SendExtendedAuthenticationExchangeDataAsync(this IMqttClient client, MqttExtendedAuthenticationExchangeData data)
{ {
if (client == null) if (client == null)
{ {
@@ -79,7 +79,7 @@ namespace MQTTnet.Client
return client.SendExtendedAuthenticationExchangeDataAsync(data, CancellationToken.None); return client.SendExtendedAuthenticationExchangeDataAsync(data, CancellationToken.None);
} }
public static Task<MqttClientSubscribeResult> SubscribeAsync(this MqttClient mqttClient, MqttTopicFilter topicFilter, CancellationToken cancellationToken = default) public static Task<MqttClientSubscribeResult> SubscribeAsync(this IMqttClient mqttClient, MqttTopicFilter topicFilter, CancellationToken cancellationToken = default)
{ {
if (mqttClient == null) if (mqttClient == null)
{ {
@@ -91,14 +91,13 @@ namespace MQTTnet.Client
throw new ArgumentNullException(nameof(topicFilter)); throw new ArgumentNullException(nameof(topicFilter));
} }
var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topicFilter) var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topicFilter).Build();
.Build();
return mqttClient.SubscribeAsync(subscribeOptions, cancellationToken); return mqttClient.SubscribeAsync(subscribeOptions, cancellationToken);
} }
public static Task<MqttClientSubscribeResult> SubscribeAsync( public static Task<MqttClientSubscribeResult> SubscribeAsync(
this MqttClient mqttClient, this IMqttClient mqttClient,
string topic, string topic,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
@@ -113,13 +112,12 @@ namespace MQTTnet.Client
throw new ArgumentNullException(nameof(topic)); throw new ArgumentNullException(nameof(topic));
} }
var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topic, qualityOfServiceLevel) var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topic, qualityOfServiceLevel).Build();
.Build();
return mqttClient.SubscribeAsync(subscribeOptions, cancellationToken); return mqttClient.SubscribeAsync(subscribeOptions, cancellationToken);
} }
public static Task<MqttClientUnsubscribeResult> UnsubscribeAsync(this MqttClient mqttClient, string topic, CancellationToken cancellationToken = default) public static Task<MqttClientUnsubscribeResult> UnsubscribeAsync(this IMqttClient mqttClient, string topic, CancellationToken cancellationToken = default)
{ {
if (mqttClient == null) if (mqttClient == null)
{ {
@@ -131,8 +129,7 @@ namespace MQTTnet.Client
throw new ArgumentNullException(nameof(topic)); throw new ArgumentNullException(nameof(topic));
} }
var unsubscribeOptions = new MqttClientUnsubscribeOptionsBuilder().WithTopicFilter(topic) var unsubscribeOptions = new MqttClientUnsubscribeOptionsBuilder().WithTopicFilter(topic).Build();
.Build();
return mqttClient.UnsubscribeAsync(unsubscribeOptions, cancellationToken); return mqttClient.UnsubscribeAsync(unsubscribeOptions, cancellationToken);
} }
@@ -0,0 +1,24 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Client;
using MQTTnet.Diagnostics;
using MQTTnet.Packets;
namespace MQTTnet.LowLevelClient
{
public interface ILowLevelMqttClient : IDisposable
{
event Func<InspectMqttPacketEventArgs, Task> InspectPackage;
bool IsConnected { get; }
Task ConnectAsync(MqttClientOptions options, CancellationToken cancellationToken = default);
Task DisconnectAsync(CancellationToken cancellationToken = default);
Task<MqttPacket> ReceiveAsync(CancellationToken cancellationToken = default);
Task SendAsync(MqttPacket packet, CancellationToken cancellationToken = default);
}
}
@@ -14,7 +14,7 @@ using MQTTnet.Packets;
namespace MQTTnet.LowLevelClient namespace MQTTnet.LowLevelClient
{ {
public sealed class LowLevelMqttClient : IDisposable public sealed class LowLevelMqttClient : ILowLevelMqttClient
{ {
readonly IMqttClientAdapterFactory _clientAdapterFactory; readonly IMqttClientAdapterFactory _clientAdapterFactory;
readonly AsyncEvent<InspectMqttPacketEventArgs> _inspectPacketEvent = new AsyncEvent<InspectMqttPacketEventArgs>(); readonly AsyncEvent<InspectMqttPacketEventArgs> _inspectPacketEvent = new AsyncEvent<InspectMqttPacketEventArgs>();
+87 -48
View File
@@ -2,15 +2,15 @@
// The .NET Foundation licenses this file to you under the MIT license. // The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using MQTTnet.Adapter;
using MQTTnet.Client;
using MQTTnet.Implementations;
using MQTTnet.LowLevelClient;
using MQTTnet.Server;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MQTTnet.Adapter;
using MQTTnet.Client;
using MQTTnet.Diagnostics; using MQTTnet.Diagnostics;
using MQTTnet.Implementations;
using MQTTnet.LowLevelClient;
using MQTTnet.Server;
using MqttClient = MQTTnet.Client.MqttClient; using MqttClient = MQTTnet.Client.MqttClient;
namespace MQTTnet namespace MQTTnet
@@ -26,7 +26,7 @@ namespace MQTTnet
public MqttFactory(IMqttNetLogger logger) public MqttFactory(IMqttNetLogger logger)
{ {
DefaultLogger = logger ?? throw new ArgumentNullException(nameof(logger)); DefaultLogger = logger ?? throw new ArgumentNullException(nameof(logger));
_clientAdapterFactory = new MqttClientAdapterFactory(); _clientAdapterFactory = new MqttClientAdapterFactory();
} }
@@ -39,62 +39,97 @@ namespace MQTTnet
public IDictionary<object, object> Properties { get; } = new Dictionary<object, object>(); public IDictionary<object, object> Properties { get; } = new Dictionary<object, object>();
public MqttFactory UseClientAdapterFactory(IMqttClientAdapterFactory clientAdapterFactory) public MqttApplicationMessageBuilder CreateApplicationMessageBuilder()
{ {
_clientAdapterFactory = clientAdapterFactory ?? throw new ArgumentNullException(nameof(clientAdapterFactory)); return new MqttApplicationMessageBuilder();
return this;
} }
public LowLevelMqttClient CreateLowLevelMqttClient() public MqttClientDisconnectOptionsBuilder CreateClientDisconnectOptionsBuilder()
{
return new MqttClientDisconnectOptionsBuilder();
}
public MqttClientOptionsBuilder CreateClientOptionsBuilder()
{
return new MqttClientOptionsBuilder();
}
public ILowLevelMqttClient CreateLowLevelMqttClient()
{ {
return CreateLowLevelMqttClient(DefaultLogger); return CreateLowLevelMqttClient(DefaultLogger);
} }
public LowLevelMqttClient CreateLowLevelMqttClient(IMqttNetLogger logger) public ILowLevelMqttClient CreateLowLevelMqttClient(IMqttNetLogger logger)
{ {
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
return new LowLevelMqttClient(_clientAdapterFactory, logger); return new LowLevelMqttClient(_clientAdapterFactory, logger);
} }
public LowLevelMqttClient CreateLowLevelMqttClient(IMqttClientAdapterFactory clientAdapterFactory) public ILowLevelMqttClient CreateLowLevelMqttClient(IMqttClientAdapterFactory clientAdapterFactory)
{ {
if (clientAdapterFactory == null) throw new ArgumentNullException(nameof(clientAdapterFactory)); if (clientAdapterFactory == null)
{
throw new ArgumentNullException(nameof(clientAdapterFactory));
}
return new LowLevelMqttClient(_clientAdapterFactory, DefaultLogger); return new LowLevelMqttClient(_clientAdapterFactory, DefaultLogger);
} }
public LowLevelMqttClient CreateLowLevelMqttClient(IMqttNetLogger logger, IMqttClientAdapterFactory clientAdapterFactory) public ILowLevelMqttClient CreateLowLevelMqttClient(IMqttNetLogger logger, IMqttClientAdapterFactory clientAdapterFactory)
{ {
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null)
if (clientAdapterFactory == null) throw new ArgumentNullException(nameof(clientAdapterFactory)); {
throw new ArgumentNullException(nameof(logger));
}
if (clientAdapterFactory == null)
{
throw new ArgumentNullException(nameof(clientAdapterFactory));
}
return new LowLevelMqttClient(_clientAdapterFactory, logger); return new LowLevelMqttClient(_clientAdapterFactory, logger);
} }
public MqttClient CreateMqttClient() public IMqttClient CreateMqttClient()
{ {
return CreateMqttClient(DefaultLogger); return CreateMqttClient(DefaultLogger);
} }
public MqttClient CreateMqttClient(IMqttNetLogger logger) public IMqttClient CreateMqttClient(IMqttNetLogger logger)
{ {
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
return new MqttClient(_clientAdapterFactory, logger); return new MqttClient(_clientAdapterFactory, logger);
} }
public MqttClient CreateMqttClient(IMqttClientAdapterFactory clientAdapterFactory) public IMqttClient CreateMqttClient(IMqttClientAdapterFactory clientAdapterFactory)
{ {
if (clientAdapterFactory == null) throw new ArgumentNullException(nameof(clientAdapterFactory)); if (clientAdapterFactory == null)
{
throw new ArgumentNullException(nameof(clientAdapterFactory));
}
return new MqttClient(clientAdapterFactory, DefaultLogger); return new MqttClient(clientAdapterFactory, DefaultLogger);
} }
public MqttClient CreateMqttClient(IMqttNetLogger logger, IMqttClientAdapterFactory clientAdapterFactory) public IMqttClient CreateMqttClient(IMqttNetLogger logger, IMqttClientAdapterFactory clientAdapterFactory)
{ {
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null)
if (clientAdapterFactory == null) throw new ArgumentNullException(nameof(clientAdapterFactory)); {
throw new ArgumentNullException(nameof(logger));
}
if (clientAdapterFactory == null)
{
throw new ArgumentNullException(nameof(clientAdapterFactory));
}
return new MqttClient(clientAdapterFactory, logger); return new MqttClient(clientAdapterFactory, logger);
} }
@@ -106,7 +141,10 @@ namespace MQTTnet
public MqttServer CreateMqttServer(MqttServerOptions options, IMqttNetLogger logger) public MqttServer CreateMqttServer(MqttServerOptions options, IMqttNetLogger logger)
{ {
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
var serverAdapters = DefaultServerAdapters.Select(a => a.Invoke(this)); var serverAdapters = DefaultServerAdapters.Select(a => a.Invoke(this));
return CreateMqttServer(options, serverAdapters, logger); return CreateMqttServer(options, serverAdapters, logger);
@@ -114,52 +152,53 @@ namespace MQTTnet
public MqttServer CreateMqttServer(MqttServerOptions options, IEnumerable<IMqttServerAdapter> serverAdapters, IMqttNetLogger logger) public MqttServer CreateMqttServer(MqttServerOptions options, IEnumerable<IMqttServerAdapter> serverAdapters, IMqttNetLogger logger)
{ {
if (serverAdapters == null) throw new ArgumentNullException(nameof(serverAdapters)); if (serverAdapters == null)
if (logger == null) throw new ArgumentNullException(nameof(logger)); {
throw new ArgumentNullException(nameof(serverAdapters));
}
if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
return new MqttServer(options, serverAdapters, logger); return new MqttServer(options, serverAdapters, logger);
} }
public MqttServer CreateMqttServer(MqttServerOptions options, IEnumerable<IMqttServerAdapter> serverAdapters) public MqttServer CreateMqttServer(MqttServerOptions options, IEnumerable<IMqttServerAdapter> serverAdapters)
{ {
if (serverAdapters == null) throw new ArgumentNullException(nameof(serverAdapters)); if (serverAdapters == null)
{
throw new ArgumentNullException(nameof(serverAdapters));
}
return new MqttServer(options, serverAdapters, DefaultLogger); return new MqttServer(options, serverAdapters, DefaultLogger);
} }
public MqttServerOptionsBuilder CreateServerOptionsBuilder() public MqttServerOptionsBuilder CreateServerOptionsBuilder()
{ {
return new MqttServerOptionsBuilder(); return new MqttServerOptionsBuilder();
} }
public MqttClientOptionsBuilder CreateClientOptionsBuilder()
{
return new MqttClientOptionsBuilder();
}
public MqttClientDisconnectOptionsBuilder CreateClientDisconnectOptionsBuilder()
{
return new MqttClientDisconnectOptionsBuilder();
}
public MqttClientSubscribeOptionsBuilder CreateSubscribeOptionsBuilder() public MqttClientSubscribeOptionsBuilder CreateSubscribeOptionsBuilder()
{ {
return new MqttClientSubscribeOptionsBuilder(); return new MqttClientSubscribeOptionsBuilder();
} }
public MqttClientUnsubscribeOptionsBuilder CreateUnsubscribeOptionsBuilder()
{
return new MqttClientUnsubscribeOptionsBuilder();
}
public MqttTopicFilterBuilder CreateTopicFilterBuilder() public MqttTopicFilterBuilder CreateTopicFilterBuilder()
{ {
return new MqttTopicFilterBuilder(); return new MqttTopicFilterBuilder();
} }
public MqttApplicationMessageBuilder CreateApplicationMessageBuilder() public MqttClientUnsubscribeOptionsBuilder CreateUnsubscribeOptionsBuilder()
{ {
return new MqttApplicationMessageBuilder(); return new MqttClientUnsubscribeOptionsBuilder();
}
public MqttFactory UseClientAdapterFactory(IMqttClientAdapterFactory clientAdapterFactory)
{
_clientAdapterFactory = clientAdapterFactory ?? throw new ArgumentNullException(nameof(clientAdapterFactory));
return this;
} }
} }
} }
@@ -96,10 +96,10 @@ namespace MQTTnet.Server
// Values described here: [MQTT-3.1.2-24]. // Values described here: [MQTT-3.1.2-24].
// If the client sends 5 sec. the server will allow up to 7.5 seconds. // If the client sends 5 sec. the server will allow up to 7.5 seconds.
// If the client sends 1 sec. the server will allow up to 1.5 seconds. // If the client sends 1 sec. the server will allow up to 1.5 seconds.
var maxDurationWithoutPacket = connection.KeepAlivePeriod * 1.5D; var maxSecondsWithoutPacket = connection.KeepAlivePeriod * 1.5D;
var secondsWithoutPackage = (now - connection.Statistics.LastPacketSentTimestamp).TotalSeconds; var secondsWithoutPackage = (now - connection.Statistics.LastPacketSentTimestamp).TotalSeconds;
if (secondsWithoutPackage < maxDurationWithoutPacket) if (secondsWithoutPackage < maxSecondsWithoutPacket)
{ {
// A packet was received before the timeout is affected. // A packet was received before the timeout is affected.
return; return;