From 15a564dcfea5d4d70ff3078b326128fe1e403603 Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Thu, 26 Oct 2017 07:53:22 +0200 Subject: [PATCH 01/19] removed smokebombs (stop the server in finally so other test dont fail because stop is not called in other test) --- Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 277 ++++++++++++-------- 1 file changed, 168 insertions(+), 109 deletions(-) diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs index d548ff08..97aa3f89 100644 --- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs @@ -52,22 +52,26 @@ namespace MQTTnet.Core.Tests { var serverAdapter = new TestMqttServerAdapter(); var s = new MqttFactory().CreateMqttServer(); - await s.StartAsync(); - - var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").WithAtMostOnceQoS().Build(); - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - var c2 = await serverAdapter.ConnectTestClient(s, "c2", willMessage); - var receivedMessagesCount = 0; - c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - await c1.SubscribeAsync(new TopicFilter("#", MqttQualityOfServiceLevel.AtMostOnce)); + try + { + await s.StartAsync(); - await c2.DisconnectAsync(); + var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").WithAtMostOnceQoS().Build(); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); + var c2 = await serverAdapter.ConnectTestClient(s, "c2", willMessage); - await Task.Delay(1000); + c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; + await c1.SubscribeAsync(new TopicFilter("#", MqttQualityOfServiceLevel.AtMostOnce)); - await s.StopAsync(); + await c2.DisconnectAsync(); + await Task.Delay(1000); + } + finally + { + await s.StopAsync(); + } Assert.AreEqual(1, receivedMessagesCount); } @@ -76,32 +80,38 @@ namespace MQTTnet.Core.Tests { var serverAdapter = new TestMqttServerAdapter(); var s = new MqttFactory().CreateMqttServer(); - await s.StartAsync(); - - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - var c2 = await serverAdapter.ConnectTestClient(s, "c2"); var receivedMessagesCount = 0; - c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build(); + try + { + await s.StartAsync(); - await c2.PublishAsync(message); - Assert.AreEqual(0, receivedMessagesCount); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); + var c2 = await serverAdapter.ConnectTestClient(s, "c2"); + c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - await c1.SubscribeAsync(new TopicFilter("a", MqttQualityOfServiceLevel.AtLeastOnce)); - await c2.PublishAsync(message); + var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build(); - await Task.Delay(500); - Assert.AreEqual(1, receivedMessagesCount); + await c2.PublishAsync(message); + Assert.AreEqual(0, receivedMessagesCount); - await c1.UnsubscribeAsync("a"); - await c2.PublishAsync(message); + await c1.SubscribeAsync(new TopicFilter("a", MqttQualityOfServiceLevel.AtLeastOnce)); + await c2.PublishAsync(message); - await Task.Delay(500); - Assert.AreEqual(1, receivedMessagesCount); + await Task.Delay(500); + Assert.AreEqual(1, receivedMessagesCount); - await s.StopAsync(); + await c1.UnsubscribeAsync("a"); + await c2.PublishAsync(message); + + await Task.Delay(500); + Assert.AreEqual(1, receivedMessagesCount); + } + finally + { + await s.StopAsync(); + } await Task.Delay(500); Assert.AreEqual(1, receivedMessagesCount); @@ -112,21 +122,27 @@ namespace MQTTnet.Core.Tests { var serverAdapter = new TestMqttServerAdapter(); var s = new MqttFactory().CreateMqttServer(); - await s.StartAsync(); - - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - var receivedMessagesCount = 0; - c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build(); - await c1.SubscribeAsync(new TopicFilter("a", MqttQualityOfServiceLevel.AtLeastOnce)); + try + { + await s.StartAsync(); - s.PublishAsync(message).Wait(); - await Task.Delay(500); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - await s.StopAsync(); + c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; + var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build(); + await c1.SubscribeAsync(new TopicFilter("a", MqttQualityOfServiceLevel.AtLeastOnce)); + + s.PublishAsync(message).Wait(); + await Task.Delay(500); + } + finally + { + await s.StopAsync(); + } + Assert.AreEqual(1, receivedMessagesCount); } @@ -135,20 +151,26 @@ namespace MQTTnet.Core.Tests { var serverAdapter = new TestMqttServerAdapter(); var s = new MqttFactory().CreateMqttServer(); - await s.StartAsync(); - - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).Build()); - await c1.DisconnectAsync(); - - var c2 = await serverAdapter.ConnectTestClient(s, "c2"); var receivedMessagesCount = 0; - c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)); - await Task.Delay(500); + try + { + await s.StartAsync(); - await s.StopAsync(); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); + await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).Build()); + await c1.DisconnectAsync(); + + var c2 = await serverAdapter.ConnectTestClient(s, "c2"); + c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; + await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)); + + await Task.Delay(500); + } + finally + { + await s.StopAsync(); + } Assert.AreEqual(0, receivedMessagesCount); } @@ -158,21 +180,27 @@ namespace MQTTnet.Core.Tests { var serverAdapter = new TestMqttServerAdapter(); var s = new MqttFactory().CreateMqttServer(); - await s.StartAsync(); - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build()); - await c1.DisconnectAsync(); - - var c2 = await serverAdapter.ConnectTestClient(s, "c2"); var receivedMessagesCount = 0; - c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)); + try + { + await s.StartAsync(); - await Task.Delay(500); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); + await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build()); + await c1.DisconnectAsync(); - await s.StopAsync(); + var c2 = await serverAdapter.ConnectTestClient(s, "c2"); + c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; + await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)); + await Task.Delay(500); + } + finally + { + await s.StopAsync(); + } + Assert.AreEqual(1, receivedMessagesCount); } @@ -187,21 +215,27 @@ namespace MQTTnet.Core.Tests .BuildServiceProvider(); var s = new MqttFactory(services).CreateMqttServer(); - await s.StartAsync(); - - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build()); - await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[0]).WithRetainFlag().Build()); - await c1.DisconnectAsync(); - - var c2 = await serverAdapter.ConnectTestClient(s, "c2"); var receivedMessagesCount = 0; - c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)); + try + { + await s.StartAsync(); - await Task.Delay(500); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); + await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build()); + await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[0]).WithRetainFlag().Build()); + await c1.DisconnectAsync(); + + var c2 = await serverAdapter.ConnectTestClient(s, "c2"); + c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; + await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)); + + await Task.Delay(500); + } + finally + { + await s.StopAsync(); + } - await s.StopAsync(); Assert.AreEqual(0, receivedMessagesCount); } @@ -219,25 +253,37 @@ namespace MQTTnet.Core.Tests .BuildServiceProvider(); var s = new MqttFactory(services).CreateMqttServer(); // TODO: Like here? - await s.StartAsync(); - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build()); - await c1.DisconnectAsync(); + try + { + await s.StartAsync(); - await s.StopAsync(); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); + await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build()); + await c1.DisconnectAsync(); + } + finally + { + await s.StopAsync(); + } s = services.GetRequiredService(); - await s.StartAsync(); - var c2 = await serverAdapter.ConnectTestClient(s, "c2"); var receivedMessagesCount = 0; - c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)); + try + { + await s.StartAsync(); - await Task.Delay(500); + var c2 = await serverAdapter.ConnectTestClient(s, "c2"); + c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; + await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)); - await s.StopAsync(); + await Task.Delay(500); + } + finally + { + await s.StopAsync(); + } Assert.AreEqual(1, receivedMessagesCount); } @@ -259,25 +305,32 @@ namespace MQTTnet.Core.Tests .BuildServiceProvider(); var s = services.GetRequiredService(); - await s.StartAsync(); - - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - var c2 = await serverAdapter.ConnectTestClient(s, "c2"); - await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("test").Build()); - - var isIntercepted = false; - c2.ApplicationMessageReceived += (sender, args) => + try { - isIntercepted = string.Compare("extended", Encoding.UTF8.GetString(args.ApplicationMessage.Payload), StringComparison.Ordinal) == 0; - }; + await s.StartAsync(); - var m = new MqttApplicationMessageBuilder().WithTopic("test").Build(); - await c1.PublishAsync(m); - await c1.DisconnectAsync(); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); + var c2 = await serverAdapter.ConnectTestClient(s, "c2"); + await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("test").Build()); - await Task.Delay(500); + var isIntercepted = false; + c2.ApplicationMessageReceived += (sender, args) => + { + isIntercepted = string.Compare("extended", Encoding.UTF8.GetString(args.ApplicationMessage.Payload), StringComparison.Ordinal) == 0; + }; - Assert.IsTrue(isIntercepted); + var m = new MqttApplicationMessageBuilder().WithTopic("test").Build(); + await c1.PublishAsync(m); + await c1.DisconnectAsync(); + + await Task.Delay(500); + + Assert.IsTrue(isIntercepted); + } + finally + { + await s.StopAsync(); + } } private class TestStorage : IMqttServerStorage @@ -306,28 +359,34 @@ namespace MQTTnet.Core.Tests var serverAdapter = new TestMqttServerAdapter(); var services = new ServiceCollection() .AddMqttServer() + .AddLogging() .AddSingleton(serverAdapter) .BuildServiceProvider(); var s = services.GetRequiredService(); - await s.StartAsync(); - - var c1 = await serverAdapter.ConnectTestClient(s, "c1"); - var c2 = await serverAdapter.ConnectTestClient(s, "c2"); - var receivedMessagesCount = 0; - c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; + try + { + await s.StartAsync(); - await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic(topicFilter).WithQualityOfServiceLevel(filterQualityOfServiceLevel).Build()); - await c2.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(topic).WithPayload(new byte[0]).WithQualityOfServiceLevel(qualityOfServiceLevel).Build()); + var c1 = await serverAdapter.ConnectTestClient(s, "c1"); + var c2 = await serverAdapter.ConnectTestClient(s, "c2"); - await Task.Delay(500); - await c1.UnsubscribeAsync(topicFilter); + c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++; - await Task.Delay(500); + await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic(topicFilter).WithQualityOfServiceLevel(filterQualityOfServiceLevel).Build()); + await c2.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(topic).WithPayload(new byte[0]).WithQualityOfServiceLevel(qualityOfServiceLevel).Build()); - await s.StopAsync(); + await Task.Delay(500); + await c1.UnsubscribeAsync(topicFilter); + await Task.Delay(500); + } + finally + { + await s.StopAsync(); + } + Assert.AreEqual(expectedReceivedMessagesCount, receivedMessagesCount); } } From 466b6a25cde8672c27f0b3f333692509081fe710 Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Thu, 26 Oct 2017 08:11:37 +0200 Subject: [PATCH 02/19] fixed unittests and addressed todo --- Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 10 ++++ MQTTnet.Core/Server/IMqttServerFactory.cs | 6 ++- Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 50 +++++++++++++++---- Tests/MQTTnet.Core.Tests/TestLogger.cs | 8 ++- 4 files changed, 61 insertions(+), 13 deletions(-) diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs index 7d88480f..0ff61364 100644 --- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs +++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs @@ -4,6 +4,7 @@ using MQTTnet.Core.Client; using MQTTnet.Core.Serializer; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using MQTTnet.Implementations; using MQTTnet.Core.ManagedClient; using MQTTnet.Core.Server; @@ -109,5 +110,14 @@ namespace MQTTnet { return _serviceProvider.GetRequiredService(); } + + public IMqttServer CreateMqttServer(Action configure) + { + var options = _serviceProvider.GetRequiredService>(); + + configure(options.Value); + + return _serviceProvider.GetRequiredService(); + } } } \ No newline at end of file diff --git a/MQTTnet.Core/Server/IMqttServerFactory.cs b/MQTTnet.Core/Server/IMqttServerFactory.cs index 61d022f3..500614b0 100644 --- a/MQTTnet.Core/Server/IMqttServerFactory.cs +++ b/MQTTnet.Core/Server/IMqttServerFactory.cs @@ -1,7 +1,11 @@ -namespace MQTTnet.Core.Server +using System; + +namespace MQTTnet.Core.Server { public interface IMqttServerFactory { IMqttServer CreateMqttServer(); + + IMqttServer CreateMqttServer(Action configure); } } \ No newline at end of file diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs index 97aa3f89..4dd9f3ae 100644 --- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs @@ -51,7 +51,13 @@ namespace MQTTnet.Core.Tests public async Task MqttServer_WillMessage() { var serverAdapter = new TestMqttServerAdapter(); - var s = new MqttFactory().CreateMqttServer(); + var services = new ServiceCollection() + .AddLogging() + .AddMqttServer() + .AddSingleton(serverAdapter) + .BuildServiceProvider(); + + var s = new MqttFactory(services).CreateMqttServer(); var receivedMessagesCount = 0; try { @@ -79,7 +85,13 @@ namespace MQTTnet.Core.Tests public async Task MqttServer_Unsubscribe() { var serverAdapter = new TestMqttServerAdapter(); - var s = new MqttFactory().CreateMqttServer(); + var services = new ServiceCollection() + .AddLogging() + .AddMqttServer() + .AddSingleton(serverAdapter) + .BuildServiceProvider(); + + var s = new MqttFactory(services).CreateMqttServer(); var receivedMessagesCount = 0; @@ -121,7 +133,13 @@ namespace MQTTnet.Core.Tests public async Task MqttServer_Publish() { var serverAdapter = new TestMqttServerAdapter(); - var s = new MqttFactory().CreateMqttServer(); + var services = new ServiceCollection() + .AddLogging() + .AddMqttServer() + .AddSingleton(serverAdapter) + .BuildServiceProvider(); + + var s = new MqttFactory(services).CreateMqttServer(); var receivedMessagesCount = 0; try @@ -150,7 +168,13 @@ namespace MQTTnet.Core.Tests public async Task MqttServer_NoRetainedMessage() { var serverAdapter = new TestMqttServerAdapter(); - var s = new MqttFactory().CreateMqttServer(); + var services = new ServiceCollection() + .AddLogging() + .AddMqttServer() + .AddSingleton(serverAdapter) + .BuildServiceProvider(); + + var s = new MqttFactory(services).CreateMqttServer(); var receivedMessagesCount = 0; try @@ -179,7 +203,13 @@ namespace MQTTnet.Core.Tests public async Task MqttServer_RetainedMessage() { var serverAdapter = new TestMqttServerAdapter(); - var s = new MqttFactory().CreateMqttServer(); + var services = new ServiceCollection() + .AddLogging() + .AddMqttServer() + .AddSingleton(serverAdapter) + .BuildServiceProvider(); + + var s = new MqttFactory(services).CreateMqttServer(); var receivedMessagesCount = 0; try @@ -210,7 +240,7 @@ namespace MQTTnet.Core.Tests var serverAdapter = new TestMqttServerAdapter(); var services = new ServiceCollection() .AddLogging() - .AddMqttServer() // TODO: Is there maybe an easier way for the library user to set the options? + .AddMqttServer() .AddSingleton(serverAdapter) .BuildServiceProvider(); @@ -248,11 +278,11 @@ namespace MQTTnet.Core.Tests var serverAdapter = new TestMqttServerAdapter(); var services = new ServiceCollection() .AddLogging() - .AddMqttServer(options => options.Storage = storage) // TODO: Is there maybe an easier way for the library user to set the options? + .AddMqttServer() .AddSingleton(serverAdapter) .BuildServiceProvider(); - var s = new MqttFactory(services).CreateMqttServer(); // TODO: Like here? + var s = new MqttFactory(services).CreateMqttServer(options => options.Storage = storage); try { @@ -300,11 +330,11 @@ namespace MQTTnet.Core.Tests var serverAdapter = new TestMqttServerAdapter(); var services = new ServiceCollection() .AddLogging() - .AddMqttServer(options => options.ApplicationMessageInterceptor = Interceptor) + .AddMqttServer() .AddSingleton(serverAdapter) .BuildServiceProvider(); - var s = services.GetRequiredService(); + var s = new MqttFactory(services).CreateMqttServer(options => options.ApplicationMessageInterceptor = Interceptor); try { await s.StartAsync(); diff --git a/Tests/MQTTnet.Core.Tests/TestLogger.cs b/Tests/MQTTnet.Core.Tests/TestLogger.cs index ea597a6e..f57c877c 100644 --- a/Tests/MQTTnet.Core.Tests/TestLogger.cs +++ b/Tests/MQTTnet.Core.Tests/TestLogger.cs @@ -3,11 +3,11 @@ using System; namespace MQTTnet.Core.Tests { - public class TestLogger : ILogger + public class TestLogger : IDisposable, ILogger { public IDisposable BeginScope(TState state) { - throw new NotImplementedException(); + return this; } public bool IsEnabled(LogLevel logLevel) @@ -18,5 +18,9 @@ namespace MQTTnet.Core.Tests public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { } + + public void Dispose() + { + } } } From 0811938466a41e7e621c776605f78fe48bf587ee Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Thu, 26 Oct 2017 08:15:25 +0200 Subject: [PATCH 03/19] temp rename to fix casing --- .../MQTTnet.AspNetCorex.csproj | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Frameworks/MQTTnet.AspNetCore/MQTTnet.AspNetCorex.csproj diff --git a/Frameworks/MQTTnet.AspNetCore/MQTTnet.AspNetCorex.csproj b/Frameworks/MQTTnet.AspNetCore/MQTTnet.AspNetCorex.csproj new file mode 100644 index 00000000..5142cc15 --- /dev/null +++ b/Frameworks/MQTTnet.AspNetCore/MQTTnet.AspNetCorex.csproj @@ -0,0 +1,17 @@ + + + + netstandard2.0 + + + + + + + + + + + + + From 0e666f03166974d51fec145f41c519f794c9da2e Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Thu, 26 Oct 2017 08:18:13 +0200 Subject: [PATCH 04/19] use correct casing --- .../MQTTnet.AspNetCorex.csproj | 17 ----------------- .../ApplicationBuilderExtensions.cs | 2 +- .../MQTTnet.AspnetCore/MqttHostedServer.cs | 2 +- .../MqttWebSocketServerAdapter.cs | 2 +- .../ServiceCollectionExtensions.cs | 2 +- MQTTnet.sln | 2 +- .../MQTTnet.TestApp.AspNetCore2.csproj | 2 +- 7 files changed, 6 insertions(+), 23 deletions(-) delete mode 100644 Frameworks/MQTTnet.AspNetCore/MQTTnet.AspNetCorex.csproj diff --git a/Frameworks/MQTTnet.AspNetCore/MQTTnet.AspNetCorex.csproj b/Frameworks/MQTTnet.AspNetCore/MQTTnet.AspNetCorex.csproj deleted file mode 100644 index 5142cc15..00000000 --- a/Frameworks/MQTTnet.AspNetCore/MQTTnet.AspNetCorex.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - netstandard2.0 - - - - - - - - - - - - - diff --git a/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs b/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs index a62ecded..06ca74d4 100644 --- a/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs +++ b/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using MQTTnet.Core.Server; -namespace MQTTnet.AspnetCore +namespace MQTTnet.AspNetCore { public static class ApplicationBuilderExtensions { diff --git a/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs b/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs index b5326ab1..db725735 100644 --- a/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs +++ b/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs @@ -7,7 +7,7 @@ using Microsoft.Extensions.Options; using MQTTnet.Core.Adapter; using MQTTnet.Core.Server; -namespace MQTTnet.AspnetCore +namespace MQTTnet.AspNetCore { public class MqttHostedServer : MqttServer, IHostedService { diff --git a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs index abb30e37..5cd5d555 100644 --- a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs +++ b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs @@ -8,7 +8,7 @@ using MQTTnet.Core.Channel; using MQTTnet.Core.Server; using MQTTnet.Implementations; -namespace MQTTnet.AspnetCore +namespace MQTTnet.AspNetCore { public class MqttWebSocketServerAdapter : IMqttServerAdapter, IDisposable { diff --git a/Frameworks/MQTTnet.AspnetCore/ServiceCollectionExtensions.cs b/Frameworks/MQTTnet.AspnetCore/ServiceCollectionExtensions.cs index 1951368c..f915ab43 100644 --- a/Frameworks/MQTTnet.AspnetCore/ServiceCollectionExtensions.cs +++ b/Frameworks/MQTTnet.AspnetCore/ServiceCollectionExtensions.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.Hosting; using MQTTnet.Core.Adapter; using MQTTnet.Core.Server; -namespace MQTTnet.AspnetCore +namespace MQTTnet.AspNetCore { public static class ServiceCollectionExtensions { diff --git a/MQTTnet.sln b/MQTTnet.sln index 263fee0e..bd0b2141 100644 --- a/MQTTnet.sln +++ b/MQTTnet.sln @@ -33,7 +33,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.TestApp.NetCore", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.TestApp.AspNetCore2", "Tests\MQTTnet.TestApp.AspNetCore2\MQTTnet.TestApp.AspNetCore2.csproj", "{C6FF8AEA-0855-41EC-A1F3-AC262225BAB9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MQTTnet.AspnetCore", "Frameworks\MQTTnet.AspnetCore\MQTTnet.AspnetCore.csproj", "{F10C4060-F7EE-4A83-919F-FF723E72F94A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.AspNetCore", "Frameworks\MQTTnet.AspnetCore\MQTTnet.AspNetCore.csproj", "{F10C4060-F7EE-4A83-919F-FF723E72F94A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Tests/MQTTnet.TestApp.AspNetCore2/MQTTnet.TestApp.AspNetCore2.csproj b/Tests/MQTTnet.TestApp.AspNetCore2/MQTTnet.TestApp.AspNetCore2.csproj index 2f042084..7e4e0e3d 100644 --- a/Tests/MQTTnet.TestApp.AspNetCore2/MQTTnet.TestApp.AspNetCore2.csproj +++ b/Tests/MQTTnet.TestApp.AspNetCore2/MQTTnet.TestApp.AspNetCore2.csproj @@ -14,7 +14,7 @@ - + From bb6eb246e812ddc84b546be8abeff31fbf2aef59 Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Thu, 26 Oct 2017 09:01:25 +0200 Subject: [PATCH 05/19] added AspNetCore to buildscript and fixed assemblyversion of dotnet build --- Build/MQTTnet.AspNetCore.nuspec | 30 ++++++++++++++++++++++++++++++ Build/MQTTnet.nuspec | 4 ++-- Build/build.ps1 | 8 +++++--- MQTTnet.sln | 1 + 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 Build/MQTTnet.AspNetCore.nuspec diff --git a/Build/MQTTnet.AspNetCore.nuspec b/Build/MQTTnet.AspNetCore.nuspec new file mode 100644 index 00000000..eb5f637f --- /dev/null +++ b/Build/MQTTnet.AspNetCore.nuspec @@ -0,0 +1,30 @@ + + + + MQTTnet.AspNetCore + 2.5.0 + Christian Kratky + Christian Kratky + https://github.com/chkr1011/MQTTnet/blob/master/LICENSE + https://github.com/chkr1011/MQTTnet + https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png + false + This is a support library to integrate MQTTnet into AspNetCore. + initial version + + Copyright Christian Kratky 2016-2017 + MQTT Message Queue Telemetry Transport MQTTClient MQTTServer Server MQTTBroker Broker NETStandard IoT InternetOfThings Messaging Hardware Arduino Sensor Actuator M2M ESP Smart Home Cities Automation + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec index 2403cc84..54c4c479 100644 --- a/Build/MQTTnet.nuspec +++ b/Build/MQTTnet.nuspec @@ -51,8 +51,8 @@ - - + + \ No newline at end of file diff --git a/Build/build.ps1 b/Build/build.ps1 index 70b616b9..5b766d6a 100644 --- a/Build/build.ps1 +++ b/Build/build.ps1 @@ -3,9 +3,11 @@ param([string]$version) if ([string]::IsNullOrEmpty($version)) {$version = "0.0.1"} $msbuild = "MSBuild.exe" -&dotnet build ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj -c="Release" -&$msbuild ..\Frameworks\MQTTnet.UniversalWindows\MQTTnet.UniversalWindows.csproj /t:Build /p:Configuration="Release" +&dotnet build ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj -c="Release" /p:FileVersion=$version /p:AssemblyVersion=$version +&dotnet build ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj -c="Release" /p:FileVersion=$version /p:AssemblyVersion=$version +##&$msbuild ..\Frameworks\MQTTnet.UniversalWindows\MQTTnet.UniversalWindows.csproj /t:Build /p:Configuration="Release" Remove-Item .\NuGet -Force -Recurse New-Item -ItemType Directory -Force -Path .\NuGet -.\NuGet.exe pack MQTTnet.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $version \ No newline at end of file +.\NuGet.exe pack MQTTnet.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $version +.\NuGet.exe pack MQTTnet.AspNetCore.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $version \ No newline at end of file diff --git a/MQTTnet.sln b/MQTTnet.sln index bd0b2141..aae1e6e2 100644 --- a/MQTTnet.sln +++ b/MQTTnet.sln @@ -20,6 +20,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{67C28AC1-BC3A-420A-BE9C-FA2401431CF9}" ProjectSection(SolutionItems) = preProject Build\build.ps1 = Build\build.ps1 + Build\MQTTnet.AspNetCore.nuspec = Build\MQTTnet.AspNetCore.nuspec Build\MQTTnet.nuspec = Build\MQTTnet.nuspec EndProjectSection EndProject From d0f1c18a2fe9da5af081b3ee59584f3886e44e2e Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Thu, 26 Oct 2017 21:22:58 +0200 Subject: [PATCH 06/19] Server refactoring --- Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 11 +++++-- .../ServiceCollectionExtensions.cs | 1 + .../MQTTnet.UniversalWindows/MqttFactory.cs | 11 +++++-- .../ApplicationMessagePublisherExtensions.cs | 16 +++++++++ MQTTnet.Core/Client/MqttClientExtensions.cs | 8 ----- .../IApplicationMessagePublisher.cs | 2 +- .../IApplicationMessageReceiver.cs | 3 +- .../ManagedClient/ManagedMqttClient.cs | 6 ++-- .../ManagedMqttClientExtensions.cs | 12 ++----- ...MqttApplicationMessageReceivedEventArgs.cs | 2 +- MQTTnet.Core/Server/IMqttServer.cs | 1 + MQTTnet.Core/Server/MqttClientSession.cs | 33 ++++++++++++------- .../Server/MqttClientSessionsManager.cs | 31 +++++++++-------- .../Server/MqttClientSubscriptionsManager.cs | 7 ++++ MQTTnet.Core/Server/MqttServer.cs | 9 +++-- MQTTnet.Core/Server/MqttSubscribeResult.cs | 11 +++++++ .../TestClientSessionFactory.cs | 8 +++-- .../ManagedClientTest.cs | 6 ++-- .../MainPage.xaml | 7 +++- .../MainPage.xaml.cs | 24 ++++++++++++++ 20 files changed, 145 insertions(+), 64 deletions(-) create mode 100644 MQTTnet.Core/ApplicationMessagePublisherExtensions.cs rename MQTTnet.Core/{Client => }/IApplicationMessagePublisher.cs (87%) rename MQTTnet.Core/{Client => }/IApplicationMessageReceiver.cs (78%) rename MQTTnet.Core/{Client => }/MqttApplicationMessageReceivedEventArgs.cs (94%) create mode 100644 MQTTnet.Core/Server/MqttSubscribeResult.cs diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs index 7d88480f..ad0e98d0 100644 --- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs +++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs @@ -4,6 +4,7 @@ using MQTTnet.Core.Client; using MQTTnet.Core.Serializer; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using MQTTnet.Implementations; using MQTTnet.Core.ManagedClient; using MQTTnet.Core.Server; @@ -90,9 +91,15 @@ namespace MQTTnet }; } - public MqttClientSession CreateClientSession(string sessionId, MqttClientSessionsManager mqttClientSessionsManager) + public MqttClientSession CreateClientSession(string clientId, MqttClientSessionsManager clientSessionsManager) { - return new MqttClientSession(sessionId, mqttClientSessionsManager, _serviceProvider.GetRequiredService>(), _serviceProvider.GetRequiredService>()); + return new MqttClientSession( + clientId, + _serviceProvider.GetRequiredService>(), + clientSessionsManager, + _serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService>(), + _serviceProvider.GetRequiredService>()); } public IMqttClient CreateMqttClient() diff --git a/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs b/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs index fdecb32a..aa53e1b8 100644 --- a/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs +++ b/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs @@ -34,6 +34,7 @@ namespace MQTTnet services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); return services; } diff --git a/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs b/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs index 24826cb7..9a0721ff 100644 --- a/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs +++ b/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs @@ -1,6 +1,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using MQTTnet.Core.Adapter; using MQTTnet.Core.Channel; using MQTTnet.Core.Client; @@ -85,9 +86,15 @@ namespace MQTTnet }; } - public MqttClientSession CreateClientSession(string sessionId, MqttClientSessionsManager mqttClientSessionsManager) + public MqttClientSession CreateClientSession(string clientId, MqttClientSessionsManager clientSessionsManager) { - return new MqttClientSession(sessionId, mqttClientSessionsManager, _serviceProvider.GetRequiredService>(), _serviceProvider.GetRequiredService>()); + return new MqttClientSession( + clientId, + _serviceProvider.GetRequiredService>(), + clientSessionsManager, + _serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService>(), + _serviceProvider.GetRequiredService>()); } public IMqttClient CreateMqttClient() diff --git a/MQTTnet.Core/ApplicationMessagePublisherExtensions.cs b/MQTTnet.Core/ApplicationMessagePublisherExtensions.cs new file mode 100644 index 00000000..6893a1b6 --- /dev/null +++ b/MQTTnet.Core/ApplicationMessagePublisherExtensions.cs @@ -0,0 +1,16 @@ +using System; +using System.Threading.Tasks; + +namespace MQTTnet.Core +{ + public static class ApplicationMessagePublisherExtensions + { + public static Task PublishAsync(this IApplicationMessagePublisher client, params MqttApplicationMessage[] applicationMessages) + { + if (client == null) throw new ArgumentNullException(nameof(client)); + if (applicationMessages == null) throw new ArgumentNullException(nameof(applicationMessages)); + + return client.PublishAsync(applicationMessages); + } + } +} diff --git a/MQTTnet.Core/Client/MqttClientExtensions.cs b/MQTTnet.Core/Client/MqttClientExtensions.cs index ff61548b..567184d0 100644 --- a/MQTTnet.Core/Client/MqttClientExtensions.cs +++ b/MQTTnet.Core/Client/MqttClientExtensions.cs @@ -7,14 +7,6 @@ namespace MQTTnet.Core.Client { public static class MqttClientExtensions { - public static Task PublishAsync(this IApplicationMessagePublisher client, params MqttApplicationMessage[] applicationMessages) - { - if (client == null) throw new ArgumentNullException(nameof(client)); - if (applicationMessages == null) throw new ArgumentNullException(nameof(applicationMessages)); - - return client.PublishAsync(applicationMessages); - } - public static Task> SubscribeAsync(this IMqttClient client, params TopicFilter[] topicFilters) { if (client == null) throw new ArgumentNullException(nameof(client)); diff --git a/MQTTnet.Core/Client/IApplicationMessagePublisher.cs b/MQTTnet.Core/IApplicationMessagePublisher.cs similarity index 87% rename from MQTTnet.Core/Client/IApplicationMessagePublisher.cs rename to MQTTnet.Core/IApplicationMessagePublisher.cs index c77fd3f6..2f6715b8 100644 --- a/MQTTnet.Core/Client/IApplicationMessagePublisher.cs +++ b/MQTTnet.Core/IApplicationMessagePublisher.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -namespace MQTTnet.Core.Client +namespace MQTTnet.Core { public interface IApplicationMessagePublisher { diff --git a/MQTTnet.Core/Client/IApplicationMessageReceiver.cs b/MQTTnet.Core/IApplicationMessageReceiver.cs similarity index 78% rename from MQTTnet.Core/Client/IApplicationMessageReceiver.cs rename to MQTTnet.Core/IApplicationMessageReceiver.cs index 2d53cb8a..379ba69c 100644 --- a/MQTTnet.Core/Client/IApplicationMessageReceiver.cs +++ b/MQTTnet.Core/IApplicationMessageReceiver.cs @@ -1,6 +1,7 @@ using System; +using MQTTnet.Core.Client; -namespace MQTTnet.Core.Client +namespace MQTTnet.Core { public interface IApplicationMessageReceiver { diff --git a/MQTTnet.Core/ManagedClient/ManagedMqttClient.cs b/MQTTnet.Core/ManagedClient/ManagedMqttClient.cs index 61c0067a..4eb40b23 100644 --- a/MQTTnet.Core/ManagedClient/ManagedMqttClient.cs +++ b/MQTTnet.Core/ManagedClient/ManagedMqttClient.cs @@ -91,16 +91,15 @@ namespace MQTTnet.Core.ManagedClient return Task.FromResult(0); } - public Task PublishAsync(IEnumerable applicationMessages) + public async Task PublishAsync(IEnumerable applicationMessages) { if (applicationMessages == null) throw new ArgumentNullException(nameof(applicationMessages)); foreach (var applicationMessage in applicationMessages) { + await _storageManager.AddAsync(applicationMessage).ConfigureAwait(false); _messageQueue.Add(applicationMessage); } - - return Task.FromResult(0); } public Task SubscribeAsync(IEnumerable topicFilters) @@ -208,6 +207,7 @@ namespace MQTTnet.Core.ManagedClient } await TryPublishQueuedMessageAsync(message).ConfigureAwait(false); + await _storageManager.RemoveAsync(message).ConfigureAwait(false); } } catch (OperationCanceledException) diff --git a/MQTTnet.Core/ManagedClient/ManagedMqttClientExtensions.cs b/MQTTnet.Core/ManagedClient/ManagedMqttClientExtensions.cs index 62aa166f..a9984c4a 100644 --- a/MQTTnet.Core/ManagedClient/ManagedMqttClientExtensions.cs +++ b/MQTTnet.Core/ManagedClient/ManagedMqttClientExtensions.cs @@ -1,26 +1,18 @@ using System; using System.Threading.Tasks; -using MQTTnet.Core.Packets; namespace MQTTnet.Core.ManagedClient { public static class ManagedMqttClientExtensions { - public static Task EnqueueAsync(this ManagedMqttClient managedClient, params MqttApplicationMessage[] applicationMessages) - { - if (managedClient == null) throw new ArgumentNullException(nameof(managedClient)); - - return managedClient.EnqueueAsync(applicationMessages); - } - - public static Task SubscribeAsync(this ManagedMqttClient managedClient, params TopicFilter[] topicFilters) + public static Task SubscribeAsync(this IManagedMqttClient managedClient, params TopicFilter[] topicFilters) { if (managedClient == null) throw new ArgumentNullException(nameof(managedClient)); return managedClient.SubscribeAsync(topicFilters); } - public static Task UnsubscribeAsync(this ManagedMqttClient managedClient, params TopicFilter[] topicFilters) + public static Task UnsubscribeAsync(this IManagedMqttClient managedClient, params TopicFilter[] topicFilters) { if (managedClient == null) throw new ArgumentNullException(nameof(managedClient)); diff --git a/MQTTnet.Core/Client/MqttApplicationMessageReceivedEventArgs.cs b/MQTTnet.Core/MqttApplicationMessageReceivedEventArgs.cs similarity index 94% rename from MQTTnet.Core/Client/MqttApplicationMessageReceivedEventArgs.cs rename to MQTTnet.Core/MqttApplicationMessageReceivedEventArgs.cs index 98ebce5a..3de0db54 100644 --- a/MQTTnet.Core/Client/MqttApplicationMessageReceivedEventArgs.cs +++ b/MQTTnet.Core/MqttApplicationMessageReceivedEventArgs.cs @@ -1,6 +1,6 @@ using System; -namespace MQTTnet.Core.Client +namespace MQTTnet.Core { public sealed class MqttApplicationMessageReceivedEventArgs : EventArgs { diff --git a/MQTTnet.Core/Server/IMqttServer.cs b/MQTTnet.Core/Server/IMqttServer.cs index 58c4b74c..7d76c23c 100644 --- a/MQTTnet.Core/Server/IMqttServer.cs +++ b/MQTTnet.Core/Server/IMqttServer.cs @@ -11,6 +11,7 @@ namespace MQTTnet.Core.Server event EventHandler ClientDisconnected; IList GetConnectedClients(); + void Publish(IEnumerable applicationMessages); Task StartAsync(); Task StopAsync(); diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs index 2bd3617a..74d93f42 100644 --- a/MQTTnet.Core/Server/MqttClientSession.cs +++ b/MQTTnet.Core/Server/MqttClientSession.cs @@ -9,6 +9,7 @@ using MQTTnet.Core.Packets; using MQTTnet.Core.Protocol; using MQTTnet.Core.Serializer; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; namespace MQTTnet.Core.Server { @@ -16,8 +17,8 @@ namespace MQTTnet.Core.Server { private readonly HashSet _unacknowledgedPublishPackets = new HashSet(); - private readonly MqttClientSubscriptionsManager _subscriptionsManager = new MqttClientSubscriptionsManager(); - private readonly MqttClientSessionsManager _mqttClientSessionsManager; + private readonly MqttClientSubscriptionsManager _subscriptionsManager; + private readonly MqttClientSessionsManager _sessionsManager; private readonly MqttClientPendingMessagesQueue _pendingMessagesQueue; private readonly MqttServerOptions _options; private readonly ILogger _logger; @@ -26,14 +27,22 @@ namespace MQTTnet.Core.Server private CancellationTokenSource _cancellationTokenSource; private MqttApplicationMessage _willMessage; - public MqttClientSession(string clientId, MqttClientSessionsManager mqttClientSessionsManager, ILogger logger, ILogger msgQueueLogger) + public MqttClientSession( + string clientId, + IOptions options, + MqttClientSessionsManager sessionsManager, + MqttClientSubscriptionsManager subscriptionsManager, + ILogger logger, + ILogger messageQueueLogger) { - _mqttClientSessionsManager = mqttClientSessionsManager ?? throw new ArgumentNullException(nameof(mqttClientSessionsManager)); + _sessionsManager = sessionsManager ?? throw new ArgumentNullException(nameof(sessionsManager)); + _subscriptionsManager = subscriptionsManager ?? throw new ArgumentNullException(nameof(sessionsManager)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + ClientId = clientId; - _options = mqttClientSessionsManager.Options; - _pendingMessagesQueue = new MqttClientPendingMessagesQueue(mqttClientSessionsManager.Options, this, msgQueueLogger); + _options = options.Value; + _pendingMessagesQueue = new MqttClientPendingMessagesQueue(_options, this, messageQueueLogger); } public string ClientId { get; } @@ -84,7 +93,7 @@ namespace MQTTnet.Core.Server { if (_willMessage != null) { - _mqttClientSessionsManager.DispatchApplicationMessage(this, _willMessage); + _sessionsManager.DispatchApplicationMessage(this, _willMessage); } } } @@ -177,7 +186,7 @@ namespace MQTTnet.Core.Server private void EnqueueRetainedMessages(MqttSubscribePacket subscribePacket) { - var retainedMessages = _mqttClientSessionsManager.RetainedMessagesManager.GetMessages(subscribePacket); + var retainedMessages = _sessionsManager.RetainedMessagesManager.GetMessages(subscribePacket); foreach (var publishPacket in retainedMessages) { EnqueuePublishPacket(publishPacket.ToPublishPacket()); @@ -191,19 +200,19 @@ namespace MQTTnet.Core.Server if (applicationMessage.Retain) { - await _mqttClientSessionsManager.RetainedMessagesManager.HandleMessageAsync(ClientId, applicationMessage); + await _sessionsManager.RetainedMessagesManager.HandleMessageAsync(ClientId, applicationMessage); } switch (applicationMessage.QualityOfServiceLevel) { case MqttQualityOfServiceLevel.AtMostOnce: { - _mqttClientSessionsManager.DispatchApplicationMessage(this, applicationMessage); + _sessionsManager.DispatchApplicationMessage(this, applicationMessage); return; } case MqttQualityOfServiceLevel.AtLeastOnce: { - _mqttClientSessionsManager.DispatchApplicationMessage(this, applicationMessage); + _sessionsManager.DispatchApplicationMessage(this, applicationMessage); await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, new MqttPubAckPacket { PacketIdentifier = publishPacket.PacketIdentifier }); @@ -218,7 +227,7 @@ namespace MQTTnet.Core.Server _unacknowledgedPublishPackets.Add(publishPacket.PacketIdentifier); } - _mqttClientSessionsManager.DispatchApplicationMessage(this, applicationMessage); + _sessionsManager.DispatchApplicationMessage(this, applicationMessage); await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier }); diff --git a/MQTTnet.Core/Server/MqttClientSessionsManager.cs b/MQTTnet.Core/Server/MqttClientSessionsManager.cs index 09e07811..0e928671 100644 --- a/MQTTnet.Core/Server/MqttClientSessionsManager.cs +++ b/MQTTnet.Core/Server/MqttClientSessionsManager.cs @@ -11,7 +11,6 @@ using MQTTnet.Core.Protocol; using MQTTnet.Core.Serializer; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using MQTTnet.Core.Client; namespace MQTTnet.Core.Server { @@ -19,14 +18,19 @@ namespace MQTTnet.Core.Server { private readonly Dictionary _clientSessions = new Dictionary(); private readonly ILogger _logger; - private readonly IMqttClientSesssionFactory _mqttClientSesssionFactory; + private readonly IMqttClientSesssionFactory _clientSesssionFactory; + private readonly MqttServerOptions _options; - public MqttClientSessionsManager(IOptions options, ILogger logger, MqttClientRetainedMessagesManager retainedMessagesManager, IMqttClientSesssionFactory mqttClientSesssionFactory) + public MqttClientSessionsManager( + IOptions options, + ILogger logger, + MqttClientRetainedMessagesManager retainedMessagesManager, + IMqttClientSesssionFactory clientSesssionFactory) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - Options = options.Value ?? throw new ArgumentNullException(nameof(options)); + _options = options.Value ?? throw new ArgumentNullException(nameof(options)); RetainedMessagesManager = retainedMessagesManager ?? throw new ArgumentNullException(nameof(options)); - _mqttClientSesssionFactory = mqttClientSesssionFactory ?? throw new ArgumentNullException(nameof(mqttClientSesssionFactory)); + _clientSesssionFactory = clientSesssionFactory ?? throw new ArgumentNullException(nameof(clientSesssionFactory)); } public event EventHandler ClientConnected; @@ -34,14 +38,13 @@ namespace MQTTnet.Core.Server public event EventHandler ApplicationMessageReceived; public MqttClientRetainedMessagesManager RetainedMessagesManager { get; } - public MqttServerOptions Options { get; } public async Task RunClientSessionAsync(IMqttCommunicationAdapter clientAdapter) { var clientId = string.Empty; try { - if (!(await clientAdapter.ReceivePacketAsync(Options.DefaultCommunicationTimeout, CancellationToken.None).ConfigureAwait(false) is MqttConnectPacket connectPacket)) + if (!(await clientAdapter.ReceivePacketAsync(_options.DefaultCommunicationTimeout, CancellationToken.None).ConfigureAwait(false) is MqttConnectPacket connectPacket)) { throw new MqttProtocolViolationException("The first packet from a client must be a 'CONNECT' packet [MQTT-3.1.0-1]."); } @@ -50,11 +53,11 @@ namespace MQTTnet.Core.Server // Switch to the required protocol version before sending any response. clientAdapter.PacketSerializer.ProtocolVersion = connectPacket.ProtocolVersion; - + var connectReturnCode = ValidateConnection(connectPacket); if (connectReturnCode != MqttConnectReturnCode.ConnectionAccepted) { - await clientAdapter.SendPacketsAsync(Options.DefaultCommunicationTimeout, CancellationToken.None, new MqttConnAckPacket + await clientAdapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, CancellationToken.None, new MqttConnAckPacket { ConnectReturnCode = connectReturnCode }).ConfigureAwait(false); @@ -64,7 +67,7 @@ namespace MQTTnet.Core.Server var clientSession = GetOrCreateClientSession(connectPacket); - await clientAdapter.SendPacketsAsync(Options.DefaultCommunicationTimeout, CancellationToken.None, new MqttConnAckPacket + await clientAdapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, CancellationToken.None, new MqttConnAckPacket { ConnectReturnCode = connectReturnCode, IsSessionPresent = clientSession.IsExistingSession @@ -89,7 +92,7 @@ namespace MQTTnet.Core.Server { try { - await clientAdapter.DisconnectAsync(Options.DefaultCommunicationTimeout).ConfigureAwait(false); + await clientAdapter.DisconnectAsync(_options.DefaultCommunicationTimeout).ConfigureAwait(false); } catch (Exception) { @@ -147,9 +150,9 @@ namespace MQTTnet.Core.Server private MqttConnectReturnCode ValidateConnection(MqttConnectPacket connectPacket) { - if (Options.ConnectionValidator != null) + if (_options.ConnectionValidator != null) { - return Options.ConnectionValidator(connectPacket); + return _options.ConnectionValidator(connectPacket); } return MqttConnectReturnCode.ConnectionAccepted; @@ -181,7 +184,7 @@ namespace MQTTnet.Core.Server { isExistingSession = false; - clientSession = _mqttClientSesssionFactory.CreateClientSession(connectPacket.ClientId, this); + clientSession = _clientSesssionFactory.CreateClientSession(connectPacket.ClientId, this); _clientSessions[connectPacket.ClientId] = clientSession; _logger.LogTrace("Created a new session for client '{0}'.", connectPacket.ClientId); diff --git a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs index 390f8f35..14d63d96 100644 --- a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs +++ b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs @@ -9,6 +9,11 @@ namespace MQTTnet.Core.Server { private readonly Dictionary _subscribedTopics = new Dictionary(); + public MqttClientSubscriptionsManager() + { + + } + public MqttSubAckPacket Subscribe(MqttSubscribePacket subscribePacket) { if (subscribePacket == null) throw new ArgumentNullException(nameof(subscribePacket)); @@ -19,6 +24,8 @@ namespace MQTTnet.Core.Server { foreach (var topicFilter in subscribePacket.TopicFilters) { + + _subscribedTopics[topicFilter.Topic] = topicFilter.QualityOfServiceLevel; responsePacket.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS1); // TODO: Add support for QoS 2. } diff --git a/MQTTnet.Core/Server/MqttServer.cs b/MQTTnet.Core/Server/MqttServer.cs index 16e2e2ed..ff67e147 100644 --- a/MQTTnet.Core/Server/MqttServer.cs +++ b/MQTTnet.Core/Server/MqttServer.cs @@ -6,7 +6,6 @@ using MQTTnet.Core.Adapter; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.Linq; -using MQTTnet.Core.Client; namespace MQTTnet.Core.Server { @@ -46,7 +45,7 @@ namespace MQTTnet.Core.Server public event EventHandler ClientDisconnected; public event EventHandler ApplicationMessageReceived; - public Task PublishAsync(IEnumerable applicationMessages) + public void Publish(IEnumerable applicationMessages) { if (applicationMessages == null) throw new ArgumentNullException(nameof(applicationMessages)); @@ -60,7 +59,11 @@ namespace MQTTnet.Core.Server _options.ApplicationMessageInterceptor?.Invoke(applicationMessage); _clientSessionsManager.DispatchApplicationMessage(null, applicationMessage); } - + } + + public Task PublishAsync(IEnumerable applicationMessages) + { + Publish(applicationMessages); return Task.FromResult(0); } diff --git a/MQTTnet.Core/Server/MqttSubscribeResult.cs b/MQTTnet.Core/Server/MqttSubscribeResult.cs new file mode 100644 index 00000000..ef80af44 --- /dev/null +++ b/MQTTnet.Core/Server/MqttSubscribeResult.cs @@ -0,0 +1,11 @@ +using MQTTnet.Core.Packets; + +namespace MQTTnet.Core.Server +{ + public class MqttSubscribeResult + { + public MqttSubAckPacket ResponsePacket { get; set; } + + public bool CloseConnection { get; set; } + } +} diff --git a/Tests/MQTTnet.Core.Tests/TestClientSessionFactory.cs b/Tests/MQTTnet.Core.Tests/TestClientSessionFactory.cs index 519ef500..638df85d 100644 --- a/Tests/MQTTnet.Core.Tests/TestClientSessionFactory.cs +++ b/Tests/MQTTnet.Core.Tests/TestClientSessionFactory.cs @@ -1,12 +1,14 @@ -using MQTTnet.Core.Server; +using System; +using MQTTnet.Core.Server; namespace MQTTnet.Core.Tests { public class TestClientSessionFactory : IMqttClientSesssionFactory { - public MqttClientSession CreateClientSession(string sessionId, MqttClientSessionsManager mqttClientSessionsManager) + public MqttClientSession CreateClientSession(string clientId, MqttClientSessionsManager mqttClientSessionsManager) { - return new MqttClientSession(sessionId, mqttClientSessionsManager, new TestLogger(), new TestLogger()); + throw new NotImplementedException(); + //return new MqttClientSession(clientId, mqttClientSessionsManager, new TestLogger(), new TestLogger()); } } } diff --git a/Tests/MQTTnet.TestApp.NetCore/ManagedClientTest.cs b/Tests/MQTTnet.TestApp.NetCore/ManagedClientTest.cs index a02e72c4..7f6d430b 100644 --- a/Tests/MQTTnet.TestApp.NetCore/ManagedClientTest.cs +++ b/Tests/MQTTnet.TestApp.NetCore/ManagedClientTest.cs @@ -50,14 +50,14 @@ namespace MQTTnet.TestApp.NetCore Console.WriteLine(">> RECEIVED: " + e.ApplicationMessage.Topic); }; - await managedClient.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("1").Build()); - await managedClient.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("2").WithAtLeastOnceQoS().Build()); + await managedClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("1").Build()); + await managedClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("2").WithAtLeastOnceQoS().Build()); await managedClient.StartAsync(options); await managedClient.SubscribeAsync(new TopicFilter("xyz", MqttQualityOfServiceLevel.AtMostOnce)); - await managedClient.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("3").Build()); + await managedClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("3").Build()); Console.WriteLine("Managed client started."); Console.ReadLine(); diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml index e2b0a187..fac1a6c5 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml +++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml @@ -65,7 +65,6 @@ - Topic: @@ -84,6 +83,12 @@ + + + + + + diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs index 3663ba4c..32ff9f94 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs +++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs @@ -9,6 +9,7 @@ using MQTTnet.Core; using MQTTnet.Core.Client; using MQTTnet.Core.Diagnostics; using MQTTnet.Core.Protocol; +using MQTTnet.Core.Server; using MQTTnet.Implementations; namespace MQTTnet.TestApp.UniversalWindows @@ -16,6 +17,7 @@ namespace MQTTnet.TestApp.UniversalWindows public sealed partial class MainPage { private IMqttClient _mqttClient; + private IMqttServer _mqttServer; public MainPage() { @@ -319,5 +321,27 @@ namespace MQTTnet.TestApp.UniversalWindows }; } + + private async void StartServer(object sender, RoutedEventArgs e) + { + if (_mqttServer != null) + { + return; + } + + _mqttServer = new MqttFactory().CreateMqttServer(); + await _mqttServer.StartAsync(); + } + + private async void StopServer(object sender, RoutedEventArgs e) + { + if (_mqttServer == null) + { + return; + } + + await _mqttServer.StopAsync(); + _mqttServer = null; + } } } From e0797e5d14a2ffd54dc31ef05a0931fed2cfaacc Mon Sep 17 00:00:00 2001 From: JanEggers Date: Thu, 26 Oct 2017 21:45:36 +0200 Subject: [PATCH 07/19] enable uwp build again --- Build/build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Build/build.ps1 b/Build/build.ps1 index 5b766d6a..5e280e22 100644 --- a/Build/build.ps1 +++ b/Build/build.ps1 @@ -5,7 +5,7 @@ if ([string]::IsNullOrEmpty($version)) {$version = "0.0.1"} $msbuild = "MSBuild.exe" &dotnet build ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj -c="Release" /p:FileVersion=$version /p:AssemblyVersion=$version &dotnet build ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj -c="Release" /p:FileVersion=$version /p:AssemblyVersion=$version -##&$msbuild ..\Frameworks\MQTTnet.UniversalWindows\MQTTnet.UniversalWindows.csproj /t:Build /p:Configuration="Release" +&$msbuild ..\Frameworks\MQTTnet.UniversalWindows\MQTTnet.UniversalWindows.csproj /t:Build /p:Configuration="Release" Remove-Item .\NuGet -Force -Recurse New-Item -ItemType Directory -Force -Path .\NuGet From dd447f24d2d5bb229bc9e3405c69af3e56ef297e Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Fri, 27 Oct 2017 12:29:13 +0200 Subject: [PATCH 08/19] added LogId to options and use it to create logging scope --- MQTTnet.Core/Client/IMqttClientOptions.cs | 5 +++++ MQTTnet.Core/Client/MqttClient.cs | 2 +- MQTTnet.Core/Client/MqttClientOptions.cs | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/MQTTnet.Core/Client/IMqttClientOptions.cs b/MQTTnet.Core/Client/IMqttClientOptions.cs index d2bcf9d3..ae771922 100644 --- a/MQTTnet.Core/Client/IMqttClientOptions.cs +++ b/MQTTnet.Core/Client/IMqttClientOptions.cs @@ -6,6 +6,11 @@ namespace MQTTnet.Core.Client public interface IMqttClientOptions { string ClientId { get; } + + /// + /// The LogId is used to create a scope to correlate logging. If no value is provided the ClientId is used instead + /// + string LogId { get; } IMqttClientCredentials Credentials { get; } bool CleanSession { get; } MqttApplicationMessage WillMessage { get; } diff --git a/MQTTnet.Core/Client/MqttClient.cs b/MQTTnet.Core/Client/MqttClient.cs index b54288c7..a52ca13f 100644 --- a/MQTTnet.Core/Client/MqttClient.cs +++ b/MQTTnet.Core/Client/MqttClient.cs @@ -55,7 +55,7 @@ namespace MQTTnet.Core.Client _adapter = _communicationAdapterFactory.CreateClientMqttCommunicationAdapter(options); - _scopeHandle = _logger.BeginScope(options.ClientId); + _scopeHandle = _logger.BeginScope(options.LogId ?? options.ClientId); _logger.LogTrace("Trying to connect with server."); await _adapter.ConnectAsync(_options.CommunicationTimeout).ConfigureAwait(false); _logger.LogTrace("Connection with server established."); diff --git a/MQTTnet.Core/Client/MqttClientOptions.cs b/MQTTnet.Core/Client/MqttClientOptions.cs index 04cf8bdb..1b1c1bb8 100644 --- a/MQTTnet.Core/Client/MqttClientOptions.cs +++ b/MQTTnet.Core/Client/MqttClientOptions.cs @@ -9,6 +9,9 @@ namespace MQTTnet.Core.Client public string ClientId { get; set; } = Guid.NewGuid().ToString("N"); + /// + public string LogId { get; set; } + public bool CleanSession { get; set; } = true; public IMqttClientCredentials Credentials { get; set; } = new MqttClientCredentials(); From 9894dbef8796ebe5e2af79cbc80dd00ae0250331 Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Fri, 27 Oct 2017 12:29:26 +0200 Subject: [PATCH 09/19] fixed using --- Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs b/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs index c5da4e5a..18d121cf 100644 --- a/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs +++ b/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; -using MQTTnet.AspnetCore; +using MQTTnet.AspNetCore; using MQTTnet.Core; using MQTTnet.Core.Client; From ba16ae6568f64a56495e04c7798fe24b687a8303 Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Sat, 28 Oct 2017 10:34:25 +0200 Subject: [PATCH 10/19] Add interceptor for client subscriptions --- MQTTnet.Core/Client/MqttClient.cs | 59 ++++++++++--------- ...qttApplicationMessageInterceptorContext.cs | 7 +++ MQTTnet.Core/Server/MqttClientSession.cs | 42 ++++++++----- .../Server/MqttClientSubscribeResult.cs | 11 ++++ .../Server/MqttClientSubscriptionsManager.cs | 30 +++++++--- MQTTnet.Core/Server/MqttServer.cs | 10 +++- MQTTnet.Core/Server/MqttServerOptions.cs | 4 +- .../MqttSubscriptionInterceptorContext.cs | 19 ++++++ Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 5 +- .../MqttSubscriptionsManagerTests.cs | 9 +-- Tests/MQTTnet.TestApp.NetCore/ServerTest.cs | 10 ++-- 11 files changed, 140 insertions(+), 66 deletions(-) create mode 100644 MQTTnet.Core/Server/MqttApplicationMessageInterceptorContext.cs create mode 100644 MQTTnet.Core/Server/MqttClientSubscribeResult.cs create mode 100644 MQTTnet.Core/Server/MqttSubscriptionInterceptorContext.cs diff --git a/MQTTnet.Core/Client/MqttClient.cs b/MQTTnet.Core/Client/MqttClient.cs index b54288c7..914986c9 100644 --- a/MQTTnet.Core/Client/MqttClient.cs +++ b/MQTTnet.Core/Client/MqttClient.cs @@ -149,36 +149,36 @@ namespace MQTTnet.Core.Client switch (qosGroup.Key) { case MqttQualityOfServiceLevel.AtMostOnce: - { - // No packet identifier is used for QoS 0 [3.3.2.2 Packet Identifier] - await _adapter.SendPacketsAsync(_options.CommunicationTimeout, _cancellationTokenSource.Token, qosPackets); - break; - } + { + // No packet identifier is used for QoS 0 [3.3.2.2 Packet Identifier] + await _adapter.SendPacketsAsync(_options.CommunicationTimeout, _cancellationTokenSource.Token, qosPackets); + break; + } case MqttQualityOfServiceLevel.AtLeastOnce: + { + foreach (var publishPacket in qosPackets) { - foreach (var publishPacket in qosPackets) - { - publishPacket.PacketIdentifier = GetNewPacketIdentifier(); - await SendAndReceiveAsync(publishPacket); - } - - break; + publishPacket.PacketIdentifier = GetNewPacketIdentifier(); + await SendAndReceiveAsync(publishPacket); } + + break; + } case MqttQualityOfServiceLevel.ExactlyOnce: + { + foreach (var publishPacket in qosPackets) { - foreach (var publishPacket in qosPackets) - { - publishPacket.PacketIdentifier = GetNewPacketIdentifier(); - var pubRecPacket = await SendAndReceiveAsync(publishPacket).ConfigureAwait(false); - await SendAndReceiveAsync(pubRecPacket.CreateResponse()).ConfigureAwait(false); - } + publishPacket.PacketIdentifier = GetNewPacketIdentifier(); + var pubRecPacket = await SendAndReceiveAsync(publishPacket).ConfigureAwait(false); + await SendAndReceiveAsync(pubRecPacket.CreateResponse()).ConfigureAwait(false); + } - break; - } + break; + } default: - { - throw new InvalidOperationException(); - } + { + throw new InvalidOperationException(); + } } } } @@ -191,7 +191,7 @@ namespace MQTTnet.Core.Client Username = _options.Credentials?.Username, Password = _options.Credentials?.Password, CleanSession = _options.CleanSession, - KeepAlivePeriod = (ushort)_options.KeepAlivePeriod.TotalSeconds, + KeepAlivePeriod = (ushort) _options.KeepAlivePeriod.TotalSeconds, WillMessage = willApplicationMessage }; @@ -324,7 +324,7 @@ namespace MQTTnet.Core.Client if (publishPacket.QualityOfServiceLevel == MqttQualityOfServiceLevel.AtLeastOnce) { FireApplicationMessageReceivedEvent(publishPacket); - await SendAsync(new MqttPubAckPacket { PacketIdentifier = publishPacket.PacketIdentifier }); + await SendAsync(new MqttPubAckPacket {PacketIdentifier = publishPacket.PacketIdentifier}); return; } @@ -337,7 +337,7 @@ namespace MQTTnet.Core.Client } FireApplicationMessageReceivedEvent(publishPacket); - await SendAsync(new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier }); + await SendAsync(new MqttPubRecPacket {PacketIdentifier = publishPacket.PacketIdentifier}); return; } @@ -363,12 +363,12 @@ namespace MQTTnet.Core.Client { var packetAwaiter = _packetDispatcher.WaitForPacketAsync(requestPacket, typeof(TResponsePacket), _options.CommunicationTimeout); await _adapter.SendPacketsAsync(_options.CommunicationTimeout, _cancellationTokenSource.Token, requestPacket).ConfigureAwait(false); - return (TResponsePacket)await packetAwaiter.ConfigureAwait(false); + return (TResponsePacket) await packetAwaiter.ConfigureAwait(false); } private ushort GetNewPacketIdentifier() { - return (ushort)Interlocked.Increment(ref _latestPacketIdentifier); + return (ushort) Interlocked.Increment(ref _latestPacketIdentifier); } private async Task SendKeepAliveMessagesAsync(CancellationToken cancellationToken) @@ -465,7 +465,8 @@ namespace MQTTnet.Core.Client private void StartSendKeepAliveMessages(CancellationToken cancellationToken) { #pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed - Task.Factory.StartNew(() => SendKeepAliveMessagesAsync(cancellationToken), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default).ConfigureAwait(false); + Task.Factory.StartNew(() => SendKeepAliveMessagesAsync(cancellationToken), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default) + .ConfigureAwait(false); #pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed } } diff --git a/MQTTnet.Core/Server/MqttApplicationMessageInterceptorContext.cs b/MQTTnet.Core/Server/MqttApplicationMessageInterceptorContext.cs new file mode 100644 index 00000000..218a02dc --- /dev/null +++ b/MQTTnet.Core/Server/MqttApplicationMessageInterceptorContext.cs @@ -0,0 +1,7 @@ +namespace MQTTnet.Core.Server +{ + public class MqttApplicationMessageInterceptorContext + { + public MqttApplicationMessage ApplicationMessage { get; set; } + } +} diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs index 74d93f42..e1f84572 100644 --- a/MQTTnet.Core/Server/MqttClientSession.cs +++ b/MQTTnet.Core/Server/MqttClientSession.cs @@ -124,7 +124,7 @@ namespace MQTTnet.Core.Server while (!cancellationToken.IsCancellationRequested) { var packet = await adapter.ReceivePacketAsync(TimeSpan.Zero, cancellationToken).ConfigureAwait(false); - await ProcessReceivedPacketAsync(adapter, packet).ConfigureAwait(false); + await ProcessReceivedPacketAsync(adapter, packet, cancellationToken).ConfigureAwait(false); } } catch (OperationCanceledException) @@ -142,28 +142,35 @@ namespace MQTTnet.Core.Server } } - private async Task ProcessReceivedPacketAsync(IMqttCommunicationAdapter adapter, MqttBasePacket packet) + private async Task ProcessReceivedPacketAsync(IMqttCommunicationAdapter adapter, MqttBasePacket packet, CancellationToken cancellationToken) { if (packet is MqttSubscribePacket subscribePacket) { - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, _subscriptionsManager.Subscribe(subscribePacket)); + var subscribeResult = _subscriptionsManager.Subscribe(subscribePacket); + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, subscribeResult.ResponsePacket); EnqueueRetainedMessages(subscribePacket); + + if (subscribeResult.CloseConnection) + { + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttDisconnectPacket()); + Stop(); + } } else if (packet is MqttUnsubscribePacket unsubscribePacket) { - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, _subscriptionsManager.Unsubscribe(unsubscribePacket)); + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, _subscriptionsManager.Unsubscribe(unsubscribePacket)); } else if (packet is MqttPublishPacket publishPacket) { - await HandleIncomingPublishPacketAsync(adapter, publishPacket); + await HandleIncomingPublishPacketAsync(adapter, publishPacket, cancellationToken); } else if (packet is MqttPubRelPacket pubRelPacket) { - await HandleIncomingPubRelPacketAsync(adapter, pubRelPacket); + await HandleIncomingPubRelPacketAsync(adapter, pubRelPacket, cancellationToken); } else if (packet is MqttPubRecPacket pubRecPacket) { - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, pubRecPacket.CreateResponse()); + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, pubRecPacket.CreateResponse()); } else if (packet is MqttPubAckPacket || packet is MqttPubCompPacket) { @@ -171,7 +178,7 @@ namespace MQTTnet.Core.Server } else if (packet is MqttPingReqPacket) { - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, new MqttPingRespPacket()); + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttPingRespPacket()); } else if (packet is MqttDisconnectPacket || packet is MqttConnectPacket) { @@ -193,10 +200,17 @@ namespace MQTTnet.Core.Server } } - private async Task HandleIncomingPublishPacketAsync(IMqttCommunicationAdapter adapter, MqttPublishPacket publishPacket) + private async Task HandleIncomingPublishPacketAsync(IMqttCommunicationAdapter adapter, MqttPublishPacket publishPacket, CancellationToken cancellationToken) { var applicationMessage = publishPacket.ToApplicationMessage(); - _options.ApplicationMessageInterceptor?.Invoke(applicationMessage); + + var interceptorContext = new MqttApplicationMessageInterceptorContext + { + ApplicationMessage = applicationMessage + }; + + _options.ApplicationMessageInterceptor?.Invoke(interceptorContext); + applicationMessage = interceptorContext.ApplicationMessage; if (applicationMessage.Retain) { @@ -214,7 +228,7 @@ namespace MQTTnet.Core.Server { _sessionsManager.DispatchApplicationMessage(this, applicationMessage); - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttPubAckPacket { PacketIdentifier = publishPacket.PacketIdentifier }); return; @@ -229,7 +243,7 @@ namespace MQTTnet.Core.Server _sessionsManager.DispatchApplicationMessage(this, applicationMessage); - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier }); return; @@ -239,14 +253,14 @@ namespace MQTTnet.Core.Server } } - private Task HandleIncomingPubRelPacketAsync(IMqttCommunicationAdapter adapter, MqttPubRelPacket pubRelPacket) + private Task HandleIncomingPubRelPacketAsync(IMqttCommunicationAdapter adapter, MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken) { lock (_unacknowledgedPublishPackets) { _unacknowledgedPublishPackets.Remove(pubRelPacket.PacketIdentifier); } - return adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, new MqttPubCompPacket { PacketIdentifier = pubRelPacket.PacketIdentifier }); + return adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttPubCompPacket { PacketIdentifier = pubRelPacket.PacketIdentifier }); } } } diff --git a/MQTTnet.Core/Server/MqttClientSubscribeResult.cs b/MQTTnet.Core/Server/MqttClientSubscribeResult.cs new file mode 100644 index 00000000..17bfe9a5 --- /dev/null +++ b/MQTTnet.Core/Server/MqttClientSubscribeResult.cs @@ -0,0 +1,11 @@ +using MQTTnet.Core.Packets; + +namespace MQTTnet.Core.Server +{ + public class MqttClientSubscribeResult + { + public MqttSubAckPacket ResponsePacket { get; set; } + + public bool CloseConnection { get; set; } + } +} diff --git a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs index 14d63d96..7808276e 100644 --- a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs +++ b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.Options; using MQTTnet.Core.Packets; using MQTTnet.Core.Protocol; @@ -8,30 +9,45 @@ namespace MQTTnet.Core.Server public sealed class MqttClientSubscriptionsManager { private readonly Dictionary _subscribedTopics = new Dictionary(); + private readonly MqttServerOptions _options; - public MqttClientSubscriptionsManager() + public MqttClientSubscriptionsManager(IOptions options) { - + _options = options?.Value ?? throw new ArgumentNullException(nameof(options)); } - public MqttSubAckPacket Subscribe(MqttSubscribePacket subscribePacket) + public MqttClientSubscribeResult Subscribe(MqttSubscribePacket subscribePacket) { if (subscribePacket == null) throw new ArgumentNullException(nameof(subscribePacket)); var responsePacket = subscribePacket.CreateResponse(); + var closeConnection = false; lock (_subscribedTopics) { foreach (var topicFilter in subscribePacket.TopicFilters) { + var interceptorContext = new MqttSubscriptionInterceptorContext("", topicFilter); + _options.SubscriptionsInterceptor?.Invoke(interceptorContext); + responsePacket.SubscribeReturnCodes.Add(interceptorContext.AcceptSubscription ? MqttSubscribeReturnCode.SuccessMaximumQoS1 : MqttSubscribeReturnCode.Failure); + + if (interceptorContext.CloseConnection) + { + closeConnection = true; + } - - _subscribedTopics[topicFilter.Topic] = topicFilter.QualityOfServiceLevel; - responsePacket.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS1); // TODO: Add support for QoS 2. + if (interceptorContext.AcceptSubscription) + { + _subscribedTopics[topicFilter.Topic] = topicFilter.QualityOfServiceLevel; + } } } - return responsePacket; + return new MqttClientSubscribeResult + { + ResponsePacket = responsePacket, + CloseConnection = closeConnection + }; } public MqttUnsubAckPacket Unsubscribe(MqttUnsubscribePacket unsubscribePacket) diff --git a/MQTTnet.Core/Server/MqttServer.cs b/MQTTnet.Core/Server/MqttServer.cs index ff67e147..8f3800ce 100644 --- a/MQTTnet.Core/Server/MqttServer.cs +++ b/MQTTnet.Core/Server/MqttServer.cs @@ -56,8 +56,14 @@ namespace MQTTnet.Core.Server foreach (var applicationMessage in applicationMessages) { - _options.ApplicationMessageInterceptor?.Invoke(applicationMessage); - _clientSessionsManager.DispatchApplicationMessage(null, applicationMessage); + var interceptorContext = new MqttApplicationMessageInterceptorContext + { + ApplicationMessage = applicationMessage + }; + + _options.ApplicationMessageInterceptor?.Invoke(interceptorContext); + + _clientSessionsManager.DispatchApplicationMessage(null, interceptorContext.ApplicationMessage); } } diff --git a/MQTTnet.Core/Server/MqttServerOptions.cs b/MQTTnet.Core/Server/MqttServerOptions.cs index 25f7cc8e..4b096764 100644 --- a/MQTTnet.Core/Server/MqttServerOptions.cs +++ b/MQTTnet.Core/Server/MqttServerOptions.cs @@ -16,7 +16,9 @@ namespace MQTTnet.Core.Server public Func ConnectionValidator { get; set; } - public Func ApplicationMessageInterceptor { get; set; } + public Action ApplicationMessageInterceptor { get; set; } + + public Action SubscriptionsInterceptor { get; set; } public IMqttServerStorage Storage { get; set; } } diff --git a/MQTTnet.Core/Server/MqttSubscriptionInterceptorContext.cs b/MQTTnet.Core/Server/MqttSubscriptionInterceptorContext.cs new file mode 100644 index 00000000..93282d3b --- /dev/null +++ b/MQTTnet.Core/Server/MqttSubscriptionInterceptorContext.cs @@ -0,0 +1,19 @@ +namespace MQTTnet.Core.Server +{ + public class MqttSubscriptionInterceptorContext + { + public MqttSubscriptionInterceptorContext(string clientId, TopicFilter topicFilter) + { + ClientId = clientId; + TopicFilter = topicFilter; + } + + public string ClientId { get; } + + public TopicFilter TopicFilter { get; } + + public bool AcceptSubscription { get; set; } = true; + + public bool CloseConnection { get; set; } + } +} diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs index d548ff08..d3573a61 100644 --- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs @@ -245,10 +245,9 @@ namespace MQTTnet.Core.Tests [TestMethod] public async Task MqttServer_InterceptMessage() { - MqttApplicationMessage Interceptor(MqttApplicationMessage message) + void Interceptor(MqttApplicationMessageInterceptorContext context) { - message.Payload = Encoding.ASCII.GetBytes("extended"); - return message; + context.ApplicationMessage.Payload = Encoding.ASCII.GetBytes("extended"); } var serverAdapter = new TestMqttServerAdapter(); diff --git a/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs b/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs index e4777317..a2d26f94 100644 --- a/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs @@ -1,4 +1,5 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.Extensions.Options; +using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.Core.Packets; using MQTTnet.Core.Protocol; using MQTTnet.Core.Server; @@ -11,7 +12,7 @@ namespace MQTTnet.Core.Tests [TestMethod] public void MqttSubscriptionsManager_SubscribeSingleSuccess() { - var sm = new MqttClientSubscriptionsManager(); + var sm = new MqttClientSubscriptionsManager(new OptionsWrapper(new MqttServerOptions())); var sp = new MqttSubscribePacket(); sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce)); @@ -30,7 +31,7 @@ namespace MQTTnet.Core.Tests [TestMethod] public void MqttSubscriptionsManager_SubscribeSingleNoSuccess() { - var sm = new MqttClientSubscriptionsManager(); + var sm = new MqttClientSubscriptionsManager(new OptionsWrapper(new MqttServerOptions())); var sp = new MqttSubscribePacket(); sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce)); @@ -49,7 +50,7 @@ namespace MQTTnet.Core.Tests [TestMethod] public void MqttSubscriptionsManager_SubscribeAndUnsubscribeSingle() { - var sm = new MqttClientSubscriptionsManager(); + var sm = new MqttClientSubscriptionsManager(new OptionsWrapper(new MqttServerOptions())); var sp = new MqttSubscribePacket(); sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce)); diff --git a/Tests/MQTTnet.TestApp.NetCore/ServerTest.cs b/Tests/MQTTnet.TestApp.NetCore/ServerTest.cs index a0c64623..0a7d5575 100644 --- a/Tests/MQTTnet.TestApp.NetCore/ServerTest.cs +++ b/Tests/MQTTnet.TestApp.NetCore/ServerTest.cs @@ -35,16 +35,14 @@ namespace MQTTnet.TestApp.NetCore options.Storage = new RetainedMessageHandler(); - options.ApplicationMessageInterceptor = message => + options.ApplicationMessageInterceptor = context => { - if (MqttTopicFilterComparer.IsMatch(message.Topic, "/myTopic/WithTimestamp/#")) + if (MqttTopicFilterComparer.IsMatch(context.ApplicationMessage.Topic, "/myTopic/WithTimestamp/#")) { // Replace the payload with the timestamp. But also extending a JSON // based payload with the timestamp is a suitable use case. - message.Payload = Encoding.UTF8.GetBytes(DateTime.Now.ToString("O")); - } - - return message; + context.ApplicationMessage.Payload = Encoding.UTF8.GetBytes(DateTime.Now.ToString("O")); + } }; }); From 4a6f517e912f2e50aca391910402c187ce9c251c Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Sat, 28 Oct 2017 10:39:57 +0200 Subject: [PATCH 11/19] Refactoring --- Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 5 +++-- Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs index ede45c62..50cdddea 100644 --- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs +++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs @@ -98,7 +98,7 @@ namespace MQTTnet _serviceProvider.GetRequiredService>(), clientSessionsManager, _serviceProvider.GetRequiredService(), - _serviceProvider.GetRequiredService>(), + _serviceProvider.GetRequiredService>(), _serviceProvider.GetRequiredService>()); } @@ -119,8 +119,9 @@ namespace MQTTnet public IMqttServer CreateMqttServer(Action configure) { - var options = _serviceProvider.GetRequiredService>(); + if (configure == null) throw new ArgumentNullException(nameof(configure)); + var options = _serviceProvider.GetRequiredService>(); configure(options.Value); return _serviceProvider.GetRequiredService(); diff --git a/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs b/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs index 9a0721ff..67b8fe6d 100644 --- a/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs +++ b/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs @@ -111,5 +111,15 @@ namespace MQTTnet { return _serviceProvider.GetRequiredService(); } + + public IMqttServer CreateMqttServer(Action configure) + { + if (configure == null) throw new ArgumentNullException(nameof(configure)); + + var options = _serviceProvider.GetRequiredService>(); + configure(options.Value); + + return _serviceProvider.GetRequiredService(); + } } } \ No newline at end of file From 019ef1398e9ce4c1bded3c55f9de1d658f38b007 Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Sat, 28 Oct 2017 10:49:03 +0200 Subject: [PATCH 12/19] Fix breaking changes --- .../ServiceCollectionExtensions.cs | 21 ++++++++++++------- .../MainPage.xaml | 11 +++++++--- .../MainPage.xaml.cs | 6 +++++- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Frameworks/MQTTnet.UniversalWindows/ServiceCollectionExtensions.cs b/Frameworks/MQTTnet.UniversalWindows/ServiceCollectionExtensions.cs index 9b8e6f7b..362df4dd 100644 --- a/Frameworks/MQTTnet.UniversalWindows/ServiceCollectionExtensions.cs +++ b/Frameworks/MQTTnet.UniversalWindows/ServiceCollectionExtensions.cs @@ -14,20 +14,27 @@ namespace MQTTnet public static class ServiceCollectionExtensions { public static IServiceCollection AddMqttServer(this IServiceCollection services) + { + services.AddMqttServerServices(); + + services.AddSingleton(s => s.GetService()); + services.AddSingleton(); + + return services; + } + + public static IServiceCollection AddMqttServerServices(this IServiceCollection services) { services.AddOptions(); services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - - - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(s => s.GetService()); + services.AddSingleton(s => s.GetService()); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); return services; } @@ -42,7 +49,7 @@ namespace MQTTnet public static IServiceCollection AddMqttClient(this IServiceCollection services) { services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(s => s.GetService()); services.AddTransient(); services.AddTransient(); diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml index fac1a6c5..f0031b8b 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml +++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml @@ -84,9 +84,14 @@ - - - + + Port: + + + + + + diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs index 32ff9f94..76c0d073 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs +++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs @@ -329,7 +329,11 @@ namespace MQTTnet.TestApp.UniversalWindows return; } - _mqttServer = new MqttFactory().CreateMqttServer(); + _mqttServer = new MqttFactory().CreateMqttServer(o => + { + o.DefaultEndpointOptions.Port = int.Parse(ServerPort.Text); + }); + await _mqttServer.StartAsync(); } From 30df7d4c9ecf3284c2ec0a2d893fa4410e89092c Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Sat, 28 Oct 2017 13:19:04 +0200 Subject: [PATCH 13/19] Fix subscribe interceptor --- .../Implementations/MqttServerAdapter.cs | 3 + MQTTnet.Core/Server/MqttClientSession.cs | 68 +++++++++++-------- .../Server/MqttClientSessionsManager.cs | 8 +-- .../Server/MqttClientSubscriptionsManager.cs | 4 +- MQTTnet.Core/Server/MqttServer.cs | 2 +- 5 files changed, 51 insertions(+), 34 deletions(-) diff --git a/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttServerAdapter.cs b/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttServerAdapter.cs index 373cdac4..fc38fdfa 100644 --- a/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttServerAdapter.cs +++ b/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttServerAdapter.cs @@ -30,6 +30,7 @@ namespace MQTTnet.Implementations if (options.DefaultEndpointOptions.IsEnabled) { _defaultEndpointSocket = new StreamSocketListener(); + _defaultEndpointSocket.Control.NoDelay = true; await _defaultEndpointSocket.BindServiceNameAsync(options.GetDefaultEndpointPort().ToString(), SocketProtectionLevel.PlainSocket); _defaultEndpointSocket.ConnectionReceived += AcceptDefaultEndpointConnectionsAsync; } @@ -57,6 +58,8 @@ namespace MQTTnet.Implementations { try { + args.Socket.Control.NoDelay = true; + var clientAdapter = _mqttCommunicationAdapterFactory.CreateServerMqttCommunicationAdapter(new MqttTcpChannel(args.Socket)); ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter)); } diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs index e1f84572..903b3306 100644 --- a/MQTTnet.Core/Server/MqttClientSession.cs +++ b/MQTTnet.Core/Server/MqttClientSession.cs @@ -142,51 +142,65 @@ namespace MQTTnet.Core.Server } } - private async Task ProcessReceivedPacketAsync(IMqttCommunicationAdapter adapter, MqttBasePacket packet, CancellationToken cancellationToken) + private Task ProcessReceivedPacketAsync(IMqttCommunicationAdapter adapter, MqttBasePacket packet, CancellationToken cancellationToken) { - if (packet is MqttSubscribePacket subscribePacket) + if (packet is MqttPingReqPacket) { - var subscribeResult = _subscriptionsManager.Subscribe(subscribePacket); - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, subscribeResult.ResponsePacket); - EnqueueRetainedMessages(subscribePacket); + return adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttPingRespPacket()); + } - if (subscribeResult.CloseConnection) - { - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttDisconnectPacket()); - Stop(); - } - } - else if (packet is MqttUnsubscribePacket unsubscribePacket) + if (packet is MqttPublishPacket publishPacket) { - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, _subscriptionsManager.Unsubscribe(unsubscribePacket)); + return HandleIncomingPublishPacketAsync(adapter, publishPacket, cancellationToken); } - else if (packet is MqttPublishPacket publishPacket) + + if (packet is MqttPubRelPacket pubRelPacket) { - await HandleIncomingPublishPacketAsync(adapter, publishPacket, cancellationToken); + return HandleIncomingPubRelPacketAsync(adapter, pubRelPacket, cancellationToken); } - else if (packet is MqttPubRelPacket pubRelPacket) + + if (packet is MqttPubRecPacket pubRecPacket) { - await HandleIncomingPubRelPacketAsync(adapter, pubRelPacket, cancellationToken); + return adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, pubRecPacket.CreateResponse()); } - else if (packet is MqttPubRecPacket pubRecPacket) - { - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, pubRecPacket.CreateResponse()); - } - else if (packet is MqttPubAckPacket || packet is MqttPubCompPacket) + + if (packet is MqttPubAckPacket || packet is MqttPubCompPacket) { // Discard message. + return Task.FromResult(0); } - else if (packet is MqttPingReqPacket) + + if (packet is MqttSubscribePacket subscribePacket) { - await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttPingRespPacket()); + return HandleIncomingSubscribePacketAsync(adapter, subscribePacket, cancellationToken); } - else if (packet is MqttDisconnectPacket || packet is MqttConnectPacket) + + if (packet is MqttUnsubscribePacket unsubscribePacket) + { + return adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, _subscriptionsManager.Unsubscribe(unsubscribePacket)); + } + + if (packet is MqttDisconnectPacket || packet is MqttConnectPacket) { Stop(); + return Task.FromResult(0); } - else + + _logger.LogWarning("Client '{0}': Received not supported packet ({1}). Closing connection.", ClientId, packet); + Stop(); + + return Task.FromResult(0); + } + + private async Task HandleIncomingSubscribePacketAsync(IMqttCommunicationAdapter adapter, MqttSubscribePacket subscribePacket, CancellationToken cancellationToken) + { + var subscribeResult = _subscriptionsManager.Subscribe(subscribePacket, ClientId); + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, subscribeResult.ResponsePacket); + EnqueueRetainedMessages(subscribePacket); + + if (subscribeResult.CloseConnection) { - _logger.LogWarning("Client '{0}': Received not supported packet ({1}). Closing connection.", ClientId, packet); + await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttDisconnectPacket()); Stop(); } } diff --git a/MQTTnet.Core/Server/MqttClientSessionsManager.cs b/MQTTnet.Core/Server/MqttClientSessionsManager.cs index 0e928671..62cc1d82 100644 --- a/MQTTnet.Core/Server/MqttClientSessionsManager.cs +++ b/MQTTnet.Core/Server/MqttClientSessionsManager.cs @@ -39,12 +39,12 @@ namespace MQTTnet.Core.Server public MqttClientRetainedMessagesManager RetainedMessagesManager { get; } - public async Task RunClientSessionAsync(IMqttCommunicationAdapter clientAdapter) + public async Task RunClientSessionAsync(IMqttCommunicationAdapter clientAdapter, CancellationToken cancellationToken) { var clientId = string.Empty; try { - if (!(await clientAdapter.ReceivePacketAsync(_options.DefaultCommunicationTimeout, CancellationToken.None).ConfigureAwait(false) is MqttConnectPacket connectPacket)) + if (!(await clientAdapter.ReceivePacketAsync(_options.DefaultCommunicationTimeout, cancellationToken).ConfigureAwait(false) is MqttConnectPacket connectPacket)) { throw new MqttProtocolViolationException("The first packet from a client must be a 'CONNECT' packet [MQTT-3.1.0-1]."); } @@ -57,7 +57,7 @@ namespace MQTTnet.Core.Server var connectReturnCode = ValidateConnection(connectPacket); if (connectReturnCode != MqttConnectReturnCode.ConnectionAccepted) { - await clientAdapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, CancellationToken.None, new MqttConnAckPacket + await clientAdapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttConnAckPacket { ConnectReturnCode = connectReturnCode }).ConfigureAwait(false); @@ -67,7 +67,7 @@ namespace MQTTnet.Core.Server var clientSession = GetOrCreateClientSession(connectPacket); - await clientAdapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, CancellationToken.None, new MqttConnAckPacket + await clientAdapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttConnAckPacket { ConnectReturnCode = connectReturnCode, IsSessionPresent = clientSession.IsExistingSession diff --git a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs index 7808276e..1b0d6c4c 100644 --- a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs +++ b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs @@ -16,7 +16,7 @@ namespace MQTTnet.Core.Server _options = options?.Value ?? throw new ArgumentNullException(nameof(options)); } - public MqttClientSubscribeResult Subscribe(MqttSubscribePacket subscribePacket) + public MqttClientSubscribeResult Subscribe(MqttSubscribePacket subscribePacket, string clientId) { if (subscribePacket == null) throw new ArgumentNullException(nameof(subscribePacket)); @@ -27,7 +27,7 @@ namespace MQTTnet.Core.Server { foreach (var topicFilter in subscribePacket.TopicFilters) { - var interceptorContext = new MqttSubscriptionInterceptorContext("", topicFilter); + var interceptorContext = new MqttSubscriptionInterceptorContext(clientId, topicFilter); _options.SubscriptionsInterceptor?.Invoke(interceptorContext); responsePacket.SubscribeReturnCodes.Add(interceptorContext.AcceptSubscription ? MqttSubscribeReturnCode.SuccessMaximumQoS1 : MqttSubscribeReturnCode.Failure); diff --git a/MQTTnet.Core/Server/MqttServer.cs b/MQTTnet.Core/Server/MqttServer.cs index 8f3800ce..f1ed791e 100644 --- a/MQTTnet.Core/Server/MqttServer.cs +++ b/MQTTnet.Core/Server/MqttServer.cs @@ -109,7 +109,7 @@ namespace MQTTnet.Core.Server private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs eventArgs) { - eventArgs.SessionTask = Task.Run(async () => await _clientSessionsManager.RunClientSessionAsync(eventArgs.Client), _cancellationTokenSource.Token); + eventArgs.SessionTask = Task.Run(async () => await _clientSessionsManager.RunClientSessionAsync(eventArgs.Client, _cancellationTokenSource.Token), _cancellationTokenSource.Token); } private void OnClientConnected(object sender, MqttClientConnectedEventArgs eventArgs) From 275d8d9f0b43ad6149395cca6513d16259cb595b Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Sat, 28 Oct 2017 13:19:29 +0200 Subject: [PATCH 14/19] Fix unit tests --- Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs b/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs index a2d26f94..d46354c7 100644 --- a/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs @@ -17,7 +17,7 @@ namespace MQTTnet.Core.Tests var sp = new MqttSubscribePacket(); sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce)); - sm.Subscribe(sp); + sm.Subscribe(sp, ""); var pp = new MqttPublishPacket { @@ -36,7 +36,7 @@ namespace MQTTnet.Core.Tests var sp = new MqttSubscribePacket(); sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce)); - sm.Subscribe(sp); + sm.Subscribe(sp, ""); var pp = new MqttPublishPacket { @@ -55,7 +55,7 @@ namespace MQTTnet.Core.Tests var sp = new MqttSubscribePacket(); sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce)); - sm.Subscribe(sp); + sm.Subscribe(sp, ""); var pp = new MqttPublishPacket { From 802571765883222f2d990ef44a95a0bcbd115a8e Mon Sep 17 00:00:00 2001 From: JanEggers Date: Sat, 28 Oct 2017 16:40:10 +0200 Subject: [PATCH 15/19] migrate uwp platform to netstandard project --- Build/MQTTnet.nuspec | 4 +- Build/build.ps1 | 24 ++- .../{ => NetStandard}/MqttServerAdapter.cs | 7 +- .../{ => NetStandard}/MqttTcpChannel.cs | 5 +- .../Implementations/Uap}/MqttServerAdapter.cs | 5 +- .../Implementations/Uap}/MqttTcpChannel.cs | 5 +- .../MQTTnet.Netstandard.csproj | 19 +- .../Implementations/MqttWebSocketChannel.cs | 92 -------- .../Implementations/WebSocketStream.cs | 84 -------- .../MQTTnet.UniversalWindows.csproj | 200 ------------------ .../MQTTnet.UniversalWindows/MqttFactory.cs | 125 ----------- .../Properties/AssemblyInfo.cs | 14 -- .../Properties/MQTTnet.Universal.rd.xml | 5 - .../ServiceCollectionExtensions.cs | 70 ------ MQTTnet.sln | 21 +- 15 files changed, 54 insertions(+), 626 deletions(-) rename Frameworks/MQTTnet.NetStandard/Implementations/{ => NetStandard}/MqttServerAdapter.cs (99%) rename Frameworks/MQTTnet.NetStandard/Implementations/{ => NetStandard}/MqttTcpChannel.cs (99%) rename Frameworks/{MQTTnet.UniversalWindows/Implementations => MQTTnet.NetStandard/Implementations/Uap}/MqttServerAdapter.cs (98%) rename Frameworks/{MQTTnet.UniversalWindows/Implementations => MQTTnet.NetStandard/Implementations/Uap}/MqttTcpChannel.cs (99%) delete mode 100644 Frameworks/MQTTnet.UniversalWindows/Implementations/MqttWebSocketChannel.cs delete mode 100644 Frameworks/MQTTnet.UniversalWindows/Implementations/WebSocketStream.cs delete mode 100644 Frameworks/MQTTnet.UniversalWindows/MQTTnet.UniversalWindows.csproj delete mode 100644 Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs delete mode 100644 Frameworks/MQTTnet.UniversalWindows/Properties/AssemblyInfo.cs delete mode 100644 Frameworks/MQTTnet.UniversalWindows/Properties/MQTTnet.Universal.rd.xml delete mode 100644 Frameworks/MQTTnet.UniversalWindows/ServiceCollectionExtensions.cs diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec index 54c4c479..fe5d708b 100644 --- a/Build/MQTTnet.nuspec +++ b/Build/MQTTnet.nuspec @@ -47,8 +47,8 @@ - - + + diff --git a/Build/build.ps1 b/Build/build.ps1 index 5e280e22..6284473a 100644 --- a/Build/build.ps1 +++ b/Build/build.ps1 @@ -2,12 +2,20 @@ param([string]$version) if ([string]::IsNullOrEmpty($version)) {$version = "0.0.1"} -$msbuild = "MSBuild.exe" -&dotnet build ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj -c="Release" /p:FileVersion=$version /p:AssemblyVersion=$version -&dotnet build ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj -c="Release" /p:FileVersion=$version /p:AssemblyVersion=$version -&$msbuild ..\Frameworks\MQTTnet.UniversalWindows\MQTTnet.UniversalWindows.csproj /t:Build /p:Configuration="Release" +$vswhere = ${Env:\ProgramFiles(x86)} + '\Microsoft Visual Studio\Installer\vswhere' + +$path = &$vswhere -latest -products * -requires Microsoft.Component.MSBuild -property installationPath +if ($path) { + $msbuild = join-path $path 'MSBuild\15.0\Bin\MSBuild.exe' + + &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net451" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m + &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard1.3" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m + &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="uap10.0" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m + &dotnet build ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj -c="Release" /p:FileVersion=$version /p:AssemblyVersion=$version + + Remove-Item .\NuGet -Force -Recurse + New-Item -ItemType Directory -Force -Path .\NuGet + .\NuGet.exe pack MQTTnet.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $version + .\NuGet.exe pack MQTTnet.AspNetCore.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $version +} -Remove-Item .\NuGet -Force -Recurse -New-Item -ItemType Directory -Force -Path .\NuGet -.\NuGet.exe pack MQTTnet.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $version -.\NuGet.exe pack MQTTnet.AspNetCore.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $version \ No newline at end of file diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttServerAdapter.cs similarity index 99% rename from Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs rename to Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttServerAdapter.cs index 9e65715c..1a6e5b40 100644 --- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs +++ b/Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttServerAdapter.cs @@ -1,4 +1,6 @@ -using System; +#if NET451 || NETSTANDARD1_3 + +using System; using System.Net; using System.Net.Security; using System.Net.Sockets; @@ -143,4 +145,5 @@ namespace MQTTnet.Implementations } } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttTcpChannel.cs similarity index 99% rename from Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs rename to Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttTcpChannel.cs index aac8a3c2..62bb8787 100644 --- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs +++ b/Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttTcpChannel.cs @@ -1,3 +1,5 @@ +#if NET451 || NETSTANDARD1_3 + using System; using System.Net.Security; using System.Net.Sockets; @@ -155,4 +157,5 @@ namespace MQTTnet.Implementations } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttServerAdapter.cs similarity index 98% rename from Frameworks/MQTTnet.UniversalWindows/Implementations/MqttServerAdapter.cs rename to Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttServerAdapter.cs index fc38fdfa..7d9d25f1 100644 --- a/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttServerAdapter.cs +++ b/Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttServerAdapter.cs @@ -1,3 +1,5 @@ +#if NET451 || NETSTANDARD1_3 +#else using System; using System.Threading.Tasks; using MQTTnet.Core.Adapter; @@ -69,4 +71,5 @@ namespace MQTTnet.Implementations } } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttTcpChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttTcpChannel.cs similarity index 99% rename from Frameworks/MQTTnet.UniversalWindows/Implementations/MqttTcpChannel.cs rename to Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttTcpChannel.cs index 8fb45ab5..6e311d67 100644 --- a/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttTcpChannel.cs +++ b/Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttTcpChannel.cs @@ -1,3 +1,5 @@ +#if NET451 || NETSTANDARD1_3 +#else using System; using System.Collections.Generic; using System.IO; @@ -133,4 +135,5 @@ namespace MQTTnet.Implementations return result; } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj index f8dbcc9f..37b7e137 100644 --- a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj +++ b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj @@ -1,7 +1,7 @@  - netstandard1.3;net451 + netstandard1.3;net451;uap10.0 MQTTnet MQTTnet 2.5.0.0 @@ -14,6 +14,19 @@ + + false + UAP,Version=v10.0 + UAP + 10.0.15063.0 + 10.0.10240.0 + .NETCore + v5.0 + $(DefineConstants);WINDOWS_UWP + $(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets + + + @@ -34,4 +47,8 @@ + + + + \ No newline at end of file diff --git a/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttWebSocketChannel.cs b/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttWebSocketChannel.cs deleted file mode 100644 index 6145802b..00000000 --- a/Frameworks/MQTTnet.UniversalWindows/Implementations/MqttWebSocketChannel.cs +++ /dev/null @@ -1,92 +0,0 @@ -using MQTTnet.Core.Channel; -using MQTTnet.Core.Client; -using System; -using System.IO; -using System.Net.WebSockets; -using System.Security.Cryptography.X509Certificates; -using System.Threading; -using System.Threading.Tasks; - -namespace MQTTnet.Implementations -{ - public sealed class MqttWebSocketChannel : IMqttCommunicationChannel, IDisposable - { - private readonly MqttClientWebSocketOptions _options; - private ClientWebSocket _webSocket = new ClientWebSocket(); - - public MqttWebSocketChannel(MqttClientWebSocketOptions options) - { - _options = options ?? throw new ArgumentNullException(nameof(options)); - } - - public Stream RawReceiveStream { get; private set; } - public Stream SendStream => RawReceiveStream; - public Stream ReceiveStream => RawReceiveStream; - - public async Task ConnectAsync() - { - var uri = _options.Uri; - if (!uri.StartsWith("ws://", StringComparison.OrdinalIgnoreCase)) - { - uri = "ws://" + uri; - } - - _webSocket = new ClientWebSocket(); - - if (_options.RequestHeaders != null) - { - foreach (var requestHeader in _options.RequestHeaders) - { - _webSocket.Options.SetRequestHeader(requestHeader.Key, requestHeader.Value); - } - } - - if (_options.SubProtocols != null) - { - foreach (var subProtocol in _options.SubProtocols) - { - _webSocket.Options.AddSubProtocol(subProtocol); - } - } - - if (_options.CookieContainer != null) - { - _webSocket.Options.Cookies = _options.CookieContainer; - } - - if (_options.TlsOptions?.UseTls == true && _options.TlsOptions?.Certificates != null) - { - _webSocket.Options.ClientCertificates = new X509CertificateCollection(); - foreach (var certificate in _options.TlsOptions.Certificates) - { - _webSocket.Options.ClientCertificates.Add(new X509Certificate(certificate)); - } - } - - await _webSocket.ConnectAsync(new Uri(uri), CancellationToken.None).ConfigureAwait(false); - - RawReceiveStream = new WebSocketStream(_webSocket); - } - - public async Task DisconnectAsync() - { - RawReceiveStream = null; - - if (_webSocket == null) - { - return; - } - - if (_webSocket.State == WebSocketState.Open || _webSocket.State == WebSocketState.Connecting) - { - await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).ConfigureAwait(false); - } - } - - public void Dispose() - { - _webSocket?.Dispose(); - _webSocket = null; - } - } -} \ No newline at end of file diff --git a/Frameworks/MQTTnet.UniversalWindows/Implementations/WebSocketStream.cs b/Frameworks/MQTTnet.UniversalWindows/Implementations/WebSocketStream.cs deleted file mode 100644 index 718b5eec..00000000 --- a/Frameworks/MQTTnet.UniversalWindows/Implementations/WebSocketStream.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.IO; -using System.Net.WebSockets; -using System.Threading; -using System.Threading.Tasks; -using MQTTnet.Core.Exceptions; - -namespace MQTTnet.Implementations -{ - public class WebSocketStream : Stream - { - private readonly WebSocket _webSocket; - - public WebSocketStream(WebSocket webSocket) - { - _webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket)); - } - - public override void Flush() - { - } - - public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) - { - var currentOffset = offset; - var targetOffset = offset + count; - while (_webSocket.State == WebSocketState.Open && currentOffset < targetOffset) - { - var response = await _webSocket.ReceiveAsync(new ArraySegment(buffer, currentOffset, count), cancellationToken).ConfigureAwait(false); - currentOffset += response.Count; - count -= response.Count; - - if (response.MessageType == WebSocketMessageType.Close) - { - await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken).ConfigureAwait(false); - } - } - - if (_webSocket.State == WebSocketState.Closed) - { - throw new MqttCommunicationException("connection closed"); - } - - return currentOffset - offset; - } - - public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) - { - return _webSocket.SendAsync(new ArraySegment(buffer, offset, count), WebSocketMessageType.Binary, true, cancellationToken); - } - - public override int Read(byte[] buffer, int offset, int count) - { - return ReadAsync(buffer, offset, count).GetAwaiter().GetResult(); - } - - public override void Write(byte[] buffer, int offset, int count) - { - WriteAsync(buffer, offset, count).GetAwaiter().GetResult(); - } - - public override bool CanRead => true; - public override bool CanSeek => false; - public override bool CanWrite => true; - - public override long Length => throw new NotSupportedException(); - - public override long Position - { - get => throw new NotSupportedException(); - set => throw new NotSupportedException(); - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException(); - } - - public override void SetLength(long value) - { - throw new NotSupportedException(); - } - } -} diff --git a/Frameworks/MQTTnet.UniversalWindows/MQTTnet.UniversalWindows.csproj b/Frameworks/MQTTnet.UniversalWindows/MQTTnet.UniversalWindows.csproj deleted file mode 100644 index d8051f81..00000000 --- a/Frameworks/MQTTnet.UniversalWindows/MQTTnet.UniversalWindows.csproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - - Debug - AnyCPU - {BD60C727-D8E8-40C3-B8E3-C95A864AE611} - Library - Properties - MQTTnet - MQTTnet - en-US - UAP - 10.0.15063.0 - 10.0.10240.0 - 14 - 512 - {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - win10-arm;win10-arm-aot;win10-x86;win10-x86-aot;win10-x64;win10-x64-aot - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - prompt - 4 - CS1591 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - prompt - 4 - CS1591 - - - x86 - true - bin\x86\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008,CS1591 - full - x86 - false - prompt - - - x86 - bin\x86\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008,CS1591 - pdbonly - x86 - false - prompt - bin\x86\Release\MQTTnet.XML - - - ARM - true - bin\ARM\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008,CS1591 - full - ARM - false - prompt - - - ARM - bin\ARM\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008,CS1591 - pdbonly - ARM - false - prompt - bin\ARM\Release\MQTTnet.XML - - - x64 - true - bin\x64\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008,CS1591 - full - x64 - false - prompt - - - x64 - bin\x64\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008,CS1591 - pdbonly - x64 - false - prompt - false - bin\x64\Release\MQTTnet.XML - - - - - - - - - - - - - - {2ecb99e4-72d0-4c23-99ba-93d511d3967d} - MQTTnet.Core - - - - - 1.1.1 - - - 1.1.2 - - - 5.4.0 - - - - 14.0 - - - bin\Any CPU\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - true - pdbonly - AnyCPU - false - prompt - MinimumRecommendedRules.ruleset - - - bin\x86\Any CPU\ - TRACE;NETFX_CORE;WINDOWS_UWP - bin\x86\Release\MQTTnet.XML - true - ;2008 - true - pdbonly - x86 - false - prompt - MinimumRecommendedRules.ruleset - - - bin\ARM\Any CPU\ - TRACE;NETFX_CORE;WINDOWS_UWP - bin\ARM\Release\MQTTnet.XML - true - ;2008 - true - pdbonly - ARM - false - prompt - MinimumRecommendedRules.ruleset - - - bin\x64\Any CPU\ - TRACE;NETFX_CORE;WINDOWS_UWP - bin\x64\Release\MQTTnet.XML - true - ;2008 - true - pdbonly - x64 - false - prompt - MinimumRecommendedRules.ruleset - - - - \ No newline at end of file diff --git a/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs b/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs deleted file mode 100644 index 67b8fe6d..00000000 --- a/Frameworks/MQTTnet.UniversalWindows/MqttFactory.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using MQTTnet.Core.Adapter; -using MQTTnet.Core.Channel; -using MQTTnet.Core.Client; -using MQTTnet.Core.ManagedClient; -using MQTTnet.Core.Serializer; -using MQTTnet.Core.Server; -using MQTTnet.Implementations; - -namespace MQTTnet -{ - public class MqttFactory : IMqttCommunicationAdapterFactory, IMqttClientSesssionFactory, IMqttClientFactory, IMqttServerFactory - { - private readonly IServiceProvider _serviceProvider; - - private static IServiceProvider BuildServiceProvider() - { - var serviceProvider = new ServiceCollection() - .AddMqttClient() - .AddMqttServer() - .AddLogging() - .BuildServiceProvider(); - - serviceProvider.GetRequiredService() - .AddMqttTrace(); - - return serviceProvider; - } - - public MqttFactory() - : this(BuildServiceProvider()) - { - } - - public MqttFactory(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - public IMqttCommunicationAdapter CreateClientMqttCommunicationAdapter(IMqttClientOptions options) - { - var logger = _serviceProvider.GetRequiredService>(); - return new MqttChannelCommunicationAdapter(CreateMqttCommunicationChannel(options.ChannelOptions), CreateSerializer(options.ProtocolVersion), logger); - } - - public IMqttCommunicationAdapter CreateServerMqttCommunicationAdapter(IMqttCommunicationChannel channel) - { - var serializer = _serviceProvider.GetRequiredService(); - var logger = _serviceProvider.GetRequiredService>(); - return new MqttChannelCommunicationAdapter(channel, serializer, logger); - } - - public IMqttCommunicationChannel CreateMqttCommunicationChannel(IMqttClientChannelOptions options) - { - if (options == null) throw new ArgumentNullException(nameof(options)); - - switch (options) - { - case MqttClientTcpOptions tcpOptions: - return CreateTcpChannel(tcpOptions); - case MqttClientWebSocketOptions webSocketOptions: - return CreateWebSocketChannel(webSocketOptions); - default: - throw new NotSupportedException(); - } - } - - public MqttTcpChannel CreateTcpChannel(MqttClientTcpOptions tcpOptions) - { - return new MqttTcpChannel(tcpOptions); - } - - public MqttWebSocketChannel CreateWebSocketChannel(MqttClientWebSocketOptions webSocketOptions) - { - return new MqttWebSocketChannel(webSocketOptions); - } - - public MqttPacketSerializer CreateSerializer(MqttProtocolVersion protocolVersion) - { - return new MqttPacketSerializer - { - ProtocolVersion = protocolVersion - }; - } - - public MqttClientSession CreateClientSession(string clientId, MqttClientSessionsManager clientSessionsManager) - { - return new MqttClientSession( - clientId, - _serviceProvider.GetRequiredService>(), - clientSessionsManager, - _serviceProvider.GetRequiredService(), - _serviceProvider.GetRequiredService>(), - _serviceProvider.GetRequiredService>()); - } - - public IMqttClient CreateMqttClient() - { - return _serviceProvider.GetRequiredService(); - } - - public IManagedMqttClient CreateManagedMqttClient() - { - return _serviceProvider.GetRequiredService(); - } - - public IMqttServer CreateMqttServer() - { - return _serviceProvider.GetRequiredService(); - } - - public IMqttServer CreateMqttServer(Action configure) - { - if (configure == null) throw new ArgumentNullException(nameof(configure)); - - var options = _serviceProvider.GetRequiredService>(); - configure(options.Value); - - return _serviceProvider.GetRequiredService(); - } - } -} \ No newline at end of file diff --git a/Frameworks/MQTTnet.UniversalWindows/Properties/AssemblyInfo.cs b/Frameworks/MQTTnet.UniversalWindows/Properties/AssemblyInfo.cs deleted file mode 100644 index 57632880..00000000 --- a/Frameworks/MQTTnet.UniversalWindows/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MQTTnet")] -[assembly: AssemblyDescription("MQTTnet for Universal Windows")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Christian Kratky")] -[assembly: AssemblyProduct("MQTTnet")] -[assembly: AssemblyCopyright("Copyright © Christian Kratky 2016-2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: AssemblyVersion("2.5.0.0")] -[assembly: AssemblyFileVersion("2.5.0.0")] \ No newline at end of file diff --git a/Frameworks/MQTTnet.UniversalWindows/Properties/MQTTnet.Universal.rd.xml b/Frameworks/MQTTnet.UniversalWindows/Properties/MQTTnet.Universal.rd.xml deleted file mode 100644 index e6d24943..00000000 --- a/Frameworks/MQTTnet.UniversalWindows/Properties/MQTTnet.Universal.rd.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/Frameworks/MQTTnet.UniversalWindows/ServiceCollectionExtensions.cs b/Frameworks/MQTTnet.UniversalWindows/ServiceCollectionExtensions.cs deleted file mode 100644 index 362df4dd..00000000 --- a/Frameworks/MQTTnet.UniversalWindows/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using MQTTnet.Core.Adapter; -using MQTTnet.Core.Client; -using MQTTnet.Core.ManagedClient; -using MQTTnet.Core.Serializer; -using MQTTnet.Core.Server; -using MQTTnet.Implementations; -using System; -using Microsoft.Extensions.Logging; -using MQTTnet.Core.Diagnostics; - -namespace MQTTnet -{ - public static class ServiceCollectionExtensions - { - public static IServiceCollection AddMqttServer(this IServiceCollection services) - { - services.AddMqttServerServices(); - - services.AddSingleton(s => s.GetService()); - services.AddSingleton(); - - return services; - } - - public static IServiceCollection AddMqttServerServices(this IServiceCollection services) - { - services.AddOptions(); - services.AddSingleton(); - services.AddSingleton(s => s.GetService()); - services.AddSingleton(s => s.GetService()); - - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - return services; - } - - public static IServiceCollection AddMqttServer(this IServiceCollection services, Action configureOptions) - { - return services - .AddMqttServer() - .Configure(configureOptions); - } - - public static IServiceCollection AddMqttClient(this IServiceCollection services) - { - services.AddSingleton(); - services.AddSingleton(s => s.GetService()); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - return services; - } - - public static ILoggerFactory AddMqttTrace(this ILoggerFactory factory) - { - factory.AddProvider(new MqttNetTrace()); - return factory; - } - } -} diff --git a/MQTTnet.sln b/MQTTnet.sln index aae1e6e2..0bc9920f 100644 --- a/MQTTnet.sln +++ b/MQTTnet.sln @@ -1,12 +1,10 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27004.2005 +VisualStudioVersion = 15.0.27004.2002 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.Core.Tests", "Tests\MQTTnet.Core.Tests\MQTTnet.Core.Tests.csproj", "{A7FF0C91-25DE-4BA6-B39E-F54E8DADF1CC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MQTTnet.UniversalWindows", "Frameworks\MQTTnet.UniversalWindows\MQTTnet.UniversalWindows.csproj", "{BD60C727-D8E8-40C3-B8E3-C95A864AE611}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9248C2E1-B9D6-40BF-81EC-86004D7765B4}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Frameworks", "Frameworks", "{32A630A7-2598-41D7-B625-204CD906F5FB}" @@ -64,22 +62,6 @@ Global {A7FF0C91-25DE-4BA6-B39E-F54E8DADF1CC}.Release|x64.Build.0 = Release|Any CPU {A7FF0C91-25DE-4BA6-B39E-F54E8DADF1CC}.Release|x86.ActiveCfg = Release|Any CPU {A7FF0C91-25DE-4BA6-B39E-F54E8DADF1CC}.Release|x86.Build.0 = Release|Any CPU - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Debug|ARM.ActiveCfg = Debug|ARM - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Debug|ARM.Build.0 = Debug|ARM - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Debug|x64.ActiveCfg = Debug|x64 - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Debug|x64.Build.0 = Debug|x64 - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Debug|x86.ActiveCfg = Debug|x86 - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Debug|x86.Build.0 = Debug|x86 - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Release|Any CPU.Build.0 = Release|Any CPU - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Release|ARM.ActiveCfg = Release|ARM - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Release|ARM.Build.0 = Release|ARM - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Release|x64.ActiveCfg = Release|x64 - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Release|x64.Build.0 = Release|x64 - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Release|x86.ActiveCfg = Release|x86 - {BD60C727-D8E8-40C3-B8E3-C95A864AE611}.Release|x86.Build.0 = Release|x86 {2ECB99E4-72D0-4C23-99BA-93D511D3967D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2ECB99E4-72D0-4C23-99BA-93D511D3967D}.Debug|Any CPU.Build.0 = Debug|Any CPU {2ECB99E4-72D0-4C23-99BA-93D511D3967D}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -188,7 +170,6 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {A7FF0C91-25DE-4BA6-B39E-F54E8DADF1CC} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4} - {BD60C727-D8E8-40C3-B8E3-C95A864AE611} = {32A630A7-2598-41D7-B625-204CD906F5FB} {FF1F72D6-9524-4422-9497-3CC0002216ED} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4} {3587E506-55A2-4EB3-99C7-DC01E42D25D2} = {32A630A7-2598-41D7-B625-204CD906F5FB} {3D283AAD-AAA8-4339-8394-52F80B6304DB} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4} From 177c7cbf03d4714770b093abe026f63d848460b4 Mon Sep 17 00:00:00 2001 From: JanEggers Date: Sat, 28 Oct 2017 17:03:52 +0200 Subject: [PATCH 16/19] added appveyor config for ci and tests --- MQTTnet.sln | 1 + appveyor.yml | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 appveyor.yml diff --git a/MQTTnet.sln b/MQTTnet.sln index aae1e6e2..612fb0cf 100644 --- a/MQTTnet.sln +++ b/MQTTnet.sln @@ -19,6 +19,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.NetStandard", "Fram EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{67C28AC1-BC3A-420A-BE9C-FA2401431CF9}" ProjectSection(SolutionItems) = preProject + appveyor.yml = appveyor.yml Build\build.ps1 = Build\build.ps1 Build\MQTTnet.AspNetCore.nuspec = Build\MQTTnet.AspNetCore.nuspec Build\MQTTnet.nuspec = Build\MQTTnet.nuspec diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..334580f4 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,9 @@ +version: 1.0.{build} +image: Visual Studio 2017 +before_build: +- cmd: dotnet restore +build: + project: Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj + verbosity: minimal +test_script: +- cmd: dotnet test Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj \ No newline at end of file From 4ef16cfd8da014f79e3e7345dd578f1d5e070032 Mon Sep 17 00:00:00 2001 From: JanEggers Date: Sat, 28 Oct 2017 19:02:17 +0200 Subject: [PATCH 17/19] fixed project reference --- .../MQTTnet.TestApp.UniversalWindows.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj index e7c65f20..753bac9c 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj +++ b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj @@ -126,9 +126,9 @@ - - {bd60c727-d8e8-40c3-b8e3-c95a864ae611} - MQTTnet.UniversalWindows + + {3587e506-55a2-4eb3-99c7-dc01e42d25d2} + MQTTnet.NetStandard {2ecb99e4-72d0-4c23-99ba-93d511d3967d} From 08f2db05a93f4d04a831341a78a6d960fdc90440 Mon Sep 17 00:00:00 2001 From: JanEggers Date: Sun, 29 Oct 2017 21:21:24 +0100 Subject: [PATCH 18/19] Update appveyor.yml --- appveyor.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 334580f4..97816dd1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,9 +1,15 @@ version: 1.0.{build} image: Visual Studio 2017 before_build: -- cmd: dotnet restore +- cmd: >- + msbuild /t:restore + + cd Tests/MQTTnet.TestApp.AspNetCore2/ + + npm install + build: - project: Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj + project: MQTTnet.sln verbosity: minimal test_script: -- cmd: dotnet test Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj \ No newline at end of file +- cmd: vstest.console /logger:Appveyor Tests/MQTTnet.Core.Tests/bin/Release/net461/MQTTnet.Core.Tests.dll From c8846329f35ac7ddb1d78af6b4bddff412c273b1 Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Mon, 30 Oct 2017 10:40:09 +0100 Subject: [PATCH 19/19] added MQTT dev sign key for uwp project --- .gitignore | 1 - .../MQTTnet.TestApp.UniversalWindows.csproj | 2 +- ...net.TestApp.UniversalWindows_TemporaryKey.pfx | Bin 0 -> 2528 bytes .../Package.appxmanifest | 2 +- 4 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows_TemporaryKey.pfx diff --git a/.gitignore b/.gitignore index 39550dc5..d44c4553 100644 --- a/.gitignore +++ b/.gitignore @@ -197,7 +197,6 @@ ClientBin/ *.dbmdl *.dbproj.schemaview *.jfm -*.pfx *.publishsettings orleans.codegen.cs diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj index 753bac9c..42b16304 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj +++ b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj @@ -18,7 +18,7 @@ {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true MQTTnet.TestApp.UniversalWindows_TemporaryKey.pfx - 13E377A693C923EE9E88EE84B32A4B9881657362 + FA56408F253A1F7FCAC649611411B6B9F42BC4F9 win10;win10-arm;win10-arm-aot;win10-x86;win10-x86-aot;win10-x64;win10-x64-aot diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows_TemporaryKey.pfx b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..adf1e2aacadffd20968292c2b7ac9c2369018483 GIT binary patch literal 2528 zcmZWpc{JPk7Eg!}`&KHkRVlG17`rkE5>jha$G+B9YfEbvyIMbma3v^X~|Fx zVyUGFPpMsL5hXh1{btU4Gv}RmzUO}LXSw&D??2y*BEsewz>Fv&tPl#5O)*V5;s7&) zD~Pak2oaVH$O$MS)5-r>OxqA5(>fr30%8%$_Ma|xRxm>a5ps$mLQYV^P}cv-z;I3o zOWr5#I~nQH77Pr`V-O-_1}8*uPNCneJGm*@A5V3Tak+?bc$FUE5jTIyqj)WNg^WNu zh0lDqGB>GXrm?c>2(w*meH6}}u|XVQA%)yZVAg%PAm7)5b!1?be0R&_GlVs9B`cRA~#u$RjoqhkcRvK8k1mjs(g#Brq&1+fu2*4eZ>hsBp7P6#d2P?)Bua$i3IQ zyyl4e_52XRz109~Qax@neL9PR?K5_P{L3I2f?`06w%{gr#nZ-T>O2`iJ(A5>)|Z1szaQk2}l(A}(0PjrlYAKI#s zO)FIvr3~)gtFy{gDS7|00h_w(97X9EeQqFZO&KWBT~9w^o*pbae%H;fJPoPyULcXr ztQWKm9f_*7A@Ec^yZjBHI@L=WV zbLWOtj0NGXp9Aw;BO^1@u$w&-AHoNs+$0B^%>>zLW!rx8rCHPE@0l9a^k0*vtU8Ye zcx@dxW6B2)urrrkQy3fVWcMY+M@u}bOWZj0&lkmr^NpYRe8_&uVd*SbUoJ%zH#d9? zi!QtIn|+o}YEP7b3>CpN-#^m{ywa745m~Rh3A-uBEZW#@iXoWpX~%&NBLg zvxAkaD%6s{2p!c+8Hr3>N)gdy~VK$m)P9gp$ zmBq%d#=F0mH?fRPWccFy=wV|8qdNA+zmvM=Bo3l$c&&wZumR@2;$Ro+IjTWihhz6# z#*tMR=Dem)la67b1e3VtTGvyQgX#mdH{`r`Oj8T&$l1G=%3czUsko#kP7H(JA{Omb zM_Ll8i={i~Ru`cf-2J=X1W)Oc$2&-kH)zYeU)ctT#sV%o^@^0+PFi^i=&qe8+T*99 zG1yHTZq@t--1p@t`X+LiLaDvJDVm0PqV}n{-P<4i2cGWr%^W`L+w$Mc5asV5XzPv7 zR)^XmPu0hMBN&6FXmEJ0^pfCx&lk9M!{+j)!BNb1m=6oRS(i#y9~*h$PRBBQJjPlr z@MU-Kklpn9>L^jfq+3E5bEkbB0m}@Y6?Pu&>%06Cy-S@YQRwdxF>+U z0Hg}?1{7}qxq;My3KW1e0PYFW{Hxvr4$^MKKoqE|q8kS}0| zf`UL{KzM_0g2X{K!2PEZ2)Yh1Ljd0a1p`_Tz(avC!62W%y2L@2f7OKp%oBJ@D2m7! z_xH=0p%p~NU_c6B0E2+!^^XJo|CK+G6y_JfzjWizl^;)J)R>cRdg->|^r217)E1s( zA7S`B^LNgosh_bqPv@ml*sCqG9V{q!uHa)U#9!+&bKkU`6-~Bbn$q&?P*hScFJ!5Y z8EScz6_i#JcSk2^_YG|Pk$WuS){+h^?YwoZ#r?Ngf)Ogd2c|V)r=u$~HSQj~KR7@7 zcRZ=~VE#Jf?-;^1>?T0>`(D0@XF1pzPowd8q)9DVcXW$ctn02grJGLJvl;z*wkCMZ zl5(JRN{D2{kC_QfxnywGH#}gy%z4!gbEv3xGG4z056(%5W`4ZldD>hW(pgL|NK1%+ z4}B%@$9!V~PwwP7lS2RL@$2M$&>~Sow%5$7vSaxT}xV1&Q$49vxjH z*k}(|`-nGfyF}y_xc3=I0eLa=X-u){WktGAKF8>ZL5j_T<~1KuU5T%IZ98~pNSc*1 zVrw(*n8Z2w+3cG5FyX5IAshL@Ih%4L^UF1%ws<>vzH=Da#!VU$ro^2nC5JF<(icX5 zSsT(io`0nDPNDjGS^m_>_uX!}&V-n2X8Yn)h~(D7VthIW+ROb=+*|O)LGXfC`EYRs zlj12-$Pd%Lcw*?)Bz%AY&lh)Z76#%=F5L}6xWBgLW9MHyfR%*~5!%+`$Yic9zSYWS zbS!%&)x1_tGg~<}EG9h15vD~UDPKPLFn~f%>s18JYrVAYD{)mW+ThWW60K6PUPiSD(%&!9L7kKQhhh{8{_oSB~D z65|+=H-7S8B5k?Gj?q%*uO#Jm)CE7Iw?4AEapeN4LB?odRdVTAXw37?`tefO*{Z^Y zCh7~-qVXNy={EVFr}tM~zbBLG6NQSI!CQuTpW9r=8uM2Pm0P@>401KR@2T0Rh-+&j0`b literal 0 HcmV?d00001 diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/Package.appxmanifest b/Tests/MQTTnet.TestApp.UniversalWindows/Package.appxmanifest index d6a7c4c1..a3094c70 100644 --- a/Tests/MQTTnet.TestApp.UniversalWindows/Package.appxmanifest +++ b/Tests/MQTTnet.TestApp.UniversalWindows/Package.appxmanifest @@ -1,6 +1,6 @@  - + MQTTnet.TestApp.UniversalWindows