mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-20 19:58:57 +08:00
Restore interfaces.
This commit is contained in:
@@ -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; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user