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;
MqttServer _mqttServer;
List<MQTTnet.Client.MqttClient> _mqttSubscriberClients;
Dictionary<string, MQTTnet.Client.MqttClient> _mqttPublisherClientsByPublisherName;
List<IMqttClient> _mqttSubscriberClients;
Dictionary<string, IMqttClient> _mqttPublisherClientsByPublisherName;
Dictionary<string, List<string>> _topicsByPublisher;
Dictionary<string, string> _publisherByTopic;
@@ -74,7 +74,7 @@ namespace MQTTnet.Benchmarks
_mqttServer.StartAsync().GetAwaiter().GetResult();
// Create publisher clients
_mqttPublisherClientsByPublisherName = new Dictionary<string, MQTTnet.Client.MqttClient>();
_mqttPublisherClientsByPublisherName = new Dictionary<string, IMqttClient>();
foreach (var pt in _topicsByPublisher)
{
var publisherName = pt.Key;
@@ -89,7 +89,7 @@ namespace MQTTnet.Benchmarks
}
// Create subscriber clients
_mqttSubscriberClients = new List<MQTTnet.Client.MqttClient>();
_mqttSubscriberClients = new List<IMqttClient>();
for (var i = 0; i < NumSubscribers; i++)
{
var mqttSubscriberClient = factory.CreateMqttClient();
@@ -16,7 +16,7 @@ namespace MQTTnet.Benchmarks
public class MessageProcessingBenchmark
{
MqttServer _mqttServer;
MqttClient _mqttClient;
IMqttClient _mqttClient;
MqttApplicationMessage _message;
[GlobalSetup]
@@ -18,7 +18,7 @@ namespace MQTTnet.Benchmarks
public class MessageProcessingMqttConnectionContextBenchmark
{
IWebHost _host;
MqttClient _mqttClient;
IMqttClient _mqttClient;
MqttApplicationMessage _message;
[GlobalSetup]
@@ -11,7 +11,7 @@ namespace MQTTnet.Benchmarks
public class SubscribeBenchmark
{
MqttServer _mqttServer;
MQTTnet.Client.MqttClient _mqttClient;
IMqttClient _mqttClient;
const int NumPublishers = 1;
const int NumTopicsPerPublisher = 10000;
@@ -54,6 +54,7 @@ namespace MQTTnet.Benchmarks
var subscribeOptions = new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(topic, Protocol.MqttQualityOfServiceLevel.AtMostOnce)
.Build();
_mqttClient.SubscribeAsync(subscribeOptions).GetAwaiter().GetResult();
}
}
@@ -1,5 +1,4 @@
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using MQTTnet.Client;
using MQTTnet.Server;
using System.Collections.Generic;
@@ -11,7 +10,7 @@ namespace MQTTnet.Benchmarks
public class UnsubscribeBenchmark
{
MqttServer _mqttServer;
MQTTnet.Client.MqttClient _mqttClient;
IMqttClient _mqttClient;
const int NumPublishers = 1;
const int NumTopicsPerPublisher = 10000;
@@ -40,7 +39,7 @@ namespace MQTTnet.Benchmarks
foreach (var topic in _topics)
{
var subscribeOptions = new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(topic, Protocol.MqttQualityOfServiceLevel.AtMostOnce)
.WithTopicFilter(topic)
.Build();
_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.Protocol;
using MQTTnet.Server;
using MqttClient = MQTTnet.Client.MqttClient;
namespace MQTTnet.Extensions.ManagedClient
{
public sealed class ManagedMqttClient : Disposable
public sealed class ManagedMqttClient : Disposable, IManagedMqttClient
{
readonly AsyncEvent<ApplicationMessageProcessedEventArgs> _applicationMessageProcessedEvent = new AsyncEvent<ApplicationMessageProcessedEventArgs>();
readonly AsyncEvent<ConnectingFailedEventArgs> _connectingFailedEvent = new AsyncEvent<ConnectingFailedEventArgs>();
@@ -62,7 +61,7 @@ namespace MQTTnet.Extensions.ManagedClient
ManagedMqttClientStorageManager _storageManager;
public ManagedMqttClient(MqttClient mqttClient, IMqttNetLogger logger)
public ManagedMqttClient(IMqttClient mqttClient, IMqttNetLogger logger)
{
InternalClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
@@ -112,7 +111,7 @@ namespace MQTTnet.Extensions.ManagedClient
public IApplicationMessageSkippedHandler ApplicationMessageSkippedHandler { get; set; }
public MqttClient InternalClient { get; }
public IMqttClient InternalClient { get; }
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);
}
@@ -13,7 +13,7 @@ namespace MQTTnet.Extensions.ManagedClient
public static class ManagedMqttClientExtensions
{
public static Task EnqueueAsync(
this ManagedMqttClient managedMqttClient,
this IManagedMqttClient managedMqttClient,
string topic,
string payload = null,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
@@ -39,7 +39,7 @@ namespace MQTTnet.Extensions.ManagedClient
}
public static Task SubscribeAsync(
this ManagedMqttClient managedMqttClient,
this IManagedMqttClient managedMqttClient,
string topic,
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)
{
@@ -10,7 +10,7 @@ namespace MQTTnet.Extensions.ManagedClient
{
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));
@@ -22,7 +22,7 @@ namespace MQTTnet.Extensions.ManagedClient
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 (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 MqttRpcClient CreateMqttRpcClient(this MqttFactory factory, MqttClient mqttClient)
public static IMqttRpcClient CreateMqttRpcClient(this MqttFactory factory, IMqttClient mqttClient)
{
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)
{
throw new ArgumentNullException(nameof(mqttClient));
@@ -13,13 +13,13 @@ using MQTTnet.Implementations;
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 MqttClient _mqttClient;
readonly IMqttClient _mqttClient;
readonly MqttRpcClientOptions _options;
public MqttRpcClient(MqttClient mqttClient, MqttRpcClientOptions options)
public MqttRpcClient(IMqttClient mqttClient, MqttRpcClientOptions options)
{
_mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
_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));
@@ -11,7 +11,7 @@ namespace MQTTnet.Extensions.Rpc
{
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));
@@ -21,7 +21,7 @@ namespace MQTTnet.Extensions.Rpc
/// </summary>
public MqttQualityOfServiceLevel QualityOfServiceLevel { get; set; }
public MqttClient MqttClient { get; set; }
public IMqttClient MqttClient { get; set; }
public MqttRpcClientOptions Options { get; set; }
}
+17 -20
View File
@@ -33,8 +33,8 @@ namespace MQTTnet.TestApp
CancellationTokenSource _cancellationTokenSource;
MqttServer _mqttServer;
Dictionary<string, Client.MqttClient> _mqttPublisherClientsByPublisherName;
List<Client.MqttClient> _mqttSubscriberClients;
Dictionary<string, IMqttClient> _mqttPublisherClientsByPublisherName;
List<IMqttClient> _mqttSubscriberClients;
Dictionary<string, List<string>> _topicsByPublisher;
Dictionary<string, List<string>> _singleWildcardTopicsByPublisher;
@@ -85,7 +85,7 @@ namespace MQTTnet.TestApp
var stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
_mqttPublisherClientsByPublisherName = new Dictionary<string, Client.MqttClient>();
_mqttPublisherClientsByPublisherName = new Dictionary<string, IMqttClient>();
foreach (var pt in _topicsByPublisher)
{
var publisherName = pt.Key;
@@ -99,10 +99,10 @@ namespace MQTTnet.TestApp
}
stopWatch.Stop();
Console.Write(string.Format("{0} publisher(s) connected in {1:0.000} seconds, ", NumPublishers, stopWatch.ElapsedMilliseconds / 1000.0));
Console.WriteLine(string.Format("connections per second: {0:0.000}", NumPublishers / (stopWatch.ElapsedMilliseconds / 1000.0)));
Console.Write($"{NumPublishers} publisher(s) connected in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
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)
{
var mqttClient = factory.CreateMqttClient();
@@ -147,7 +147,6 @@ namespace MQTTnet.TestApp
_mqttServer.Dispose();
}
/// <summary>
/// Measure no-wildcard topic subscription message exchange performance
/// </summary>
@@ -174,16 +173,16 @@ namespace MQTTnet.TestApp
/// <summary>
/// Subcribe to all topics, then run message exchange
/// Subscribe to all topics, then run message exchange
/// </summary>
public async Task ProcessMessages(Dictionary<string, List<string>> topicsByPublisher, string topicTypeDescription)
{
var numTopics = CountTopics(topicsByPublisher);
Console.WriteLine();
Console.Write(string.Format("Subscribing to {0} topics ", numTopics));
ConsoleWriteInfo(string.Format("({0})", topicTypeDescription));
Console.WriteLine(string.Format(" for {0} subscriber(s)...", NumSubscribers));
Console.Write($"Subscribing to {numTopics} topics ");
ConsoleWriteInfo($"({topicTypeDescription})");
Console.WriteLine($" for {NumSubscribers} subscriber(s)...");
var stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
@@ -204,12 +203,12 @@ namespace MQTTnet.TestApp
stopWatch.Stop();
Console.Write(string.Format("{0} subscriber(s) subscribed in {1:0.000} seconds, ", NumSubscribers, stopWatch.ElapsedMilliseconds / 1000.0));
Console.WriteLine(string.Format("subscribe calls per second: {0:0.000}", numTopics / (stopWatch.ElapsedMilliseconds / 1000.0)));
Console.Write($"{NumSubscribers} subscriber(s) subscribed in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
Console.WriteLine($"subscribe calls per second: {numTopics / (stopWatch.ElapsedMilliseconds / 1000.0):0.000}");
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();
@@ -234,11 +233,10 @@ namespace MQTTnet.TestApp
stopWatch.Stop();
Console.Write(string.Format("{0} subscriber(s) unsubscribed in {1:0.000} seconds, ", NumSubscribers, stopWatch.ElapsedMilliseconds / 1000.0));
Console.WriteLine(string.Format("unsubscribe calls per second: {0:0.000}", numTopics / (stopWatch.ElapsedMilliseconds / 1000.0)));
Console.Write($"{NumSubscribers} subscriber(s) unsubscribed in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
Console.WriteLine($"unsubscribe calls per second: {numTopics / (stopWatch.ElapsedMilliseconds / 1000.0):0.000}");
}
/// <summary>
/// Publish messages in batches of NumPublishCallsPerBatch, wait for messages sent to subscriber
/// </summary>
@@ -289,7 +287,6 @@ namespace MQTTnet.TestApp
}
catch
{
}
_cancellationTokenSource.Dispose();
@@ -305,8 +302,8 @@ namespace MQTTnet.TestApp
stopWatch.Stop();
System.Console.Write(string.Format("{0} messages published and received in {1:0.000} seconds, ", totalNumMessagesReceived, stopWatch.ElapsedMilliseconds / 1000.0));
ConsoleWriteLineSuccess(string.Format("messages per second: {0}", (int)(totalNumMessagesReceived / (stopWatch.ElapsedMilliseconds / 1000.0))));
Console.Write($"{totalNumMessagesReceived} messages published and received in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
ConsoleWriteLineSuccess($"messages per second: {(int)(totalNumMessagesReceived / (stopWatch.ElapsedMilliseconds / 1000.0))}");
}
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);
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(
new MqttConnectPacket
@@ -193,7 +193,7 @@ namespace MQTTnet.Tests.Client
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(
new MqttSubscribePacket
@@ -389,7 +389,7 @@ namespace MQTTnet.Tests.Client
async Task<ManagedMqttClient> CreateManagedClientAsync(
TestEnvironment testEnvironment,
MqttClient underlyingClient = null,
IMqttClient underlyingClient = null,
TimeSpan? connectionCheckInterval = null,
string host = "localhost")
{
@@ -226,7 +226,7 @@ namespace MQTTnet.Tests.Client
{
await testEnvironment.StartServer();
var clients = new List<MqttClient>();
var clients = new List<IMqttClient>();
for (var i = 0; i < 100; i++)
{
clients.Add(await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("a")));
@@ -204,7 +204,7 @@ namespace MQTTnet.Tests
{
var disconnectPacket = new MqttDisconnectPacket
{
ReasonCode = MqttDisconnectReasonCode.NormalDisconnection,
ReasonCode = MqttDisconnectReasonCode.NormalDisconnection, // MQTTv3 has no other values than this.
ReasonString = "ReasonString",
ServerReference = "ServerReference",
SessionExpiryInterval = 234,
@@ -216,7 +216,6 @@ namespace MQTTnet.Tests
var deserialized = MqttPacketSerializationHelper.EncodeAndDecodePacket(disconnectPacket, MqttProtocolVersion.V311);
Assert.AreEqual(disconnectPacket.ReasonCode, deserialized.ReasonCode);
Assert.AreEqual(null, deserialized.ReasonString); // 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
{
ReasonCode = MqttDisconnectReasonCode.NormalDisconnection,
ReasonCode = MqttDisconnectReasonCode.QuotaExceeded,
ReasonString = "ReasonString",
ServerReference = "ServerReference",
SessionExpiryInterval = 234,
@@ -15,7 +15,7 @@ namespace MQTTnet.Tests.Mockups
{
readonly List<MqttApplicationMessageReceivedEventArgs> _receivedEventArgs = new List<MqttApplicationMessageReceivedEventArgs>();
public TestApplicationMessageReceivedHandler(MqttClient mqttClient)
public TestApplicationMessageReceivedHandler(IMqttClient mqttClient)
{
mqttClient.ApplicationMessageReceivedAsync += MqttClientOnApplicationMessageReceivedAsync;
}
+10 -11
View File
@@ -17,17 +17,16 @@ using MQTTnet.Implementations;
using MQTTnet.LowLevelClient;
using MQTTnet.Protocol;
using MQTTnet.Server;
using MqttClient = MQTTnet.Client.MqttClient;
namespace MQTTnet.Tests.Mockups
{
public sealed class TestEnvironment : IDisposable
{
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<LowLevelMqttClient> _lowLevelClients = new List<LowLevelMqttClient>();
readonly List<ILowLevelMqttClient> _lowLevelClients = new List<ILowLevelMqttClient>();
readonly MqttProtocolVersion _protocolVersion;
readonly List<string> _serverErrors = new List<string>();
@@ -91,12 +90,12 @@ namespace MQTTnet.Tests.Mockups
public TestContext TestContext { get; }
public Task<MqttClient> ConnectClient()
public Task<IMqttClient> ConnectClient()
{
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)
{
@@ -128,7 +127,7 @@ namespace MQTTnet.Tests.Mockups
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)
{
@@ -154,7 +153,7 @@ namespace MQTTnet.Tests.Mockups
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)
{
@@ -178,7 +177,7 @@ namespace MQTTnet.Tests.Mockups
return client;
}
public async Task<LowLevelMqttClient> ConnectLowLevelClient(Action<MqttClientOptionsBuilder> optionsBuilder = null)
public async Task<ILowLevelMqttClient> ConnectLowLevelClient(Action<MqttClientOptionsBuilder> optionsBuilder = null)
{
var options = new MqttClientOptionsBuilder();
options = options.WithTcpServer("127.0.0.1", ServerPort);
@@ -195,12 +194,12 @@ namespace MQTTnet.Tests.Mockups
return new MqttRpcClient(await ConnectClient(), options);
}
public TestApplicationMessageReceivedHandler CreateApplicationMessageHandler(MqttClient mqttClient)
public TestApplicationMessageReceivedHandler CreateApplicationMessageHandler(IMqttClient mqttClient)
{
return new TestApplicationMessageReceivedHandler(mqttClient);
}
public MqttClient CreateClient()
public IMqttClient CreateClient()
{
lock (_clients)
{
@@ -228,7 +227,7 @@ namespace MQTTnet.Tests.Mockups
}
}
public LowLevelMqttClient CreateLowLevelClient()
public ILowLevelMqttClient CreateLowLevelClient()
{
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
{
@@ -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
{
+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
{
public sealed class MqttClient : Disposable
public sealed class MqttClient : Disposable, IMqttClient
{
readonly MqttPacketFactories _packetFactories = new MqttPacketFactories();
+10 -13
View File
@@ -14,7 +14,7 @@ namespace MQTTnet.Client
{
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)
{
@@ -31,7 +31,7 @@ namespace MQTTnet.Client
}
public static Task<MqttClientPublishResult> PublishBinaryAsync(
this MqttClient mqttClient,
this IMqttClient mqttClient,
string topic,
IEnumerable<byte> payload = null,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
@@ -58,7 +58,7 @@ namespace MQTTnet.Client
}
public static Task<MqttClientPublishResult> PublishStringAsync(
this MqttClient mqttClient,
this IMqttClient mqttClient,
string topic,
string payload = null,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
@@ -69,7 +69,7 @@ namespace MQTTnet.Client
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)
{
@@ -79,7 +79,7 @@ namespace MQTTnet.Client
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)
{
@@ -91,14 +91,13 @@ namespace MQTTnet.Client
throw new ArgumentNullException(nameof(topicFilter));
}
var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topicFilter)
.Build();
var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topicFilter).Build();
return mqttClient.SubscribeAsync(subscribeOptions, cancellationToken);
}
public static Task<MqttClientSubscribeResult> SubscribeAsync(
this MqttClient mqttClient,
this IMqttClient mqttClient,
string topic,
MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
CancellationToken cancellationToken = default)
@@ -113,13 +112,12 @@ namespace MQTTnet.Client
throw new ArgumentNullException(nameof(topic));
}
var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topic, qualityOfServiceLevel)
.Build();
var subscribeOptions = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topic, qualityOfServiceLevel).Build();
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)
{
@@ -131,8 +129,7 @@ namespace MQTTnet.Client
throw new ArgumentNullException(nameof(topic));
}
var unsubscribeOptions = new MqttClientUnsubscribeOptionsBuilder().WithTopicFilter(topic)
.Build();
var unsubscribeOptions = new MqttClientUnsubscribeOptionsBuilder().WithTopicFilter(topic).Build();
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
{
public sealed class LowLevelMqttClient : IDisposable
public sealed class LowLevelMqttClient : ILowLevelMqttClient
{
readonly IMqttClientAdapterFactory _clientAdapterFactory;
readonly AsyncEvent<InspectMqttPacketEventArgs> _inspectPacketEvent = new AsyncEvent<InspectMqttPacketEventArgs>();
+84 -45
View File
@@ -2,15 +2,15 @@
// The .NET Foundation licenses this file to you under the MIT license.
// 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.Collections.Generic;
using System.Linq;
using MQTTnet.Adapter;
using MQTTnet.Client;
using MQTTnet.Diagnostics;
using MQTTnet.Implementations;
using MQTTnet.LowLevelClient;
using MQTTnet.Server;
using MqttClient = MQTTnet.Client.MqttClient;
namespace MQTTnet
@@ -39,62 +39,97 @@ namespace MQTTnet
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 this;
return new MqttApplicationMessageBuilder();
}
public LowLevelMqttClient CreateLowLevelMqttClient()
public MqttClientDisconnectOptionsBuilder CreateClientDisconnectOptionsBuilder()
{
return new MqttClientDisconnectOptionsBuilder();
}
public MqttClientOptionsBuilder CreateClientOptionsBuilder()
{
return new MqttClientOptionsBuilder();
}
public ILowLevelMqttClient CreateLowLevelMqttClient()
{
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);
}
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);
}
public LowLevelMqttClient CreateLowLevelMqttClient(IMqttNetLogger logger, IMqttClientAdapterFactory clientAdapterFactory)
public ILowLevelMqttClient CreateLowLevelMqttClient(IMqttNetLogger logger, IMqttClientAdapterFactory clientAdapterFactory)
{
if (logger == null) throw new ArgumentNullException(nameof(logger));
if (clientAdapterFactory == null) throw new ArgumentNullException(nameof(clientAdapterFactory));
if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
if (clientAdapterFactory == null)
{
throw new ArgumentNullException(nameof(clientAdapterFactory));
}
return new LowLevelMqttClient(_clientAdapterFactory, logger);
}
public MqttClient CreateMqttClient()
public IMqttClient CreateMqttClient()
{
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);
}
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);
}
public MqttClient CreateMqttClient(IMqttNetLogger logger, IMqttClientAdapterFactory clientAdapterFactory)
public IMqttClient CreateMqttClient(IMqttNetLogger logger, IMqttClientAdapterFactory clientAdapterFactory)
{
if (logger == null) throw new ArgumentNullException(nameof(logger));
if (clientAdapterFactory == null) throw new ArgumentNullException(nameof(clientAdapterFactory));
if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
if (clientAdapterFactory == null)
{
throw new ArgumentNullException(nameof(clientAdapterFactory));
}
return new MqttClient(clientAdapterFactory, logger);
}
@@ -106,7 +141,10 @@ namespace MQTTnet
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));
return CreateMqttServer(options, serverAdapters, logger);
@@ -114,15 +152,25 @@ namespace MQTTnet
public MqttServer CreateMqttServer(MqttServerOptions options, IEnumerable<IMqttServerAdapter> serverAdapters, IMqttNetLogger logger)
{
if (serverAdapters == null) throw new ArgumentNullException(nameof(serverAdapters));
if (logger == null) throw new ArgumentNullException(nameof(logger));
if (serverAdapters == null)
{
throw new ArgumentNullException(nameof(serverAdapters));
}
if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
return new MqttServer(options, serverAdapters, logger);
}
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);
}
@@ -132,34 +180,25 @@ namespace MQTTnet
return new MqttServerOptionsBuilder();
}
public MqttClientOptionsBuilder CreateClientOptionsBuilder()
{
return new MqttClientOptionsBuilder();
}
public MqttClientDisconnectOptionsBuilder CreateClientDisconnectOptionsBuilder()
{
return new MqttClientDisconnectOptionsBuilder();
}
public MqttClientSubscribeOptionsBuilder CreateSubscribeOptionsBuilder()
{
return new MqttClientSubscribeOptionsBuilder();
}
public MqttClientUnsubscribeOptionsBuilder CreateUnsubscribeOptionsBuilder()
{
return new MqttClientUnsubscribeOptionsBuilder();
}
public MqttTopicFilterBuilder CreateTopicFilterBuilder()
{
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].
// 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.
var maxDurationWithoutPacket = connection.KeepAlivePeriod * 1.5D;
var maxSecondsWithoutPacket = connection.KeepAlivePeriod * 1.5D;
var secondsWithoutPackage = (now - connection.Statistics.LastPacketSentTimestamp).TotalSeconds;
if (secondsWithoutPackage < maxDurationWithoutPacket)
if (secondsWithoutPackage < maxSecondsWithoutPacket)
{
// A packet was received before the timeout is affected.
return;