mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-15 00:15:15 +08:00
Restore interfaces.
This commit is contained in:
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
public sealed class MqttClient : Disposable
|
||||
public sealed class MqttClient : Disposable, IMqttClient
|
||||
{
|
||||
readonly MqttPacketFactories _packetFactories = new MqttPacketFactories();
|
||||
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user