From 49b1706495a523f7a5f014ac8ebe77e80f5244c0 Mon Sep 17 00:00:00 2001
From: Christian
Date: Mon, 23 Oct 2017 18:55:26 +0200
Subject: [PATCH 001/149] Set theme jekyll-theme-modernist
---
_config.yml | 1 +
1 file changed, 1 insertion(+)
create mode 100644 _config.yml
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 00000000..cc35c1df
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-modernist
\ No newline at end of file
From 2fe520ad46bce037cde27e407fb53d48992f0fd4 Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Mon, 30 Oct 2017 11:01:32 +0100
Subject: [PATCH 002/149] fix uwp platformtarget for release build
---
.../MQTTnet.TestApp.UniversalWindows.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
index 42b16304..0d7e0394 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
@@ -166,7 +166,7 @@
;2008
true
pdbonly
- AnyCPU
+ x86
false
prompt
MinimumRecommendedRules.ruleset
From b51a603aa9f6fffe2428d5de0d6e39d8fa74ae14 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Mon, 30 Oct 2017 11:06:26 +0100
Subject: [PATCH 003/149] Update appveyor.yml
---
appveyor.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index 97816dd1..532d22a6 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,5 +1,6 @@
version: 1.0.{build}
image: Visual Studio 2017
+configuration: Release
before_build:
- cmd: >-
msbuild /t:restore
@@ -12,4 +13,4 @@ build:
project: MQTTnet.sln
verbosity: minimal
test_script:
-- cmd: vstest.console /logger:Appveyor Tests/MQTTnet.Core.Tests/bin/Release/net461/MQTTnet.Core.Tests.dll
+- cmd: vstest.console /logger:Appveyor Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll
From 98cac153e6803fb3841423dd9156a6e010cb8b5a Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Mon, 30 Oct 2017 11:13:20 +0100
Subject: [PATCH 004/149] Update appveyor.yml
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index 532d22a6..204ed14c 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -13,4 +13,4 @@ build:
project: MQTTnet.sln
verbosity: minimal
test_script:
-- cmd: vstest.console /logger:Appveyor Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll
+- cmd: vstest.console /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll"
From 5e74869dbc400ea3bd74d8d3682241c9a78e9429 Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Mon, 30 Oct 2017 11:23:18 +0100
Subject: [PATCH 005/149] updated testadapter
---
Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj b/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
index 7ba48954..802d96d8 100644
--- a/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
+++ b/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
@@ -8,8 +8,8 @@
-
-
+
+
From fcd3bdf297062a701390ce7ddfe53cc6f7f94c12 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Mon, 30 Oct 2017 11:28:10 +0100
Subject: [PATCH 006/149] Update appveyor.yml
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index 204ed14c..f91bf99c 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -13,4 +13,4 @@ build:
project: MQTTnet.sln
verbosity: minimal
test_script:
-- cmd: vstest.console /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll"
+- cmd: vstest.console /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll" /ListDiscoverers
From 44ae9093f9feff129631f91ed4017d784e09c580 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Mon, 30 Oct 2017 11:31:20 +0100
Subject: [PATCH 007/149] Update appveyor.yml
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index f91bf99c..43a852bc 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -13,4 +13,4 @@ build:
project: MQTTnet.sln
verbosity: minimal
test_script:
-- cmd: vstest.console /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll" /ListDiscoverers
+- cmd: vstest.console /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll" /UseVsixExtensions:true
From e969b2f31f23416e557819dde9a49fba14fa0118 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Mon, 30 Oct 2017 12:33:59 +0100
Subject: [PATCH 008/149] Update appveyor.yml
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index 43a852bc..35a75aa0 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -13,4 +13,4 @@ build:
project: MQTTnet.sln
verbosity: minimal
test_script:
-- cmd: vstest.console /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll" /UseVsixExtensions:true
+- cmd: dotnet vstest /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll" /UseVsixExtensions:true
From 4519c4fe3d7955387c0fc014e88aaf6251b56dd2 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Mon, 30 Oct 2017 12:36:27 +0100
Subject: [PATCH 009/149] Update appveyor.yml
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index 35a75aa0..fbfc84a2 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -13,4 +13,4 @@ build:
project: MQTTnet.sln
verbosity: minimal
test_script:
-- cmd: dotnet vstest /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll" /UseVsixExtensions:true
+- cmd: dotnet vstest /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll"
From 6240d6000339bd31f5ae32b885f41a938ff3839e Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Mon, 30 Oct 2017 12:41:40 +0100
Subject: [PATCH 010/149] Update appveyor.yml
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index fbfc84a2..253e07d9 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -13,4 +13,4 @@ build:
project: MQTTnet.sln
verbosity: minimal
test_script:
-- cmd: dotnet vstest /logger:Appveyor "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll"
+- cmd: dotnet vstest "%APPVEYOR_BUILD_FOLDER%\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.0\MQTTnet.Core.Tests.dll"
From 83821453a0d51109562ca99b5ce93848be59b8eb Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Mon, 30 Oct 2017 19:44:24 +0100
Subject: [PATCH 011/149] Refactor shared library. Extend error messages
---
.gitignore | 2 +-
.../MqttWebSocketServerAdapter.cs | 2 +-
...verAdapter.cs => MqttServerAdapter.Uwp.cs} | 19 +++++++++--------
.../{NetStandard => }/MqttServerAdapter.cs | 11 +++++-----
...qttTcpChannel.cs => MqttTcpChannel.Uwp.cs} | 3 +--
.../{NetStandard => }/MqttTcpChannel.cs | 0
.../Implementations/MqttWebSocketChannel.cs | 2 +-
Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 8 +++----
.../IMqttCommunicationAdapterFactory.cs | 4 ++--
MQTTnet.Core/Client/MqttClient.cs | 2 +-
MQTTnet.Core/Serializer/MqttPacketReader.cs | 20 ++++++++++++++----
.../MqttCommunicationAdapterFactory.cs | 4 ++--
.../MQTTnet.TestApp.UniversalWindows.csproj | 2 +-
....TestApp.UniversalWindows_TemporaryKey.pfx | Bin 0 -> 2504 bytes
.../MainPage.xaml | 4 +++-
.../MainPage.xaml.cs | 3 +++
.../Package.appxmanifest | 4 ++--
17 files changed, 53 insertions(+), 37 deletions(-)
rename Frameworks/MQTTnet.NetStandard/Implementations/{Uap/MqttServerAdapter.cs => MqttServerAdapter.Uwp.cs} (78%)
rename Frameworks/MQTTnet.NetStandard/Implementations/{NetStandard => }/MqttServerAdapter.cs (90%)
rename Frameworks/MQTTnet.NetStandard/Implementations/{Uap/MqttTcpChannel.cs => MqttTcpChannel.Uwp.cs} (99%)
rename Frameworks/MQTTnet.NetStandard/Implementations/{NetStandard => }/MqttTcpChannel.cs (100%)
create mode 100644 Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows_TemporaryKey.pfx
diff --git a/.gitignore b/.gitignore
index 39550dc5..4372f8ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -197,7 +197,7 @@ ClientBin/
*.dbmdl
*.dbproj.schemaview
*.jfm
-*.pfx
+# *.pfx
*.publishsettings
orleans.codegen.cs
diff --git a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
index 5cd5d555..45bf5457 100644
--- a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
+++ b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
@@ -36,7 +36,7 @@ namespace MQTTnet.AspNetCore
if (webSocket == null) throw new ArgumentNullException(nameof(webSocket));
var channel = new MqttWebSocketServerChannel(webSocket);
- var clientAdapter = _mqttCommunicationAdapterFactory.CreateServerMqttCommunicationAdapter(channel);
+ var clientAdapter = _mqttCommunicationAdapterFactory.CreateServerCommunicationAdapter(channel);
var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);
ClientAccepted?.Invoke(this, eventArgs);
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.Uwp.cs
similarity index 78%
rename from Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttServerAdapter.cs
rename to Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.Uwp.cs
index 7d9d25f1..658cfe83 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttServerAdapter.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.Uwp.cs
@@ -1,5 +1,4 @@
-#if NET451 || NETSTANDARD1_3
-#else
+#if WINDOWS_UWP
using System;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
@@ -12,13 +11,13 @@ namespace MQTTnet.Implementations
public class MqttServerAdapter : IMqttServerAdapter, IDisposable
{
private readonly ILogger _logger;
- private readonly IMqttCommunicationAdapterFactory _mqttCommunicationAdapterFactory;
+ private readonly IMqttCommunicationAdapterFactory _communicationAdapterFactory;
private StreamSocketListener _defaultEndpointSocket;
- public MqttServerAdapter(ILogger logger, IMqttCommunicationAdapterFactory mqttCommunicationAdapterFactory)
+ public MqttServerAdapter(ILogger logger, IMqttCommunicationAdapterFactory communicationAdapterFactory)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _mqttCommunicationAdapterFactory = mqttCommunicationAdapterFactory ?? throw new ArgumentNullException(nameof(mqttCommunicationAdapterFactory));
+ _communicationAdapterFactory = communicationAdapterFactory ?? throw new ArgumentNullException(nameof(communicationAdapterFactory));
}
public event EventHandler ClientAccepted;
@@ -32,7 +31,6 @@ 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;
}
@@ -45,6 +43,11 @@ namespace MQTTnet.Implementations
public Task StopAsync()
{
+ if (_defaultEndpointSocket != null)
+ {
+ _defaultEndpointSocket.ConnectionReceived -= AcceptDefaultEndpointConnectionsAsync;
+ }
+
_defaultEndpointSocket?.Dispose();
_defaultEndpointSocket = null;
@@ -60,9 +63,7 @@ namespace MQTTnet.Implementations
{
try
{
- args.Socket.Control.NoDelay = true;
-
- var clientAdapter = _mqttCommunicationAdapterFactory.CreateServerMqttCommunicationAdapter(new MqttTcpChannel(args.Socket));
+ var clientAdapter = _communicationAdapterFactory.CreateServerCommunicationAdapter(new MqttTcpChannel(args.Socket));
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
}
catch (Exception exception)
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
similarity index 90%
rename from Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttServerAdapter.cs
rename to Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
index 1a6e5b40..9d807b8b 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttServerAdapter.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
@@ -1,5 +1,4 @@
#if NET451 || NETSTANDARD1_3
-
using System;
using System.Net;
using System.Net.Security;
@@ -17,17 +16,17 @@ namespace MQTTnet.Implementations
public class MqttServerAdapter : IMqttServerAdapter, IDisposable
{
private readonly ILogger _logger;
- private readonly IMqttCommunicationAdapterFactory _mqttCommunicationAdapterFactory;
+ private readonly IMqttCommunicationAdapterFactory _communicationAdapterFactory;
private CancellationTokenSource _cancellationTokenSource;
private Socket _defaultEndpointSocket;
private Socket _tlsEndpointSocket;
private X509Certificate2 _tlsCertificate;
- public MqttServerAdapter(ILogger logger, IMqttCommunicationAdapterFactory mqttCommunicationAdapterFactory)
+ public MqttServerAdapter(ILogger logger, IMqttCommunicationAdapterFactory communicationAdapterFactory)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _mqttCommunicationAdapterFactory = mqttCommunicationAdapterFactory ?? throw new ArgumentNullException(nameof(mqttCommunicationAdapterFactory));
+ _communicationAdapterFactory = communicationAdapterFactory ?? throw new ArgumentNullException(nameof(communicationAdapterFactory));
}
public event EventHandler ClientAccepted;
@@ -104,7 +103,7 @@ namespace MQTTnet.Implementations
#else
var clientSocket = await _defaultEndpointSocket.AcceptAsync().ConfigureAwait(false);
#endif
- var clientAdapter = _mqttCommunicationAdapterFactory.CreateServerMqttCommunicationAdapter(new MqttTcpChannel(clientSocket, null));
+ var clientAdapter = _communicationAdapterFactory.CreateServerCommunicationAdapter(new MqttTcpChannel(clientSocket, null));
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
}
catch (Exception exception)
@@ -132,7 +131,7 @@ namespace MQTTnet.Implementations
var sslStream = new SslStream(new NetworkStream(clientSocket));
await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, SslProtocols.Tls12, false).ConfigureAwait(false);
- var clientAdapter = _mqttCommunicationAdapterFactory.CreateServerMqttCommunicationAdapter(new MqttTcpChannel(clientSocket, sslStream));
+ var clientAdapter = _communicationAdapterFactory.CreateServerCommunicationAdapter(new MqttTcpChannel(clientSocket, sslStream));
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
}
catch (Exception exception)
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttTcpChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
similarity index 99%
rename from Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttTcpChannel.cs
rename to Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
index 6e311d67..bd0614f5 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/Uap/MqttTcpChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
@@ -1,5 +1,4 @@
-#if NET451 || NETSTANDARD1_3
-#else
+#if WINDOWS_UWP
using System;
using System.Collections.Generic;
using System.IO;
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttTcpChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
similarity index 100%
rename from Frameworks/MQTTnet.NetStandard/Implementations/NetStandard/MqttTcpChannel.cs
rename to Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
index c120775b..1314a1c3 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
@@ -63,7 +63,7 @@ namespace MQTTnet.Implementations
}
}
- await _webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
+ await _webSocket.ConnectAsync(new Uri(uri), CancellationToken.None).ConfigureAwait(false);
RawReceiveStream = new WebSocketStream(_webSocket);
}
diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
index 50cdddea..432a3719 100644
--- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
+++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
@@ -45,20 +45,20 @@ namespace MQTTnet
return _serviceProvider.GetRequiredService();
}
- public IMqttCommunicationAdapter CreateClientMqttCommunicationAdapter(IMqttClientOptions options)
+ public IMqttCommunicationAdapter CreateClientCommunicationAdapter(IMqttClientOptions options)
{
var logger = _serviceProvider.GetRequiredService>();
- return new MqttChannelCommunicationAdapter(CreateMqttCommunicationChannel(options.ChannelOptions), CreateSerializer(options.ProtocolVersion), logger);
+ return new MqttChannelCommunicationAdapter(CreateCommunicationChannel(options.ChannelOptions), CreateSerializer(options.ProtocolVersion), logger);
}
- public IMqttCommunicationAdapter CreateServerMqttCommunicationAdapter(IMqttCommunicationChannel channel)
+ public IMqttCommunicationAdapter CreateServerCommunicationAdapter(IMqttCommunicationChannel channel)
{
var serializer = _serviceProvider.GetRequiredService();
var logger = _serviceProvider.GetRequiredService>();
return new MqttChannelCommunicationAdapter(channel, serializer, logger);
}
- public IMqttCommunicationChannel CreateMqttCommunicationChannel(IMqttClientChannelOptions options)
+ public IMqttCommunicationChannel CreateCommunicationChannel(IMqttClientChannelOptions options)
{
if (options == null) throw new ArgumentNullException(nameof(options));
diff --git a/MQTTnet.Core/Adapter/IMqttCommunicationAdapterFactory.cs b/MQTTnet.Core/Adapter/IMqttCommunicationAdapterFactory.cs
index ffcfd2c1..96098812 100644
--- a/MQTTnet.Core/Adapter/IMqttCommunicationAdapterFactory.cs
+++ b/MQTTnet.Core/Adapter/IMqttCommunicationAdapterFactory.cs
@@ -5,8 +5,8 @@ namespace MQTTnet.Core.Adapter
{
public interface IMqttCommunicationAdapterFactory
{
- IMqttCommunicationAdapter CreateClientMqttCommunicationAdapter(IMqttClientOptions options);
+ IMqttCommunicationAdapter CreateClientCommunicationAdapter(IMqttClientOptions options);
- IMqttCommunicationAdapter CreateServerMqttCommunicationAdapter(IMqttCommunicationChannel channel);
+ IMqttCommunicationAdapter CreateServerCommunicationAdapter(IMqttCommunicationChannel channel);
}
}
\ No newline at end of file
diff --git a/MQTTnet.Core/Client/MqttClient.cs b/MQTTnet.Core/Client/MqttClient.cs
index d16575b4..a8e4eba9 100644
--- a/MQTTnet.Core/Client/MqttClient.cs
+++ b/MQTTnet.Core/Client/MqttClient.cs
@@ -53,7 +53,7 @@ namespace MQTTnet.Core.Client
_latestPacketIdentifier = 0;
_packetDispatcher.Reset();
- _adapter = _communicationAdapterFactory.CreateClientMqttCommunicationAdapter(options);
+ _adapter = _communicationAdapterFactory.CreateClientCommunicationAdapter(options);
_scopeHandle = _logger.BeginScope(options.LogId ?? options.ClientId);
_logger.LogTrace("Trying to connect with server.");
diff --git a/MQTTnet.Core/Serializer/MqttPacketReader.cs b/MQTTnet.Core/Serializer/MqttPacketReader.cs
index 417c19a8..ce80cd50 100644
--- a/MQTTnet.Core/Serializer/MqttPacketReader.cs
+++ b/MQTTnet.Core/Serializer/MqttPacketReader.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
@@ -13,7 +14,7 @@ namespace MQTTnet.Core.Serializer
public sealed class MqttPacketReader : BinaryReader
{
private readonly ReceivedMqttPacket _receivedMqttPacket;
-
+
public MqttPacketReader(ReceivedMqttPacket receivedMqttPacket)
: base(receivedMqttPacket.Body, Encoding.UTF8, true)
{
@@ -70,6 +71,8 @@ namespace MQTTnet.Core.Serializer
var multiplier = 1;
var value = 0;
byte encodedByte;
+
+ var readBytes = new List();
do
{
if (cancellationToken.IsCancellationRequested)
@@ -77,14 +80,23 @@ namespace MQTTnet.Core.Serializer
throw new TaskCanceledException();
}
- encodedByte = (byte)stream.ReadByte();
- value += (encodedByte & 127) * multiplier;
+ var buffer = stream.ReadByte();
+ readBytes.Add(buffer);
+
+ ////if (buffer == -1)
+ ////{
+ //// break;
+ ////}
+
+ encodedByte = (byte)buffer;
+ value += (byte)(encodedByte & 127) * multiplier;
multiplier *= 128;
if (multiplier > 128 * 128 * 128)
{
- throw new MqttProtocolViolationException("Remaining length is invalid.");
+ throw new MqttProtocolViolationException($"Remaining length is invalid (Data={string.Join(",", readBytes)}).");
}
} while ((encodedByte & 128) != 0);
+
return value;
}
}
diff --git a/Tests/MQTTnet.Core.Tests/MqttCommunicationAdapterFactory.cs b/Tests/MQTTnet.Core.Tests/MqttCommunicationAdapterFactory.cs
index 7e3a7dca..0e56411c 100644
--- a/Tests/MQTTnet.Core.Tests/MqttCommunicationAdapterFactory.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttCommunicationAdapterFactory.cs
@@ -13,12 +13,12 @@ namespace MQTTnet.Core.Tests
_adapter = adapter;
}
- public IMqttCommunicationAdapter CreateClientMqttCommunicationAdapter(IMqttClientOptions options)
+ public IMqttCommunicationAdapter CreateClientCommunicationAdapter(IMqttClientOptions options)
{
return _adapter;
}
- public IMqttCommunicationAdapter CreateServerMqttCommunicationAdapter(IMqttCommunicationChannel channel)
+ public IMqttCommunicationAdapter CreateServerCommunicationAdapter(IMqttCommunicationChannel channel)
{
return _adapter;
}
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
index 753bac9c..096f72f6 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
+ 05F70CAF1426E296BE2F7396F0B654070D72B930
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..1adc8878176c4eac6fecb87e8c9868c5d1d510da
GIT binary patch
literal 2504
zcmZWpc|6oxAN~zv8EaY6NM^7@AhINTB-=>L5M5&_
z*|Mc1HzfOVNkT#;+^Ns|-urn!?>V3EInVcbzTb1sKj%S{AuVhmb~G7sof9HYHKy+H
zgSbFNWQZ@A4Dn>qZfG*c=l_v7=D=i*DHc7>iV;rU|8(*3fY^%2;B7P+{2495$@5>D
zb+`bSd&*MG7d9Z)z{bWk2quFEN5v~B9WOhIyz@_-^|OhhPdbge#-|?!wscFY{Ozi7+Mwe}L($;S2
zIJCK)s*3*I=q}MB5Zl^v7?<+eAGMgKwUj5sh&_xV;V=5%Yiq3Sye9RB8n2<@VinUS
zekMNg=A2*e3+s~j2tHY2>-y6GZe^k5c#Gj=utZ>2b53!8B7H&8P&WFG)}P2Yw~hG^
zhc<8F>je~i0f%qpAe)*(qHX-_ZEctI&(Bc^sIlbR%t*_I6C6@QY?@j;cQ-5ulW*0l
z)s7f!gxlucG+A8~IJl$&3COJLr>2q*=k@K$%NeIF07r#k$Z6r(4{tt=9nri@xf@Q#
z5oA2|BpE&H8l7}uY41}_FxVr%@w^CUC)nsfPOzj`gBjb8&*W=y@KQ0KNLY=WeH~JaiDUReo4*~A$IhBvWfv`hwOB0X6SNx^tZ&f#!ns)7ak&dm;rFj@OoUYMNupPtea*(jEO$
z4019C%|u%26=UZlx65Ts%j+i&GAMoCT|?qLHaFp|g;Jf)=I
zMy5TcAb+uH)A`E7_*QvYnA$et<5~R?KJI3N2ll_e%6Veo4_MJ!Xz2IE5oEY<|246w
zGcs!@Aj45-#2R0WnncGW73Mb?g~w!#!oF|8F$VUQ_~UumgTD2h%PC?+#@@WkOhu^>
z{iwr+Hsj8jOVTEiP=+J)AZue$qP7wWoo}c3Dt#_E-q@Gj7;^bI**MZJxzz27q&A2v
zte^h8!|KrXKGJg+TJc6MR6Y|sAhE?6gcc}3woJEV#ih9~*dJ9Gy0LH?Gq75xl$Tz1
z*3oM}aN^9%w+G>Qhg5`WDjF@=&znmckhJD}KN9DY&JQ5v1q_N!92#QYra;~YNr&U7qzwj$Myr~i5p$B*6DOH}HuwQpJ>
zK6MVUI(qhtikpGSq0jr|2q&pMj(aXH6
z{KgD|(bdu97oNHI;FUa7LUEq8Lsv7z6+S+Wucs1anT(7(fGR0ERU$0m`iK1Qc1=1Hk@5s(=Oy
zX|lMViU;7vLY}O8O;(o*tL~?!2B@>D)X>hH5Cu*U7(`Y-48mAQo(IeTU%(v*0Rn+g
zR(Jtd0XSgIT7NPDfHy0{vG5Hbh{Xl6@(|YXL4eP%E;wNEt1gU{d9bbwL6h0N|9LqV
zXAzm5z@lu}Kmcnq`&R+|ztt~BGH*&$$-4fu`e-sc{N=!?4nmM!Do!IC3qCTZp3sV4
z+86A&ps!O>2#XGS5UG1>%6ZE?OF#eWmjGeC%g>fwAr{WbOMjIf)B(L-=jMkHbqZ6>
zwha<(f3YK+g6JpbV5o~!|8zF{hoOS)w(?fYLkwi>J>tptj9aq46s2QhZztVx#iP~M
z>PHiID0=d9gQ$_O@^&JdrHPP^dqeID`RBsnR=J_`x>#L3=>pU~GlGrz%*4hdcBVgxRvzmz=b~qy
zexg^mb^9V+VE)o0t=;5MMUgd$S;FZ>%GXZYYfDav_35)${hs!38YxCie_Op+*ne{u
zy1L96U}d9_nYOvSEDNuv4l3O?^0_v;k6C#k7(>Y57p*KuxxZQ`Yew(8Sjn~}mc(EA
zVVnIehEu&mZo>sHQhr}9sHX@)%PEBJv=gLgJt;X=Jv&t{b{az{%<9?P;seH|)d}tP
z77gq0UJlpC)YPiyXq6U~J*#q^#xXu0()o8;Zm!7{eDQuB(L1KU?uRg9Ii9*w9|6
zA`$a@(?P@nfAt2NisGA}IgKd$YuO?m7bXk4fX|k!J=*
zkIL%J)%Pr($!n)QOcdp^5of#i7~^12Nl{OeS`PWbbKv9}fXq#_Z!hyq-`Gun@+N#e
z*9~!3AjxS@P(
ClientId:
-
+ Clean session:
+
+
TCP
WS
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
index 76c0d073..ab467404 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
@@ -81,6 +81,8 @@ namespace MQTTnet.TestApp.UniversalWindows
Password = Password.Text
};
+ options.CleanSession = CleanSession.IsChecked == true;
+
try
{
if (_mqttClient != null)
@@ -226,6 +228,7 @@ namespace MQTTnet.TestApp.UniversalWindows
.WithTcpServer("broker.hivemq.com")
.WithCredentials("bud", "%spencer%")
.WithTls()
+ .WithCleanSession()
.Build();
await client.ConnectAsync(options);
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/Package.appxmanifest b/Tests/MQTTnet.TestApp.UniversalWindows/Package.appxmanifest
index d6a7c4c1..b677c2aa 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/Package.appxmanifest
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/Package.appxmanifest
@@ -1,10 +1,10 @@
-
+
MQTTnet.TestApp.UniversalWindows
- chris
+ test
Assets\StoreLogo.png
From f0e8d8e98ce763bd29ea9efe145fe64ce8cd7ecd Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Tue, 31 Oct 2017 10:03:31 +0100
Subject: [PATCH 012/149] Update docs, extend UWP test app
---
README.md | 1 +
.../MainPage.xaml | 15 +++++++--------
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index 6e99af3f..b6400db6 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,7 @@
[](https://www.nuget.org/packages/MQTTnet)
+[](https://ci.appveyor.com/project/chkr1011/mqttnet/branch/develop)
[](https://bettercodehub.com/)
# MQTTnet
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
index e2d58bed..64d1d679 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
@@ -9,14 +9,12 @@
mc:Ignorable="d">
-
-
-
+
Server:
@@ -96,15 +94,16 @@
+
+
+
+
+
-
+
-
-
-
-
From d5dc3a1361c9e545080a76365dcca3cb6c0db83c Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Tue, 31 Oct 2017 10:34:27 +0100
Subject: [PATCH 013/149] Update docs
---
README.md | 40 +++++++++++++++++++++++++---------------
1 file changed, 25 insertions(+), 15 deletions(-)
diff --git a/README.md b/README.md
index b6400db6..eccffdc3 100644
--- a/README.md
+++ b/README.md
@@ -7,11 +7,13 @@
[](https://bettercodehub.com/)
# MQTTnet
-MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker). The implementation is based on the documentation from http://mqtt.org/.
-# Features
+MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker). The implementation is based on the documentation from .
+
+## Features
### General
+
* Async support
* TLS 1.2 support for client and server (but not UWP servers)
* Extensible communication channels (i.e. In-Memory, TCP, TCP+TLS, WS)
@@ -21,9 +23,10 @@ MQTTnet is a high performance .NET library for MQTT based communication. It prov
* Access to internal trace messages
* Unit tested (70+ tests)
-\* Tested on local machine with MQTTnet client and server running in the same process using the TCP channel. The app for verification is part of this repository and stored in _/Tests/MQTTnet.TestApp.NetFramework_.
+\* Tested on local machine with MQTTnet client and server running in the same process using the TCP channel. The app for verification is part of this repository and stored in _/Tests/MQTTnet.TestApp.NetCore_.
### Client
+
* Communication via TCP (+TLS) or WS (WebSocket) supported
* Included core _MqttClient_ with low level functionality
* Also included _ManagedMqttClient_ which maintains the connection and subscriptions automatically. Also application messages are queued and re-scheduled for higher QoS levels automatically.
@@ -31,16 +34,18 @@ MQTTnet is a high performance .NET library for MQTT based communication. It prov
* Compatible with Microsoft Azure IoT Hub
### Server (broker)
+
* List of connected clients available
* Supports connected clients with different protocol versions at the same time
* Able to publish its own messages (no loopback client required)
* Able to receive every message (no loopback client required)
* Extensible client credential validation
* Retained messages are supported including persisting via interface methods (own implementation required)
-* WebSockets supported (via ASP.NET Core 2.0)
+* WebSockets supported (via ASP.NET Core 2.0, separate nuget)
* A custom message interceptor can be added which allows transforming or extending every received application message
-# Supported frameworks
+## Supported frameworks
+
* .NET Standard 1.3+
* .NET Core 1.1+
* .NET Core App 1.1+
@@ -48,28 +53,33 @@ MQTTnet is a high performance .NET library for MQTT based communication. It prov
* Universal Windows (UWP) 10.0.10240+ (x86, x64, ARM, AnyCPU)
* Mono 5.2+
-# Supported MQTT versions
+## Supported MQTT versions
+
* 3.1.1
* 3.1.0
-# Nuget
-This library is available as a nuget package: https://www.nuget.org/packages/MQTTnet/
+## Nuget
-# Examples
-Please find examples and the documentation at the Wiki of this repository (https://github.com/chkr1011/MQTTnet/wiki).
+This library is available as a nuget package:
+
+## Examples
+
+Please find examples and the documentation at the Wiki of this repository ().
+
+## Contributions
-# Contributions
If you want to contribute to this project just create a pull request. But only pull requests which are matching the code style of this library will be accepted. Before creating a pull request please have a look at the library to get an overview of the required style.
-# References
+## References
+
This library is used in the following projects:
-* MQTT Client Rx (Wrapper for Reactive Extensions, https://github.com/1iveowl/MQTTClient.rx)
-* Wirehome (Open Source Home Automation system for .NET, https://github.com/chkr1011/Wirehome)
+* MQTT Client Rx (Wrapper for Reactive Extensions, )
+* Wirehome (Open Source Home Automation system for .NET, )
If you use this library and want to see your project here please let me know.
-# MIT License
+## MIT License
Copyright (c) 2017 Christian Kratky
From 9c46b8fd7518e02e9970a4599747157ebdee65e0 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Tue, 31 Oct 2017 14:10:39 +0100
Subject: [PATCH 014/149] Fix handling of closed streams
---
.../Adapter/MqttChannelCommunicationAdapter.cs | 6 +++++-
MQTTnet.Core/Serializer/MqttPacketReader.cs | 16 +++++++++++-----
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
index d47d4cee..7084227b 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
@@ -151,7 +151,7 @@ namespace MQTTnet.Core.Adapter
receivedMqttPacket = await ReceiveAsync(_channel.ReceiveStream, cancellationToken).ConfigureAwait(false);
}
- if (cancellationToken.IsCancellationRequested)
+ if (receivedMqttPacket == null || cancellationToken.IsCancellationRequested)
{
throw new TaskCanceledException();
}
@@ -190,6 +190,10 @@ namespace MQTTnet.Core.Adapter
private static async Task ReceiveAsync(Stream stream, CancellationToken cancellationToken)
{
var header = MqttPacketReader.ReadHeaderFromSource(stream, cancellationToken);
+ if (header == null)
+ {
+ return null;
+ }
if (header.BodyLength == 0)
{
diff --git a/MQTTnet.Core/Serializer/MqttPacketReader.cs b/MQTTnet.Core/Serializer/MqttPacketReader.cs
index ce80cd50..97b6478c 100644
--- a/MQTTnet.Core/Serializer/MqttPacketReader.cs
+++ b/MQTTnet.Core/Serializer/MqttPacketReader.cs
@@ -25,7 +25,13 @@ namespace MQTTnet.Core.Serializer
public static MqttPacketHeader ReadHeaderFromSource(Stream stream, CancellationToken cancellationToken)
{
- var fixedHeader = (byte)stream.ReadByte();
+ var buffer = stream.ReadByte();
+ if (buffer == -1)
+ {
+ return null;
+ }
+
+ var fixedHeader = (byte)buffer;
var controlPacketType = (MqttControlPacketType)(fixedHeader >> 4);
var bodyLength = ReadBodyLengthFromSource(stream, cancellationToken);
@@ -83,10 +89,10 @@ namespace MQTTnet.Core.Serializer
var buffer = stream.ReadByte();
readBytes.Add(buffer);
- ////if (buffer == -1)
- ////{
- //// break;
- ////}
+ if (buffer == -1)
+ {
+ break;
+ }
encodedByte = (byte)buffer;
value += (byte)(encodedByte & 127) * multiplier;
From c5e3bc70b16ef5bb79ba72ac0d48bbf5256aa6ce Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Tue, 31 Oct 2017 14:26:29 +0100
Subject: [PATCH 015/149] Update docs
---
Build/MQTTnet.AspNetCore.nuspec | 2 --
Build/MQTTnet.nuspec | 8 +++++---
README.md | 4 +++-
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/Build/MQTTnet.AspNetCore.nuspec b/Build/MQTTnet.AspNetCore.nuspec
index eb5f637f..df0b9a4f 100644
--- a/Build/MQTTnet.AspNetCore.nuspec
+++ b/Build/MQTTnet.AspNetCore.nuspec
@@ -15,7 +15,6 @@
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
-
@@ -25,6 +24,5 @@
-
\ No newline at end of file
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index fe5d708b..e8169020 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -10,20 +10,22 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).
- * [Core] Merged the .NET Framwork and netstandard projects (Thanks to @JanEggers)
+ * [Core] Merged the platform specific projects (Thanks to @JanEggers)
* [Core] Migrated the trace to a non-static approach (Breaking Change!)
* [Core] Added a builder for application messages using a fluent API
-* [Core] Introduced CI (Thanks to @JanEggers)
+* [Core] Introduced CI and DI (Thanks to @JanEggers)
* [Core] Added interfaces for publishing and receiving which applies to every client and server (Thanks to @ChristianRiedl)
+* [Core] Fixed an issue when reading from closed streams
* [Client] Added a first version of a managed client which will manage the connection, subscription etc. automatically (Thanks to @JTrotta)
* [Client] The session state response from the server is now returned in the _ConnectAsync_ method and also part of the _Connected_ event args
* [Client] Added a _TopicFilterBuilder_ using a fluent API (Namespace Changes!)
* [Client] Added several new options for the WebSocket channel (Thanks to @ChristianRiedl)
* [Client] Refactored the options and added a builder using a fluent API (Breaking Change!)
* [Client] Added more options for WebSocket connections like RequestHeaders, SubProtocol etc.
-* [Server] Added support for WebSockets via ASP.NET Core 2.0 (Thanks to @ChristianRiedl)
+* [Server] Added support for WebSockets via ASP.NET Core 2.0 (additional nuget) (Thanks to @ChristianRiedl, @JanEggers)
* [Server] Added support for a custom application message interceptor
* [Server] Fixed an issue with dropped connections on UWP (Thanks to @haeberle)
+* [Server] Added support for a custom subscription interceptor which allows denying of subscriptions and closing the connection
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
diff --git a/README.md b/README.md
index eccffdc3..985c2837 100644
--- a/README.md
+++ b/README.md
@@ -49,9 +49,11 @@ MQTTnet is a high performance .NET library for MQTT based communication. It prov
* .NET Standard 1.3+
* .NET Core 1.1+
* .NET Core App 1.1+
+* Universal Windows Platform (UWP) 10.0.10240+ (x86, x64, ARM, AnyCPU)
* .NET Framework 4.5.2+ (x86, x64, AnyCPU)
-* Universal Windows (UWP) 10.0.10240+ (x86, x64, ARM, AnyCPU)
* Mono 5.2+
+* Xamarin.Android 7.5+
+* Xamarin.iOS 10.14+
## Supported MQTT versions
From 3a6df2eab0d64540e19bd53bb43311c300d8961b Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Tue, 31 Oct 2017 14:38:24 +0100
Subject: [PATCH 016/149] Fix unit tests
---
Build/MQTTnet.AspNetCore.nuspec | 2 +-
Build/MQTTnet.nuspec | 2 +-
.../MqttPacketReaderTests.cs | 20 +++++++++++++++++++
Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 4 ++--
4 files changed, 24 insertions(+), 4 deletions(-)
create mode 100644 Tests/MQTTnet.Core.Tests/MqttPacketReaderTests.cs
diff --git a/Build/MQTTnet.AspNetCore.nuspec b/Build/MQTTnet.AspNetCore.nuspec
index df0b9a4f..9cf4005e 100644
--- a/Build/MQTTnet.AspNetCore.nuspec
+++ b/Build/MQTTnet.AspNetCore.nuspec
@@ -13,7 +13,7 @@
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
+ MQTT Message Queue Telemetry Transport MQTTClient MQTTServer Server MQTTBroker Broker NETStandard IoT InternetOfThings Messaging Hardware Arduino Sensor Actuator M2M ESP Smart Home Cities Automation Xamarin
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index e8169020..4631f247 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -28,7 +28,7 @@
* [Server] Added support for a custom subscription interceptor which allows denying of subscriptions and closing the connection
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
+ MQTT Message Queue Telemetry Transport MQTTClient MQTTServer Server MQTTBroker Broker NETStandard IoT InternetOfThings Messaging Hardware Arduino Sensor Actuator M2M ESP Smart Home Cities Automation Xamarin
diff --git a/Tests/MQTTnet.Core.Tests/MqttPacketReaderTests.cs b/Tests/MQTTnet.Core.Tests/MqttPacketReaderTests.cs
new file mode 100644
index 00000000..6800e6ce
--- /dev/null
+++ b/Tests/MQTTnet.Core.Tests/MqttPacketReaderTests.cs
@@ -0,0 +1,20 @@
+using System.IO;
+using System.Threading;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using MQTTnet.Core.Serializer;
+
+namespace MQTTnet.Core.Tests
+{
+ [TestClass]
+ public class MqttPacketReaderTests
+ {
+ [TestMethod]
+ public void MqttPacketReader_EmptyStream()
+ {
+ var memStream = new MemoryStream();
+ var header = MqttPacketReader.ReadHeaderFromSource(memStream, CancellationToken.None);
+
+ Assert.IsNull(header);
+ }
+ }
+}
diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
index 3f5b4cf6..106eca6e 100644
--- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
@@ -274,8 +274,8 @@ namespace MQTTnet.Core.Tests
public async Task MqttServer_PersistRetainedMessage()
{
var storage = new TestStorage();
-
var serverAdapter = new TestMqttServerAdapter();
+
var services = new ServiceCollection()
.AddLogging()
.AddMqttServer()
@@ -297,7 +297,7 @@ namespace MQTTnet.Core.Tests
await s.StopAsync();
}
- s = services.GetRequiredService();
+ s = new MqttFactory(services).CreateMqttServer(options => options.Storage = storage);
var receivedMessagesCount = 0;
try
From 11ccb951aa7e3141b0d92d5eadf1b79a29d6a221 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 1 Nov 2017 13:34:39 +0100
Subject: [PATCH 017/149] Refactor traces of server session handling
---
.../Adapter/MqttChannelCommunicationAdapter.cs | 4 ++--
.../Adapter/MqttCommunicationAdapterExtensions.cs | 2 ++
.../Server/MqttClientPendingMessagesQueue.cs | 14 ++++++++------
MQTTnet.Core/Server/MqttClientSession.cs | 1 -
4 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
index 7084227b..04857b5f 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
@@ -85,10 +85,10 @@ namespace MQTTnet.Core.Adapter
public async Task SendPacketsAsync(TimeSpan timeout, CancellationToken cancellationToken, IEnumerable packets)
{
- await _semaphore.WaitAsync(cancellationToken);
-
try
{
+ await _semaphore.WaitAsync(cancellationToken);
+
foreach (var packet in packets)
{
if (packet == null)
diff --git a/MQTTnet.Core/Adapter/MqttCommunicationAdapterExtensions.cs b/MQTTnet.Core/Adapter/MqttCommunicationAdapterExtensions.cs
index 0fa9ab54..2142fd07 100644
--- a/MQTTnet.Core/Adapter/MqttCommunicationAdapterExtensions.cs
+++ b/MQTTnet.Core/Adapter/MqttCommunicationAdapterExtensions.cs
@@ -9,6 +9,8 @@ namespace MQTTnet.Core.Adapter
{
public static Task SendPacketsAsync(this IMqttCommunicationAdapter adapter, TimeSpan timeout, CancellationToken cancellationToken, params MqttBasePacket[] packets)
{
+ if (adapter == null) throw new ArgumentNullException(nameof(adapter));
+
return adapter.SendPacketsAsync(timeout, cancellationToken, packets);
}
}
diff --git a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
index 446e0a86..599f4ee8 100644
--- a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
+++ b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
@@ -13,8 +13,8 @@ namespace MQTTnet.Core.Server
public sealed class MqttClientPendingMessagesQueue
{
private readonly BlockingCollection _pendingPublishPackets = new BlockingCollection();
- private readonly MqttClientSession _session;
private readonly MqttServerOptions _options;
+ private readonly MqttClientSession _session;
private readonly ILogger _logger;
public MqttClientPendingMessagesQueue(MqttServerOptions options, MqttClientSession session, ILogger logger)
@@ -28,7 +28,7 @@ namespace MQTTnet.Core.Server
{
if (adapter == null) throw new ArgumentNullException(nameof(adapter));
- Task.Factory.StartNew(async () => await SendPendingPublishPacketsAsync(adapter, cancellationToken), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default).ConfigureAwait(false);
+ Task.Run(async () => await SendPendingPublishPacketsAsync(adapter, cancellationToken), cancellationToken).ConfigureAwait(false);
}
public void Enqueue(MqttPublishPacket publishPacket)
@@ -36,6 +36,7 @@ namespace MQTTnet.Core.Server
if (publishPacket == null) throw new ArgumentNullException(nameof(publishPacket));
_pendingPublishPackets.Add(publishPacket);
+ _logger.LogTrace("Enqueued packet (ClientId: {0}).", _session.ClientId);
}
private async Task SendPendingPublishPacketsAsync(IMqttCommunicationAdapter adapter, CancellationToken cancellationToken)
@@ -52,7 +53,7 @@ namespace MQTTnet.Core.Server
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while sending pending publish packets.");
+ _logger.LogError(new EventId(), exception, "Unhandled exception while sending enqueued packet (ClientId: {0}).", _session.ClientId);
}
}
@@ -63,23 +64,24 @@ namespace MQTTnet.Core.Server
try
{
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, packet).ConfigureAwait(false);
+ _logger.LogTrace("Enqueued packet sent (ClientId: {0}).", _session.ClientId);
}
catch (Exception exception)
{
if (exception is MqttCommunicationTimedOutException)
{
- _logger.LogWarning(new EventId(), exception, "Sending publish packet failed due to timeout.");
+ _logger.LogWarning(new EventId(), exception, "Sending publish packet failed due to timeout (ClientId: {0}).", _session.ClientId);
}
else if (exception is MqttCommunicationException)
{
- _logger.LogWarning(new EventId(), exception, "Sending publish packet failed due to communication exception.");
+ _logger.LogWarning(new EventId(), exception, "Sending publish packet failed due to communication exception (ClientId: {0}).", _session.ClientId);
}
else if (exception is OperationCanceledException)
{
}
else
{
- _logger.LogError(new EventId(), exception, "Sending publish packet failed.");
+ _logger.LogError(new EventId(), exception, "Sending publish packet failed (ClientId: {0}).", _session.ClientId);
}
if (packet.QualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index 903b3306..52f6393f 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -108,7 +108,6 @@ namespace MQTTnet.Core.Server
}
_pendingMessagesQueue.Enqueue(publishPacket);
- _logger.LogTrace("Client '{0}': Enqueued pending publish packet.", ClientId);
}
public void Dispose()
From 387a3bc281402a496c3b6a75e4339cbfb59a9ed8 Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Mon, 6 Nov 2017 08:36:34 +0100
Subject: [PATCH 018/149] added dependencies to nuspec and fixed build
---
Build/MQTTnet.nuspec | 4 ++++
Build/build.ps1 | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 4631f247..c3f59858 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -34,10 +34,14 @@
+
+
+
+
diff --git a/Build/build.ps1 b/Build/build.ps1
index 6284473a..e74f9f06 100644
--- a/Build/build.ps1
+++ b/Build/build.ps1
@@ -11,7 +11,7 @@ if ($path) {
&$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
+ &$msbuild ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m
Remove-Item .\NuGet -Force -Recurse
New-Item -ItemType Directory -Force -Path .\NuGet
From 5fbef7beb5f6dd688b0af4f7d7774305909b7d7e Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Mon, 6 Nov 2017 10:37:09 +0100
Subject: [PATCH 019/149] added more missing packages
---
Build/MQTTnet.nuspec | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index c3f59858..9c841088 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -33,15 +33,20 @@
-
+
+
+
+
+
+
From 8778848301f83854dff7606b8ade5c783b6fa99d Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Mon, 6 Nov 2017 10:57:27 +0100
Subject: [PATCH 020/149] added some more missing packages
---
Build/MQTTnet.nuspec | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 9c841088..2583897c 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -48,6 +48,12 @@
+
+
+
+
+
+
From e6e88e132b73e5805f4a03efe406bc2b718d74e2 Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Mon, 6 Nov 2017 12:47:31 +0100
Subject: [PATCH 021/149] possibly fixed timing issue in test
---
.../MQTTnet.AspnetCore/MqttHostedServer.cs | 10 ++++++++--
Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 4 +++-
.../ServiceCollectionExtensions.cs | 4 ++--
.../Server/IMqttClientRetainedMessageManager.cs | 15 +++++++++++++++
.../Server/MqttClientRetainedMessagesManager.cs | 2 +-
MQTTnet.Core/Server/MqttClientSession.cs | 11 +++++++----
.../Server/MqttClientSessionsManager.cs | 4 ----
MQTTnet.Core/Server/MqttServer.cs | 13 +++++++++++--
Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 17 +++++++++++++++++
9 files changed, 64 insertions(+), 16 deletions(-)
create mode 100644 MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
diff --git a/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs b/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs
index db725735..8d005187 100644
--- a/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs
+++ b/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs
@@ -11,8 +11,14 @@ namespace MQTTnet.AspNetCore
{
public class MqttHostedServer : MqttServer, IHostedService
{
- public MqttHostedServer(IOptions options, IEnumerable adapters, ILogger logger, MqttClientSessionsManager clientSessionsManager)
- : base(options, adapters, logger, clientSessionsManager)
+ public MqttHostedServer(
+ IOptions options,
+ IEnumerable adapters,
+ ILogger logger,
+ MqttClientSessionsManager clientSessionsManager,
+ IMqttClientRetainedMessageManager clientRetainedMessageManager
+ )
+ : base(options, adapters, logger, clientSessionsManager, clientRetainedMessageManager)
{
}
diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
index 432a3719..394374de 100644
--- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
+++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
@@ -99,7 +99,9 @@ namespace MQTTnet
clientSessionsManager,
_serviceProvider.GetRequiredService(),
_serviceProvider.GetRequiredService>(),
- _serviceProvider.GetRequiredService>());
+ _serviceProvider.GetRequiredService>(),
+ _serviceProvider.GetRequiredService()
+ );
}
public IMqttClient CreateMqttClient()
diff --git a/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs b/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs
index aa53e1b8..4e6639a7 100644
--- a/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs
+++ b/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs
@@ -33,9 +33,9 @@ namespace MQTTnet
services.AddTransient();
services.AddTransient();
- services.AddTransient();
+ services.AddSingleton();
services.AddTransient();
- services.AddTransient();
+ services.AddSingleton();
return services;
}
diff --git a/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs b/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
new file mode 100644
index 00000000..cd3426ea
--- /dev/null
+++ b/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using MQTTnet.Core.Packets;
+
+namespace MQTTnet.Core.Server
+{
+ public interface IMqttClientRetainedMessageManager
+ {
+ Task LoadMessagesAsync();
+
+ Task HandleMessageAsync(string clientId, MqttApplicationMessage applicationMessage);
+
+ List GetMessages(MqttSubscribePacket subscribePacket);
+ }
+}
diff --git a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
index 68a7b99b..2213360a 100644
--- a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
+++ b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace MQTTnet.Core.Server
{
- public sealed class MqttClientRetainedMessagesManager
+ public sealed class MqttClientRetainedMessagesManager : IMqttClientRetainedMessageManager
{
private readonly Dictionary _retainedMessages = new Dictionary();
private readonly ILogger _logger;
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index 52f6393f..00f906ff 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -15,6 +15,7 @@ namespace MQTTnet.Core.Server
{
public sealed class MqttClientSession : IDisposable
{
+ private readonly IMqttClientRetainedMessageManager _clientRetainedMessageManager;
private readonly HashSet _unacknowledgedPublishPackets = new HashSet();
private readonly MqttClientSubscriptionsManager _subscriptionsManager;
@@ -33,10 +34,12 @@ namespace MQTTnet.Core.Server
MqttClientSessionsManager sessionsManager,
MqttClientSubscriptionsManager subscriptionsManager,
ILogger logger,
- ILogger messageQueueLogger)
+ ILogger messageQueueLogger,
+ IMqttClientRetainedMessageManager clientRetainedMessageManager)
{
+ _clientRetainedMessageManager = clientRetainedMessageManager ?? throw new ArgumentNullException(nameof(clientRetainedMessageManager));
_sessionsManager = sessionsManager ?? throw new ArgumentNullException(nameof(sessionsManager));
- _subscriptionsManager = subscriptionsManager ?? throw new ArgumentNullException(nameof(sessionsManager));
+ _subscriptionsManager = subscriptionsManager ?? throw new ArgumentNullException(nameof(subscriptionsManager));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
ClientId = clientId;
@@ -206,7 +209,7 @@ namespace MQTTnet.Core.Server
private void EnqueueRetainedMessages(MqttSubscribePacket subscribePacket)
{
- var retainedMessages = _sessionsManager.RetainedMessagesManager.GetMessages(subscribePacket);
+ var retainedMessages = _clientRetainedMessageManager.GetMessages(subscribePacket);
foreach (var publishPacket in retainedMessages)
{
EnqueuePublishPacket(publishPacket.ToPublishPacket());
@@ -227,7 +230,7 @@ namespace MQTTnet.Core.Server
if (applicationMessage.Retain)
{
- await _sessionsManager.RetainedMessagesManager.HandleMessageAsync(ClientId, applicationMessage);
+ await _clientRetainedMessageManager.HandleMessageAsync(ClientId, applicationMessage);
}
switch (applicationMessage.QualityOfServiceLevel)
diff --git a/MQTTnet.Core/Server/MqttClientSessionsManager.cs b/MQTTnet.Core/Server/MqttClientSessionsManager.cs
index 62cc1d82..b2cbdc09 100644
--- a/MQTTnet.Core/Server/MqttClientSessionsManager.cs
+++ b/MQTTnet.Core/Server/MqttClientSessionsManager.cs
@@ -24,12 +24,10 @@ namespace MQTTnet.Core.Server
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));
- RetainedMessagesManager = retainedMessagesManager ?? throw new ArgumentNullException(nameof(options));
_clientSesssionFactory = clientSesssionFactory ?? throw new ArgumentNullException(nameof(clientSesssionFactory));
}
@@ -37,8 +35,6 @@ namespace MQTTnet.Core.Server
public event EventHandler ClientDisconnected;
public event EventHandler ApplicationMessageReceived;
- public MqttClientRetainedMessagesManager RetainedMessagesManager { get; }
-
public async Task RunClientSessionAsync(IMqttCommunicationAdapter clientAdapter, CancellationToken cancellationToken)
{
var clientId = string.Empty;
diff --git a/MQTTnet.Core/Server/MqttServer.cs b/MQTTnet.Core/Server/MqttServer.cs
index f1ed791e..f5a9527c 100644
--- a/MQTTnet.Core/Server/MqttServer.cs
+++ b/MQTTnet.Core/Server/MqttServer.cs
@@ -6,11 +6,13 @@ using MQTTnet.Core.Adapter;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System.Linq;
+using Microsoft.Extensions.DependencyInjection;
namespace MQTTnet.Core.Server
{
public class MqttServer : IMqttServer
{
+ private readonly IMqttClientRetainedMessageManager _clientRetainedMessageManager;
private readonly ILogger _logger;
private readonly MqttClientSessionsManager _clientSessionsManager;
private readonly ICollection _adapters;
@@ -18,11 +20,18 @@ namespace MQTTnet.Core.Server
private CancellationTokenSource _cancellationTokenSource;
- public MqttServer(IOptions options, IEnumerable adapters, ILogger logger, MqttClientSessionsManager clientSessionsManager)
+ public MqttServer(
+ IOptions options,
+ IEnumerable adapters,
+ ILogger logger,
+ MqttClientSessionsManager clientSessionsManager,
+ IMqttClientRetainedMessageManager clientRetainedMessageManager
+ )
{
_options = options.Value ?? throw new ArgumentNullException(nameof(options));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_clientSessionsManager = clientSessionsManager ?? throw new ArgumentNullException(nameof(clientSessionsManager));
+ _clientRetainedMessageManager = clientRetainedMessageManager ?? throw new ArgumentNullException(nameof(clientRetainedMessageManager));
if (adapters == null)
{
@@ -79,7 +88,7 @@ namespace MQTTnet.Core.Server
_cancellationTokenSource = new CancellationTokenSource();
- await _clientSessionsManager.RetainedMessagesManager.LoadMessagesAsync();
+ await _clientRetainedMessageManager.LoadMessagesAsync();
foreach (var adapter in _adapters)
{
diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
index 106eca6e..44d489b4 100644
--- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -8,6 +9,7 @@ using MQTTnet.Core.Client;
using MQTTnet.Core.Protocol;
using MQTTnet.Core.Server;
using Microsoft.Extensions.DependencyInjection;
+using MQTTnet.Core.Packets;
namespace MQTTnet.Core.Tests
{
@@ -210,6 +212,7 @@ namespace MQTTnet.Core.Tests
.BuildServiceProvider();
var s = new MqttFactory(services).CreateMqttServer();
+ var retainMessagemanager = services.GetRequiredService();
var receivedMessagesCount = 0;
try
@@ -220,6 +223,20 @@ namespace MQTTnet.Core.Tests
await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build());
await c1.DisconnectAsync();
+ var subscribe = new MqttSubscribePacket()
+ {
+ TopicFilters = new List()
+ {
+ new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)
+ }
+ };
+
+ //make shure the retainedMessageManagerreceived the package
+ while (retainMessagemanager.GetMessages(subscribe).Any())
+ {
+ await Task.Delay(TimeSpan.FromMilliseconds(10));
+ }
+
var c2 = await serverAdapter.ConnectTestClient(s, "c2");
c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++;
await c2.SubscribeAsync(new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce));
From e07ead53a9c3e18aabad337755909e41a6f73e27 Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Mon, 6 Nov 2017 12:52:41 +0100
Subject: [PATCH 022/149] fixed wait
---
Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
index 44d489b4..86ff600e 100644
--- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
@@ -232,7 +232,7 @@ namespace MQTTnet.Core.Tests
};
//make shure the retainedMessageManagerreceived the package
- while (retainMessagemanager.GetMessages(subscribe).Any())
+ while (!retainMessagemanager.GetMessages(subscribe).Any())
{
await Task.Delay(TimeSpan.FromMilliseconds(10));
}
From f481c704c930a37bed5096970101d165a23098cd Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Tue, 7 Nov 2017 23:30:15 +0100
Subject: [PATCH 023/149] Fixed an issue with queued client message in the
server.
---
.../ManagedMqttClientOptionsBuilder.cs | 49 +++++++++++++++++++
.../Server/MqttClientPendingMessagesQueue.cs | 9 ++--
MQTTnet.Core/TopicFilter.cs | 2 +-
MQTTnet.Core/TopicFilterBuilder.cs | 2 +-
4 files changed, 56 insertions(+), 6 deletions(-)
create mode 100644 MQTTnet.Core/ManagedClient/ManagedMqttClientOptionsBuilder.cs
diff --git a/MQTTnet.Core/ManagedClient/ManagedMqttClientOptionsBuilder.cs b/MQTTnet.Core/ManagedClient/ManagedMqttClientOptionsBuilder.cs
new file mode 100644
index 00000000..3972dcd2
--- /dev/null
+++ b/MQTTnet.Core/ManagedClient/ManagedMqttClientOptionsBuilder.cs
@@ -0,0 +1,49 @@
+using System;
+using MQTTnet.Core.Client;
+
+namespace MQTTnet.Core.ManagedClient
+{
+ public class ManagedMqttClientOptionsBuilder
+ {
+ private readonly ManagedMqttClientOptions _options = new ManagedMqttClientOptions();
+
+ public ManagedMqttClientOptionsBuilder WithAutoReconnectDelay(TimeSpan value)
+ {
+ _options.AutoReconnectDelay = value;
+ return this;
+ }
+
+ public ManagedMqttClientOptionsBuilder WithStorage(IManagedMqttClientStorage value)
+ {
+ _options.Storage = value;
+ return this;
+ }
+
+ public ManagedMqttClientOptionsBuilder WithClientOptions(IMqttClientOptions value)
+ {
+ _options.ClientOptions = value ?? throw new ArgumentNullException(nameof(value));
+ return this;
+ }
+
+ public ManagedMqttClientOptionsBuilder WithClientOptions(Action options)
+ {
+ if (options == null) throw new ArgumentNullException(nameof(options));
+
+ var builder = new MqttClientOptionsBuilder();
+ options(builder);
+ _options.ClientOptions = builder.Build();
+
+ return this;
+ }
+
+ public ManagedMqttClientOptions Build()
+ {
+ if (_options.ClientOptions == null)
+ {
+ throw new InvalidOperationException("The ClientOptions cannot be null.");
+ }
+
+ return _options;
+ }
+ }
+}
diff --git a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
index 599f4ee8..6b370db6 100644
--- a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
+++ b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
@@ -59,11 +59,12 @@ namespace MQTTnet.Core.Server
private async Task SendPendingPublishPacketAsync(IMqttCommunicationAdapter adapter, CancellationToken cancellationToken)
{
- var packet = _pendingPublishPackets.Take(cancellationToken);
-
+ MqttPublishPacket packet = null;
try
{
+ packet = _pendingPublishPackets.Take(cancellationToken);
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, packet).ConfigureAwait(false);
+
_logger.LogTrace("Enqueued packet sent (ClientId: {0}).", _session.ClientId);
}
catch (Exception exception)
@@ -84,10 +85,10 @@ namespace MQTTnet.Core.Server
_logger.LogError(new EventId(), exception, "Sending publish packet failed (ClientId: {0}).", _session.ClientId);
}
- if (packet.QualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
+ if (packet != null && packet.QualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
{
packet.Dup = true;
- _pendingPublishPackets.Add(packet, cancellationToken);
+ _pendingPublishPackets.Add(packet, CancellationToken.None);
}
_session.Stop();
diff --git a/MQTTnet.Core/TopicFilter.cs b/MQTTnet.Core/TopicFilter.cs
index 3e95afa0..6d5258f4 100644
--- a/MQTTnet.Core/TopicFilter.cs
+++ b/MQTTnet.Core/TopicFilter.cs
@@ -4,7 +4,7 @@ namespace MQTTnet.Core
{
public sealed class TopicFilter
{
- public TopicFilter(string topic, MqttQualityOfServiceLevel qualityOfServiceLevel)
+ public TopicFilter(string topic, MqttQualityOfServiceLevel qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce)
{
Topic = topic;
QualityOfServiceLevel = qualityOfServiceLevel;
diff --git a/MQTTnet.Core/TopicFilterBuilder.cs b/MQTTnet.Core/TopicFilterBuilder.cs
index 90114e7c..bb8416c1 100644
--- a/MQTTnet.Core/TopicFilterBuilder.cs
+++ b/MQTTnet.Core/TopicFilterBuilder.cs
@@ -5,8 +5,8 @@ namespace MQTTnet.Core
{
public class TopicFilterBuilder
{
- private string _topic;
private MqttQualityOfServiceLevel _qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce;
+ private string _topic;
public TopicFilterBuilder WithTopic(string topic)
{
From 7e487469442631ccad35c56d4888059bc6abdffa Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 8 Nov 2017 00:49:49 +0100
Subject: [PATCH 024/149] Fix cleanup of client sessions
---
.../Adapter/MqttChannelCommunicationAdapter.cs | 4 ++--
.../Server/MqttClientRetainedMessagesManager.cs | 1 -
MQTTnet.Core/Server/MqttClientSession.cs | 10 ++--------
MQTTnet.Core/Server/MqttClientSessionsManager.cs | 4 ++--
4 files changed, 6 insertions(+), 13 deletions(-)
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
index 04857b5f..b31a870e 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
@@ -14,10 +14,10 @@ namespace MQTTnet.Core.Adapter
{
public class MqttChannelCommunicationAdapter : IMqttCommunicationAdapter
{
+ private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
private readonly ILogger _logger;
private readonly IMqttCommunicationChannel _channel;
- private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
-
+
public MqttChannelCommunicationAdapter(IMqttCommunicationChannel channel, IMqttPacketSerializer serializer, ILogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
diff --git a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
index 2213360a..d299daaf 100644
--- a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
+++ b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
@@ -68,7 +68,6 @@ namespace MQTTnet.Core.Server
try
{
- // ReSharper disable once UseNullPropagation
if (_options.Storage != null)
{
await _options.Storage.SaveRetainedMessagesAsync(allRetainedMessages);
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index 00f906ff..7ec312ae 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -13,11 +13,11 @@ using Microsoft.Extensions.Options;
namespace MQTTnet.Core.Server
{
- public sealed class MqttClientSession : IDisposable
+ public sealed class MqttClientSession
{
- private readonly IMqttClientRetainedMessageManager _clientRetainedMessageManager;
private readonly HashSet _unacknowledgedPublishPackets = new HashSet();
+ private readonly IMqttClientRetainedMessageManager _clientRetainedMessageManager;
private readonly MqttClientSubscriptionsManager _subscriptionsManager;
private readonly MqttClientSessionsManager _sessionsManager;
private readonly MqttClientPendingMessagesQueue _pendingMessagesQueue;
@@ -113,12 +113,6 @@ namespace MQTTnet.Core.Server
_pendingMessagesQueue.Enqueue(publishPacket);
}
- public void Dispose()
- {
- _cancellationTokenSource?.Cancel();
- _cancellationTokenSource?.Dispose();
- }
-
private async Task ReceivePacketsAsync(IMqttCommunicationAdapter adapter, CancellationToken cancellationToken)
{
try
diff --git a/MQTTnet.Core/Server/MqttClientSessionsManager.cs b/MQTTnet.Core/Server/MqttClientSessionsManager.cs
index b2cbdc09..48fd33ec 100644
--- a/MQTTnet.Core/Server/MqttClientSessionsManager.cs
+++ b/MQTTnet.Core/Server/MqttClientSessionsManager.cs
@@ -164,10 +164,10 @@ namespace MQTTnet.Core.Server
if (connectPacket.CleanSession)
{
_clientSessions.Remove(connectPacket.ClientId);
- clientSession.Dispose();
+ clientSession.Stop();
clientSession = null;
- _logger.LogTrace("Disposed existing session of client '{0}'.", connectPacket.ClientId);
+ _logger.LogTrace("Stopped existing session of client '{0}'.", connectPacket.ClientId);
}
else
{
From d2e481719c2a8bf2a4107a1011ac152861530784 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 8 Nov 2017 14:30:13 +0100
Subject: [PATCH 025/149] Optimized persisting of retained messages to avoid
useless writes to the filesystem
---
.../IMqttClientRetainedMessageManager.cs | 2 +-
.../MqttClientRetainedMessagesManager.cs | 73 +++++++++++++------
MQTTnet.Core/Server/MqttClientSession.cs | 7 +-
Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 2 +-
.../JsonServerStorage.cs | 50 +++++++++++++
.../MQTTnet.TestApp.UniversalWindows.csproj | 1 +
.../MainPage.xaml | 17 ++++-
.../MainPage.xaml.cs | 31 ++++++++
8 files changed, 155 insertions(+), 28 deletions(-)
create mode 100644 Tests/MQTTnet.TestApp.UniversalWindows/JsonServerStorage.cs
diff --git a/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs b/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
index cd3426ea..f4008998 100644
--- a/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
+++ b/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
@@ -10,6 +10,6 @@ namespace MQTTnet.Core.Server
Task HandleMessageAsync(string clientId, MqttApplicationMessage applicationMessage);
- List GetMessages(MqttSubscribePacket subscribePacket);
+ Task> GetSubscribedMessagesAsync(MqttSubscribePacket subscribePacket);
}
}
diff --git a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
index d299daaf..dbdb1d7a 100644
--- a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
+++ b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Packets;
using Microsoft.Extensions.Logging;
@@ -11,6 +12,7 @@ namespace MQTTnet.Core.Server
public sealed class MqttClientRetainedMessagesManager : IMqttClientRetainedMessageManager
{
private readonly Dictionary _retainedMessages = new Dictionary();
+ private readonly SemaphoreSlim _gate = new SemaphoreSlim(1, 1);
private readonly ILogger _logger;
private readonly MqttServerOptions _options;
@@ -27,62 +29,87 @@ namespace MQTTnet.Core.Server
return;
}
+ await _gate.WaitAsync();
try
{
var retainedMessages = await _options.Storage.LoadRetainedMessagesAsync();
- lock (_retainedMessages)
+
+ _retainedMessages.Clear();
+ foreach (var retainedMessage in retainedMessages)
{
- _retainedMessages.Clear();
- foreach (var retainedMessage in retainedMessages)
- {
- _retainedMessages[retainedMessage.Topic] = retainedMessage;
- }
+ _retainedMessages[retainedMessage.Topic] = retainedMessage;
}
}
catch (Exception exception)
{
_logger.LogError(new EventId(), exception, "Unhandled exception while loading retained messages.");
}
+ finally
+ {
+ _gate.Release();
+ }
}
public async Task HandleMessageAsync(string clientId, MqttApplicationMessage applicationMessage)
{
if (applicationMessage == null) throw new ArgumentNullException(nameof(applicationMessage));
- List allRetainedMessages;
- lock (_retainedMessages)
+ await _gate.WaitAsync();
+ try
{
+ var saveIsRequired = false;
+
if (applicationMessage.Payload?.Any() == false)
{
- _retainedMessages.Remove(applicationMessage.Topic);
+ saveIsRequired = _retainedMessages.Remove(applicationMessage.Topic);
_logger.LogInformation("Client '{0}' cleared retained message for topic '{1}'.", clientId, applicationMessage.Topic);
}
else
{
- _retainedMessages[applicationMessage.Topic] = applicationMessage;
- _logger.LogInformation("Client '{0}' updated retained message for topic '{1}'.", clientId, applicationMessage.Topic);
+ if (!_retainedMessages.ContainsKey(applicationMessage.Topic))
+ {
+ _retainedMessages[applicationMessage.Topic] = applicationMessage;
+ saveIsRequired = true;
+ }
+ else
+ {
+ var existingMessage = _retainedMessages[applicationMessage.Topic];
+ if (existingMessage.QualityOfServiceLevel != applicationMessage.QualityOfServiceLevel || !existingMessage.Payload.SequenceEqual(applicationMessage.Payload ?? new byte[0]))
+ {
+ _retainedMessages[applicationMessage.Topic] = applicationMessage;
+ saveIsRequired = true;
+ }
+ }
+
+ _logger.LogInformation("Client '{0}' set retained message for topic '{1}'.", clientId, applicationMessage.Topic);
}
- allRetainedMessages = new List(_retainedMessages.Values);
- }
-
- try
- {
- if (_options.Storage != null)
+ if (!saveIsRequired)
{
- await _options.Storage.SaveRetainedMessagesAsync(allRetainedMessages);
+ _logger.LogTrace("Skipped saving retained messages because no changes were detected.");
+ }
+
+ if (saveIsRequired && _options.Storage != null)
+ {
+ await _options.Storage.SaveRetainedMessagesAsync(_retainedMessages.Values.ToList());
}
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while saving retained messages.");
+ _logger.LogError(new EventId(), exception, "Unhandled exception while handling retained messages.");
+ }
+ finally
+ {
+ _gate.Release();
}
}
- public List GetMessages(MqttSubscribePacket subscribePacket)
+ public async Task> GetSubscribedMessagesAsync(MqttSubscribePacket subscribePacket)
{
var retainedMessages = new List();
- lock (_retainedMessages)
+
+ await _gate.WaitAsync();
+ try
{
foreach (var retainedMessage in _retainedMessages.Values)
{
@@ -103,6 +130,10 @@ namespace MQTTnet.Core.Server
}
}
}
+ finally
+ {
+ _gate.Release();
+ }
return retainedMessages;
}
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index 7ec312ae..9b14e587 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -191,8 +191,9 @@ namespace MQTTnet.Core.Server
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);
+ await EnqueueSubscribedRetainedMessagesAsync(subscribePacket);
if (subscribeResult.CloseConnection)
{
@@ -201,9 +202,9 @@ namespace MQTTnet.Core.Server
}
}
- private void EnqueueRetainedMessages(MqttSubscribePacket subscribePacket)
+ private async Task EnqueueSubscribedRetainedMessagesAsync(MqttSubscribePacket subscribePacket)
{
- var retainedMessages = _clientRetainedMessageManager.GetMessages(subscribePacket);
+ var retainedMessages = await _clientRetainedMessageManager.GetSubscribedMessagesAsync(subscribePacket);
foreach (var publishPacket in retainedMessages)
{
EnqueuePublishPacket(publishPacket.ToPublishPacket());
diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
index 86ff600e..b7098353 100644
--- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
@@ -232,7 +232,7 @@ namespace MQTTnet.Core.Tests
};
//make shure the retainedMessageManagerreceived the package
- while (!retainMessagemanager.GetMessages(subscribe).Any())
+ while (!(await retainMessagemanager.GetSubscribedMessagesAsync(subscribe)).Any())
{
await Task.Delay(TimeSpan.FromMilliseconds(10));
}
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/JsonServerStorage.cs b/Tests/MQTTnet.TestApp.UniversalWindows/JsonServerStorage.cs
new file mode 100644
index 00000000..9baafec0
--- /dev/null
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/JsonServerStorage.cs
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using MQTTnet.Core;
+using MQTTnet.Core.Server;
+using Newtonsoft.Json;
+
+namespace MQTTnet.TestApp.UniversalWindows
+{
+ public class JsonServerStorage : IMqttServerStorage
+ {
+ private readonly string _filename = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "Retained.json");
+
+ public async Task SaveRetainedMessagesAsync(IList messages)
+ {
+ await Task.CompletedTask;
+
+ var json = JsonConvert.SerializeObject(messages);
+ File.WriteAllText(_filename, json);
+ }
+
+ public async Task> LoadRetainedMessagesAsync()
+ {
+ await Task.CompletedTask;
+
+ if (!File.Exists(_filename))
+ {
+ return new List();
+ }
+
+ try
+ {
+ var json = File.ReadAllText(_filename);
+ return JsonConvert.DeserializeObject>(json);
+ }
+ catch
+ {
+ return new List();
+ }
+ }
+
+ public void Clear()
+ {
+ if (File.Exists(_filename))
+ {
+ File.Delete(_filename);
+ }
+ }
+ }
+}
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
index 8fda5d33..ce511d6c 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
@@ -94,6 +94,7 @@
App.xaml
+
MainPage.xaml
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
index 64d1d679..4fdbd2e6 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
@@ -27,7 +27,7 @@
Clean session:
-
+
TCP
WS
@@ -77,9 +77,19 @@
2 (Exactly once)
+ Received messages:
+
+
+
+
+
+
+
+
-
+
+
@@ -88,6 +98,9 @@
Port:
+ Persist retained messages in JSON format
+ Clear previously retained messages on startup
+
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
index ab467404..bcea348e 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
@@ -88,10 +88,13 @@ namespace MQTTnet.TestApp.UniversalWindows
if (_mqttClient != null)
{
await _mqttClient.DisconnectAsync();
+ _mqttClient.ApplicationMessageReceived -= OnApplicationMessageReceived;
}
var factory = new MqttFactory();
_mqttClient = factory.CreateMqttClient();
+ _mqttClient.ApplicationMessageReceived += OnApplicationMessageReceived;
+
await _mqttClient.ConnectAsync(options);
}
catch (Exception exception)
@@ -100,6 +103,17 @@ namespace MQTTnet.TestApp.UniversalWindows
}
}
+ private async void OnApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs eventArgs)
+ {
+ var item = $"Timestamp: {DateTime.Now:O} | Topic: {eventArgs.ApplicationMessage.Topic} | Payload: {Encoding.UTF8.GetString(eventArgs.ApplicationMessage.Payload)} | QoS: {eventArgs.ApplicationMessage.QualityOfServiceLevel}";
+
+ await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
+ {
+ ReceivedMessages.Items.Add(item);
+ });
+
+ }
+
private async void Publish(object sender, RoutedEventArgs e)
{
if (_mqttClient == null)
@@ -332,9 +346,21 @@ namespace MQTTnet.TestApp.UniversalWindows
return;
}
+ JsonServerStorage storage = null;
+ if (ServerPersistRetainedMessages.IsChecked == true)
+ {
+ storage = new JsonServerStorage();
+
+ if (ServerClearRetainedMessages.IsChecked == true)
+ {
+ storage.Clear();
+ }
+ }
+
_mqttServer = new MqttFactory().CreateMqttServer(o =>
{
o.DefaultEndpointOptions.Port = int.Parse(ServerPort.Text);
+ o.Storage = storage;
});
await _mqttServer.StartAsync();
@@ -350,5 +376,10 @@ namespace MQTTnet.TestApp.UniversalWindows
await _mqttServer.StopAsync();
_mqttServer = null;
}
+
+ private void ClearReceivedMessages(object sender, RoutedEventArgs e)
+ {
+ ReceivedMessages.Items.Clear();
+ }
}
}
From 0b002e8d11ca09913dbe6f90725e1c66e48f55c9 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 8 Nov 2017 15:26:31 +0100
Subject: [PATCH 026/149] Remove the RAW stream approach
---
Build/MQTTnet.nuspec | 4 ++--
Build/build.ps1 | 5 +++--
.../Implementations/MqttServerAdapter.cs | 6 +++---
.../Implementations/MqttTcpChannel.Uwp.cs | 5 -----
.../Implementations/MqttTcpChannel.cs | 21 ++++++++-----------
.../MQTTnet.Netstandard.csproj | 4 ++--
.../MqttChannelCommunicationAdapter.cs | 2 +-
.../Channel/IMqttCommunicationChannel.cs | 1 -
MQTTnet.Core/Client/MqttClient.cs | 6 +++---
MQTTnet.sln | 2 +-
.../MQTTnet.TestApp.NetCore.csproj | 2 +-
Tests/MQTTnet.TestApp.NetCore/Program.cs | 6 ++++++
.../MQTTnet.TestApp.UniversalWindows.csproj | 2 +-
13 files changed, 32 insertions(+), 34 deletions(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 2583897c..5fdc919a 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -68,8 +68,8 @@
-
-
+
+
\ No newline at end of file
diff --git a/Build/build.ps1 b/Build/build.ps1
index e74f9f06..e7d86d70 100644
--- a/Build/build.ps1
+++ b/Build/build.ps1
@@ -8,10 +8,11 @@ $path = &$vswhere -latest -products * -requires Microsoft.Component.MSBuild -pro
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="net452" /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
- &$msbuild ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m
+
+ &$msbuild ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m
Remove-Item .\NuGet -Force -Recurse
New-Item -ItemType Directory -Force -Path .\NuGet
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
index 9d807b8b..f894233a 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
@@ -1,4 +1,4 @@
-#if NET451 || NETSTANDARD1_3
+#if NET452 || NETSTANDARD1_3
using System;
using System.Net;
using System.Net.Security;
@@ -98,7 +98,7 @@ namespace MQTTnet.Implementations
try
{
//todo: else branch can be used with min dependency NET46
-#if NET451
+#if NET452
var clientSocket = await Task.Factory.FromAsync(_defaultEndpointSocket.BeginAccept, _defaultEndpointSocket.EndAccept, null).ConfigureAwait(false);
#else
var clientSocket = await _defaultEndpointSocket.AcceptAsync().ConfigureAwait(false);
@@ -122,7 +122,7 @@ namespace MQTTnet.Implementations
{
try
{
-#if NET451
+#if NET452
var clientSocket = await Task.Factory.FromAsync(_tlsEndpointSocket.BeginAccept, _tlsEndpointSocket.EndAccept, null).ConfigureAwait(false);
#else
var clientSocket = await _tlsEndpointSocket.AcceptAsync().ConfigureAwait(false);
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
index bd0614f5..06fa1377 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
@@ -32,7 +32,6 @@ namespace MQTTnet.Implementations
public Stream SendStream { get; private set; }
public Stream ReceiveStream { get; private set; }
- public Stream RawReceiveStream { get; private set; }
public static Func> CustomIgnorableServerCertificateErrorsResolver { get; set; }
@@ -70,9 +69,6 @@ namespace MQTTnet.Implementations
public void Dispose()
{
- RawReceiveStream?.Dispose();
- RawReceiveStream = null;
-
SendStream?.Dispose();
SendStream = null;
@@ -87,7 +83,6 @@ namespace MQTTnet.Implementations
{
SendStream = _socket.OutputStream.AsStreamForWrite();
ReceiveStream = _socket.InputStream.AsStreamForRead();
- RawReceiveStream = ReceiveStream;
}
private static Certificate LoadCertificate(MqttClientTcpOptions options)
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
index 62bb8787..0d6180c7 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
@@ -1,5 +1,4 @@
-#if NET451 || NETSTANDARD1_3
-
+#if NET452 || NETSTANDARD1_3
using System;
using System.Net.Security;
using System.Net.Sockets;
@@ -18,7 +17,7 @@ namespace MQTTnet.Implementations
private readonly MqttClientTcpOptions _options;
//todo: this can be used with min dependency NetStandard1.6
-#if NET45
+#if NET452
// ReSharper disable once MemberCanBePrivate.Global
// ReSharper disable once AutoPropertyCanBeMadeGetOnly.Global
public static int BufferSize { get; set; } = 4096 * 20; // Can be changed for fine tuning by library user.
@@ -49,7 +48,6 @@ namespace MQTTnet.Implementations
public Stream SendStream { get; private set; }
public Stream ReceiveStream { get; private set; }
- public Stream RawReceiveStream { get; private set; }
public static Func CustomCertificateValidationCallback { get; set; }
@@ -61,7 +59,7 @@ namespace MQTTnet.Implementations
}
//todo: else brach can be used with min dependency NET46
-#if NET451
+#if NET452
await Task.Factory.FromAsync(_socket.BeginConnect, _socket.EndConnect, _options.Server, _options.GetPort(), null).ConfigureAwait(false);
#else
await _socket.ConnectAsync(_options.Server, _options.GetPort()).ConfigureAwait(false);
@@ -140,19 +138,18 @@ namespace MQTTnet.Implementations
private void CreateStreams(Socket socket, Stream sslStream)
{
- RawReceiveStream = sslStream ?? new NetworkStream(socket);
-
+ var stream = sslStream ?? new NetworkStream(socket);
//cannot use this as default buffering prevents from receiving the first connect message
//need two streams otherwise read and write have to be synchronized
//todo: if branch can be used with min dependency NetStandard1.6
-#if NET45
- SendStream = new BufferedStream(RawReceiveStream, BufferSize);
- ReceiveStream = new BufferedStream(RawReceiveStream, BufferSize);
+#if NET452
+ SendStream = new BufferedStream(stream, BufferSize);
+ ReceiveStream = new BufferedStream(stream, BufferSize);
#else
- SendStream = RawReceiveStream;
- ReceiveStream = RawReceiveStream;
+ SendStream = stream;
+ ReceiveStream = stream;
#endif
}
diff --git a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
index 37b7e137..f981d604 100644
--- a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
+++ b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
@@ -1,7 +1,7 @@
- netstandard1.3;net451;uap10.0
+ netstandard1.3;net452;uap10.0
MQTTnet
MQTTnet
2.5.0.0
@@ -18,7 +18,7 @@
false
UAP,Version=v10.0
UAP
- 10.0.15063.0
+ 10.0.16299.0
10.0.10240.0
.NETCore
v5.0
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
index b31a870e..888539c5 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
@@ -144,7 +144,7 @@ namespace MQTTnet.Core.Adapter
ReceivedMqttPacket receivedMqttPacket;
if (timeout > TimeSpan.Zero)
{
- receivedMqttPacket = await ReceiveAsync(_channel.RawReceiveStream, cancellationToken).TimeoutAfter(timeout).ConfigureAwait(false);
+ receivedMqttPacket = await ReceiveAsync(_channel.ReceiveStream, cancellationToken).TimeoutAfter(timeout).ConfigureAwait(false);
}
else
{
diff --git a/MQTTnet.Core/Channel/IMqttCommunicationChannel.cs b/MQTTnet.Core/Channel/IMqttCommunicationChannel.cs
index 8c746d1e..e7a74c18 100644
--- a/MQTTnet.Core/Channel/IMqttCommunicationChannel.cs
+++ b/MQTTnet.Core/Channel/IMqttCommunicationChannel.cs
@@ -7,7 +7,6 @@ namespace MQTTnet.Core.Channel
{
Stream SendStream { get; }
Stream ReceiveStream { get; }
- Stream RawReceiveStream { get; }
Task ConnectAsync();
Task DisconnectAsync();
diff --git a/MQTTnet.Core/Client/MqttClient.cs b/MQTTnet.Core/Client/MqttClient.cs
index a8e4eba9..5cc70cd1 100644
--- a/MQTTnet.Core/Client/MqttClient.cs
+++ b/MQTTnet.Core/Client/MqttClient.cs
@@ -60,8 +60,8 @@ namespace MQTTnet.Core.Client
await _adapter.ConnectAsync(_options.CommunicationTimeout).ConfigureAwait(false);
_logger.LogTrace("Connection with server established.");
- await SetupIncomingPacketProcessingAsync();
- var connectResponse = await AuthenticateAsync(options.WillMessage);
+ await SetupIncomingPacketProcessingAsync().ConfigureAwait(false);
+ var connectResponse = await AuthenticateAsync(options.WillMessage).ConfigureAwait(false);
_logger.LogTrace("MQTT connection with server established.");
@@ -218,7 +218,7 @@ namespace MQTTnet.Core.Client
while (!_isReceivingPackets && _cancellationTokenSource != null && !_cancellationTokenSource.IsCancellationRequested)
{
- await Task.Delay(TimeSpan.FromMilliseconds(100));
+ await Task.Delay(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false);
}
}
diff --git a/MQTTnet.sln b/MQTTnet.sln
index 2207c1f8..86fee978 100644
--- a/MQTTnet.sln
+++ b/MQTTnet.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.27004.2002
+VisualStudioVersion = 15.0.27004.2006
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
diff --git a/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj b/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
index 4c0f99d2..c4a2bac2 100644
--- a/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
+++ b/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
@@ -3,7 +3,7 @@
Exe
Full
- netcoreapp2.0;net451
+ netcoreapp2.0;net452
diff --git a/Tests/MQTTnet.TestApp.NetCore/Program.cs b/Tests/MQTTnet.TestApp.NetCore/Program.cs
index 2e1d8c90..42830870 100644
--- a/Tests/MQTTnet.TestApp.NetCore/Program.cs
+++ b/Tests/MQTTnet.TestApp.NetCore/Program.cs
@@ -83,6 +83,12 @@ namespace MQTTnet.TestApp.NetCore
public Task SaveRetainedMessagesAsync(IList messages)
{
+ var directory = Path.GetDirectoryName(Filename);
+ if (!Directory.Exists(directory))
+ {
+ Directory.CreateDirectory(directory);
+ }
+
File.WriteAllText(Filename, JsonConvert.SerializeObject(messages));
return Task.FromResult(0);
}
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
index ce511d6c..fa0763c7 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
@@ -11,7 +11,7 @@
MQTTnet.TestApp.UniversalWindows
en-US
UAP
- 10.0.15063.0
+ 10.0.16299.0
10.0.15063.0
14
512
From 7dfc19e58826c58f64dac6c51757418bba244be5 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 8 Nov 2017 18:44:36 +0100
Subject: [PATCH 027/149] Added missing ConfigureAwaits
---
.../MqttChannelCommunicationAdapter.cs | 2 +-
MQTTnet.Core/Client/MqttClient.cs | 4 ++--
MQTTnet.Core/Diagnostics/MqttNetLogger.cs | 8 ++++++--
MQTTnet.Core/Diagnostics/MqttNetTrace.cs | 6 ++++--
.../Serializer/MqttPacketSerializer.cs | 19 ++++++++++--------
MQTTnet.Core/Serializer/MqttPacketWriter.cs | 6 +++---
.../MqttClientRetainedMessagesManager.cs | 4 ++--
MQTTnet.Core/Server/MqttClientSession.cs | 20 +++++++++----------
.../PerformanceTest.cs | 12 +++++++----
9 files changed, 47 insertions(+), 34 deletions(-)
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
index 888539c5..f537c410 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
@@ -87,7 +87,7 @@ namespace MQTTnet.Core.Adapter
{
try
{
- await _semaphore.WaitAsync(cancellationToken);
+ await _semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
foreach (var packet in packets)
{
diff --git a/MQTTnet.Core/Client/MqttClient.cs b/MQTTnet.Core/Client/MqttClient.cs
index 5cc70cd1..202cbc58 100644
--- a/MQTTnet.Core/Client/MqttClient.cs
+++ b/MQTTnet.Core/Client/MqttClient.cs
@@ -151,7 +151,7 @@ namespace MQTTnet.Core.Client
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);
+ await _adapter.SendPacketsAsync(_options.CommunicationTimeout, _cancellationTokenSource.Token, qosPackets).ConfigureAwait(false);
break;
}
case MqttQualityOfServiceLevel.AtLeastOnce:
@@ -159,7 +159,7 @@ namespace MQTTnet.Core.Client
foreach (var publishPacket in qosPackets)
{
publishPacket.PacketIdentifier = GetNewPacketIdentifier();
- await SendAndReceiveAsync(publishPacket);
+ await SendAndReceiveAsync(publishPacket).ConfigureAwait(false);
}
break;
diff --git a/MQTTnet.Core/Diagnostics/MqttNetLogger.cs b/MQTTnet.Core/Diagnostics/MqttNetLogger.cs
index 54ab6d44..32d96093 100644
--- a/MQTTnet.Core/Diagnostics/MqttNetLogger.cs
+++ b/MQTTnet.Core/Diagnostics/MqttNetLogger.cs
@@ -21,15 +21,19 @@ namespace MQTTnet.Core.Diagnostics
throw new ArgumentNullException(nameof(formatter));
}
- var message = formatter(state, exception);
+ if (!MqttNetTrace.HasListeners)
+ {
+ return;
+ }
+ var message = formatter(state, exception);
var traceMessage = new MqttNetTraceMessage(DateTime.Now, Environment.CurrentManagedThreadId, _categoryName, logLevel, message, exception);
_mqttNetTrace.Publish(traceMessage);
}
public bool IsEnabled(LogLevel logLevel)
{
- return true;
+ return MqttNetTrace.HasListeners;
}
//not supported: async local requires netstandard1.3
diff --git a/MQTTnet.Core/Diagnostics/MqttNetTrace.cs b/MQTTnet.Core/Diagnostics/MqttNetTrace.cs
index c14d4931..f75c7a9b 100644
--- a/MQTTnet.Core/Diagnostics/MqttNetTrace.cs
+++ b/MQTTnet.Core/Diagnostics/MqttNetTrace.cs
@@ -10,9 +10,11 @@ namespace MQTTnet.Core.Diagnostics
public static event EventHandler TraceMessagePublished;
- public void Publish(MqttNetTraceMessage msg)
+ public static bool HasListeners => TraceMessagePublished != null;
+
+ public void Publish(MqttNetTraceMessage traceMessage)
{
- TraceMessagePublished?.Invoke(this, new MqttNetTraceMessagePublishedEventArgs(msg));
+ TraceMessagePublished?.Invoke(this, new MqttNetTraceMessagePublishedEventArgs(traceMessage));
}
public void Dispose()
diff --git a/MQTTnet.Core/Serializer/MqttPacketSerializer.cs b/MQTTnet.Core/Serializer/MqttPacketSerializer.cs
index 00906f4a..6c2fc56a 100644
--- a/MQTTnet.Core/Serializer/MqttPacketSerializer.cs
+++ b/MQTTnet.Core/Serializer/MqttPacketSerializer.cs
@@ -24,15 +24,18 @@ namespace MQTTnet.Core.Serializer
using (var stream = new MemoryStream())
using (var writer = new MqttPacketWriter(stream))
{
- var header = new List { SerializePacket(packet, writer) };
- var body = stream.ToArray();
- MqttPacketWriter.BuildLengthHeader(body.Length, header);
- var headerArray = header.ToArray();
- var writeBuffer = new byte[header.Count + body.Length];
- Buffer.BlockCopy(headerArray, 0, writeBuffer, 0, headerArray.Length);
- Buffer.BlockCopy(body, 0, writeBuffer, headerArray.Length, body.Length);
+ var fixedHeader = SerializePacket(packet, writer);
+ var headerBuffer = new List { fixedHeader };
+ MqttPacketWriter.WriteRemainingLength((int)stream.Length, headerBuffer);
- return writeBuffer;
+ var header = headerBuffer.ToArray();
+ var body = stream.ToArray();
+
+ var buffer = new byte[header.Length + body.Length];
+ Buffer.BlockCopy(header, 0, buffer, 0, header.Length);
+ Buffer.BlockCopy(body, 0, buffer, header.Length, body.Length);
+
+ return buffer;
}
}
diff --git a/MQTTnet.Core/Serializer/MqttPacketWriter.cs b/MQTTnet.Core/Serializer/MqttPacketWriter.cs
index d8c997d2..fcd883c3 100644
--- a/MQTTnet.Core/Serializer/MqttPacketWriter.cs
+++ b/MQTTnet.Core/Serializer/MqttPacketWriter.cs
@@ -56,11 +56,11 @@ namespace MQTTnet.Core.Serializer
Write(value);
}
- public static void BuildLengthHeader(int length, List header)
+ public static void WriteRemainingLength(int length, List target)
{
if (length == 0)
{
- header.Add(0);
+ target.Add(0);
return;
}
@@ -75,7 +75,7 @@ namespace MQTTnet.Core.Serializer
encodedByte = encodedByte | 128;
}
- header.Add((byte)encodedByte);
+ target.Add((byte)encodedByte);
} while (x > 0);
}
}
diff --git a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
index dbdb1d7a..ab1d4871 100644
--- a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
+++ b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
@@ -54,7 +54,7 @@ namespace MQTTnet.Core.Server
{
if (applicationMessage == null) throw new ArgumentNullException(nameof(applicationMessage));
- await _gate.WaitAsync();
+ await _gate.WaitAsync().ConfigureAwait(false);
try
{
var saveIsRequired = false;
@@ -108,7 +108,7 @@ namespace MQTTnet.Core.Server
{
var retainedMessages = new List();
- await _gate.WaitAsync();
+ await _gate.WaitAsync().ConfigureAwait(false);
try
{
foreach (var retainedMessage in _retainedMessages.Values)
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index 9b14e587..fb859b8f 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -29,11 +29,11 @@ namespace MQTTnet.Core.Server
private MqttApplicationMessage _willMessage;
public MqttClientSession(
- string clientId,
+ string clientId,
IOptions options,
MqttClientSessionsManager sessionsManager,
MqttClientSubscriptionsManager subscriptionsManager,
- ILogger logger,
+ ILogger logger,
ILogger messageQueueLogger,
IMqttClientRetainedMessageManager clientRetainedMessageManager)
{
@@ -65,7 +65,7 @@ namespace MQTTnet.Core.Server
_cancellationTokenSource = new CancellationTokenSource();
_pendingMessagesQueue.Start(adapter, _cancellationTokenSource.Token);
- await ReceivePacketsAsync(adapter, _cancellationTokenSource.Token);
+ await ReceivePacketsAsync(adapter, _cancellationTokenSource.Token).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
@@ -175,7 +175,7 @@ namespace MQTTnet.Core.Server
{
return adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, _subscriptionsManager.Unsubscribe(unsubscribePacket));
}
-
+
if (packet is MqttDisconnectPacket || packet is MqttConnectPacket)
{
Stop();
@@ -192,19 +192,19 @@ namespace MQTTnet.Core.Server
{
var subscribeResult = _subscriptionsManager.Subscribe(subscribePacket, ClientId);
- await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, subscribeResult.ResponsePacket);
- await EnqueueSubscribedRetainedMessagesAsync(subscribePacket);
+ await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, subscribeResult.ResponsePacket).ConfigureAwait(false);
+ await EnqueueSubscribedRetainedMessagesAsync(subscribePacket).ConfigureAwait(false);
if (subscribeResult.CloseConnection)
{
- await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttDisconnectPacket());
+ await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttDisconnectPacket()).ConfigureAwait(false);
Stop();
}
}
private async Task EnqueueSubscribedRetainedMessagesAsync(MqttSubscribePacket subscribePacket)
{
- var retainedMessages = await _clientRetainedMessageManager.GetSubscribedMessagesAsync(subscribePacket);
+ var retainedMessages = await _clientRetainedMessageManager.GetSubscribedMessagesAsync(subscribePacket).ConfigureAwait(false);
foreach (var publishPacket in retainedMessages)
{
EnqueuePublishPacket(publishPacket.ToPublishPacket());
@@ -225,7 +225,7 @@ namespace MQTTnet.Core.Server
if (applicationMessage.Retain)
{
- await _clientRetainedMessageManager.HandleMessageAsync(ClientId, applicationMessage);
+ await _clientRetainedMessageManager.HandleMessageAsync(ClientId, applicationMessage).ConfigureAwait(false);
}
switch (applicationMessage.QualityOfServiceLevel)
@@ -255,7 +255,7 @@ namespace MQTTnet.Core.Server
_sessionsManager.DispatchApplicationMessage(this, applicationMessage);
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken,
- new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier });
+ new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier }).ConfigureAwait(false);
return;
}
diff --git a/Tests/MQTTnet.TestApp.NetCore/PerformanceTest.cs b/Tests/MQTTnet.TestApp.NetCore/PerformanceTest.cs
index 6ef76682..e21a7ea3 100644
--- a/Tests/MQTTnet.TestApp.NetCore/PerformanceTest.cs
+++ b/Tests/MQTTnet.TestApp.NetCore/PerformanceTest.cs
@@ -41,7 +41,7 @@ namespace MQTTnet.TestApp.NetCore
.AddLogging()
.BuildServiceProvider();
- services.GetService().AddConsole(LogLevel.Warning, true);
+ //services.GetService().AddConsole(LogLevel.Warning, true);
Console.WriteLine("Press 'c' for concurrent sends. Otherwise in one batch.");
var concurrent = Console.ReadKey(true).KeyChar == 'c';
@@ -120,11 +120,15 @@ namespace MQTTnet.TestApp.NetCore
stopwatch.Stop();
Console.WriteLine($"Sent 10.000 messages within {stopwatch.ElapsedMilliseconds} ms ({stopwatch.ElapsedMilliseconds / (float)testMessageCount} ms / message).");
- stopwatch.Restart();
+
+ var messages = new[] { message };
var sentMessagesCount = 0;
+
+ stopwatch.Restart();
+
while (stopwatch.ElapsedMilliseconds < 1000)
{
- await client.PublishAsync(message);
+ await client.PublishAsync(messages).ConfigureAwait(false);
sentMessagesCount++;
}
@@ -180,7 +184,7 @@ namespace MQTTnet.TestApp.NetCore
{
Topic = "A/B/C",
Payload = Encoding.UTF8.GetBytes("Hello World"),
- QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce
+ QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
};
}
From 40dd620f90b3ae8ad11bc319e664045432dd3c20 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 8 Nov 2017 19:10:45 +0100
Subject: [PATCH 028/149] Refactoring
---
MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs | 6 +++++-
MQTTnet.Core/Adapter/ReceivedMqttPacket.cs | 7 ++++++-
MQTTnet.Core/Serializer/MqttPacketWriter.cs | 2 +-
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
index f537c410..35573023 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
@@ -139,9 +139,9 @@ namespace MQTTnet.Core.Adapter
public async Task ReceivePacketAsync(TimeSpan timeout, CancellationToken cancellationToken)
{
+ ReceivedMqttPacket receivedMqttPacket = null;
try
{
- ReceivedMqttPacket receivedMqttPacket;
if (timeout > TimeSpan.Zero)
{
receivedMqttPacket = await ReceiveAsync(_channel.ReceiveStream, cancellationToken).TimeoutAfter(timeout).ConfigureAwait(false);
@@ -185,6 +185,10 @@ namespace MQTTnet.Core.Adapter
{
throw new MqttCommunicationException(exception);
}
+ finally
+ {
+ receivedMqttPacket?.Dispose();
+ }
}
private static async Task ReceiveAsync(Stream stream, CancellationToken cancellationToken)
diff --git a/MQTTnet.Core/Adapter/ReceivedMqttPacket.cs b/MQTTnet.Core/Adapter/ReceivedMqttPacket.cs
index f8adc2eb..f7fdbcc5 100644
--- a/MQTTnet.Core/Adapter/ReceivedMqttPacket.cs
+++ b/MQTTnet.Core/Adapter/ReceivedMqttPacket.cs
@@ -4,7 +4,7 @@ using MQTTnet.Core.Packets;
namespace MQTTnet.Core.Adapter
{
- public class ReceivedMqttPacket
+ public sealed class ReceivedMqttPacket : IDisposable
{
public ReceivedMqttPacket(MqttPacketHeader header, MemoryStream body)
{
@@ -15,5 +15,10 @@ namespace MQTTnet.Core.Adapter
public MqttPacketHeader Header { get; }
public MemoryStream Body { get; }
+
+ public void Dispose()
+ {
+ Body?.Dispose();
+ }
}
}
diff --git a/MQTTnet.Core/Serializer/MqttPacketWriter.cs b/MQTTnet.Core/Serializer/MqttPacketWriter.cs
index fcd883c3..4c86f961 100644
--- a/MQTTnet.Core/Serializer/MqttPacketWriter.cs
+++ b/MQTTnet.Core/Serializer/MqttPacketWriter.cs
@@ -9,7 +9,7 @@ namespace MQTTnet.Core.Serializer
public sealed class MqttPacketWriter : BinaryWriter
{
public MqttPacketWriter(Stream stream)
- : base(stream)
+ : base(stream, Encoding.UTF8, true)
{
}
From 522a38552310e911e605e7edf117872c07363cd9 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 8 Nov 2017 20:26:33 +0100
Subject: [PATCH 029/149] Add methods for client options builder
---
.../Client/MqttClientOptionsBuilder.cs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs b/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
index 1eb2a347..b3525670 100644
--- a/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
+++ b/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
@@ -1,4 +1,5 @@
using System;
+using System.Linq;
using MQTTnet.Core.Serializer;
namespace MQTTnet.Core.Client
@@ -79,6 +80,24 @@ namespace MQTTnet.Core.Client
return this;
}
+ public MqttClientOptionsBuilder WithTls(
+ bool allowUntrustedCertificates = false,
+ bool ignoreCertificateChainErrors = false,
+ bool ignoreCertificateRevocationErrors = false,
+ params byte[][] certificates)
+ {
+ _tlsOptions = new MqttClientTlsOptions
+ {
+ UseTls = true,
+ AllowUntrustedCertificates = allowUntrustedCertificates,
+ IgnoreCertificateChainErrors = ignoreCertificateChainErrors,
+ IgnoreCertificateRevocationErrors = ignoreCertificateRevocationErrors,
+ Certificates = certificates.ToList()
+ };
+
+ return this;
+ }
+
public MqttClientOptionsBuilder WithTls()
{
_tlsOptions = new MqttClientTlsOptions
From 1c78cd4c319464547543cf6a93030a7a62153607 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 8 Nov 2017 23:36:52 +0100
Subject: [PATCH 030/149] Update documentation
---
.../Client/MqttClientOptionsBuilder.cs | 26 ++++---
.../MQTTnet.TestApp.UniversalWindows.csproj | 6 ++
.../MainPage.xaml.cs | 77 ++++++++++++++++---
3 files changed, 90 insertions(+), 19 deletions(-)
diff --git a/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs b/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
index b3525670..29a2d64f 100644
--- a/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
+++ b/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
@@ -12,15 +12,21 @@ namespace MQTTnet.Core.Client
private MqttClientTlsOptions _tlsOptions;
- public MqttClientOptionsBuilder WithProtocolVersion(MqttProtocolVersion protocolVersion)
+ public MqttClientOptionsBuilder WithLogId(string value)
{
- _options.ProtocolVersion = protocolVersion;
+ _options.LogId = value;
return this;
}
- public MqttClientOptionsBuilder WithCommunicationTimeout(TimeSpan communicationTimeout)
+ public MqttClientOptionsBuilder WithProtocolVersion(MqttProtocolVersion value)
{
- _options.CommunicationTimeout = communicationTimeout;
+ _options.ProtocolVersion = value;
+ return this;
+ }
+
+ public MqttClientOptionsBuilder WithCommunicationTimeout(TimeSpan value)
+ {
+ _options.CommunicationTimeout = value;
return this;
}
@@ -30,21 +36,21 @@ namespace MQTTnet.Core.Client
return this;
}
- public MqttClientOptionsBuilder WithKeepAlivePeriod(TimeSpan keepAlivePeriod)
+ public MqttClientOptionsBuilder WithKeepAlivePeriod(TimeSpan value)
{
- _options.KeepAlivePeriod = keepAlivePeriod;
+ _options.KeepAlivePeriod = value;
return this;
}
- public MqttClientOptionsBuilder WithClientId(string clientId)
+ public MqttClientOptionsBuilder WithClientId(string value)
{
- _options.ClientId = clientId;
+ _options.ClientId = value;
return this;
}
- public MqttClientOptionsBuilder WithWillMessage(MqttApplicationMessage applicationMessage)
+ public MqttClientOptionsBuilder WithWillMessage(MqttApplicationMessage value)
{
- _options.WillMessage = applicationMessage;
+ _options.WillMessage = value;
return this;
}
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
index fa0763c7..f8c1ce9d 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
@@ -137,6 +137,12 @@
+
+ 1.1.2
+
+
+ 1.1.2
+
5.4.0
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
index bcea348e..47ee2586 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
@@ -5,6 +5,7 @@ using Windows.Security.Cryptography.Certificates;
using Windows.UI.Core;
using Windows.UI.Xaml;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
using MQTTnet.Core;
using MQTTnet.Core.Client;
using MQTTnet.Core.Diagnostics;
@@ -111,7 +112,7 @@ namespace MQTTnet.TestApp.UniversalWindows
{
ReceivedMessages.Items.Add(item);
});
-
+
}
private async void Publish(object sender, RoutedEventArgs e)
@@ -227,16 +228,50 @@ namespace MQTTnet.TestApp.UniversalWindows
private async Task WikiCode()
{
{
- // Create a new MQTT client
+ // Write all trace messages to the console window.
+ MqttNetTrace.TraceMessagePublished += (s, e) =>
+ {
+ Console.WriteLine($">> [{e.TraceMessage.Timestamp:O}] [{e.TraceMessage.ThreadId}] [{e.TraceMessage.Source}] [{e.TraceMessage.Level}]: {e.TraceMessage.Message}");
+ if (e.TraceMessage.Exception != null)
+ {
+ Console.WriteLine(e.TraceMessage.Exception);
+ }
+ };
+ }
+
+ {
+ // Add the console logger to the logger factory.
var services = new ServiceCollection()
.AddMqttClient()
.BuildServiceProvider();
- var factory = new MqttFactory(services);
- var client = factory.CreateMqttClient();
+ services.GetRequiredService()
+ .AddConsole();
+ }
+
+ {
+ // Use a custom identifier for the trace messages.
+ var clientOptions = new MqttClientOptionsBuilder()
+ .WithLogId("ClientX")
+ .Build();
+ }
+
+ {
+ // Create a client from the service provider manually.
+ var serviceProvider = new ServiceCollection()
+ .AddMqttClient()
+ .BuildServiceProvider();
+
+ var mqttClient = serviceProvider.GetRequiredService();
+ }
+
+ {
+ // Create a new MQTT client.
+ var factory = new MqttFactory();
+ var mqttClient = factory.CreateMqttClient();
{
- // Create TCP based options using the builder
+ // Create TCP based options using the builder.
var options = new MqttClientOptionsBuilder()
.WithClientId("Client1")
.WithTcpServer("broker.hivemq.com")
@@ -245,7 +280,31 @@ namespace MQTTnet.TestApp.UniversalWindows
.WithCleanSession()
.Build();
- await client.ConnectAsync(options);
+ await mqttClient.ConnectAsync(options);
+ }
+
+ {
+ // Use TCP connection.
+ var options = new MqttClientOptionsBuilder()
+ .WithTcpServer("broker.hivemq.com", 1883) // Port is optional
+ .Build();
+ }
+
+ {
+ // Use secure TCP connection.
+ var options = new MqttClientOptionsBuilder()
+ .WithTcpServer("broker.hivemq.com")
+ .WithTls()
+ .Build();
+ }
+
+ {
+ // Use WebSocket connection.
+ var options = new MqttClientOptionsBuilder()
+ .WithWebSocketServer("broker.hivemq.com:8000/mqtt")
+ .Build();
+
+ await mqttClient.ConnectAsync(options);
}
{
@@ -271,10 +330,10 @@ namespace MQTTnet.TestApp.UniversalWindows
{
// Subscribe to a topic
- await client.SubscribeAsync(new TopicFilterBuilder().WithTopic("my/topic").Build());
+ await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("my/topic").Build());
// Unsubscribe from a topic
- await client.UnsubscribeAsync("my/topic");
+ await mqttClient.UnsubscribeAsync("my/topic");
// Publish an application message
var applicationMessage = new MqttApplicationMessageBuilder()
@@ -283,7 +342,7 @@ namespace MQTTnet.TestApp.UniversalWindows
.WithAtLeastOnceQoS()
.Build();
- await client.PublishAsync(applicationMessage);
+ await mqttClient.PublishAsync(applicationMessage);
}
}
From eaf27c1e1268a9417d96fd4d8925969aaaf19fcb Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Thu, 9 Nov 2017 00:03:22 +0100
Subject: [PATCH 031/149] Update documentation
---
MQTTnet.Core/Server/IMqttServer.cs | 1 -
MQTTnet.Core/Server/MqttServer.cs | 1 -
Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs | 10 ++--
Tests/MQTTnet.TestApp.NetCore/ServerTest.cs | 23 +++++--
.../MainPage.xaml.cs | 60 ++++++++++++++++++-
5 files changed, 84 insertions(+), 11 deletions(-)
diff --git a/MQTTnet.Core/Server/IMqttServer.cs b/MQTTnet.Core/Server/IMqttServer.cs
index 7d76c23c..71af0ee3 100644
--- a/MQTTnet.Core/Server/IMqttServer.cs
+++ b/MQTTnet.Core/Server/IMqttServer.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using MQTTnet.Core.Client;
namespace MQTTnet.Core.Server
{
diff --git a/MQTTnet.Core/Server/MqttServer.cs b/MQTTnet.Core/Server/MqttServer.cs
index f5a9527c..1e05764c 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 Microsoft.Extensions.DependencyInjection;
namespace MQTTnet.Core.Server
{
diff --git a/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs b/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs
index 18d121cf..d321fd1e 100644
--- a/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs
+++ b/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs
@@ -8,17 +8,19 @@ using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;
using MQTTnet.AspNetCore;
using MQTTnet.Core;
-using MQTTnet.Core.Client;
namespace MQTTnet.TestApp.AspNetCore2
{
public class Startup
{
+ // In class _Startup_ of the ASP.NET Core 2.0 project.
+
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedMqttServer();
}
+ // In class _Startup_ of the ASP.NET Core 2.0 project.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseMqttEndpoint();
@@ -49,11 +51,11 @@ namespace MQTTnet.TestApp.AspNetCore2
app.UseStaticFiles();
- app.UseStaticFiles( new StaticFileOptions()
+ app.UseStaticFiles(new StaticFileOptions
{
RequestPath = "/node_modules",
- FileProvider = new PhysicalFileProvider( Path.Combine(env.ContentRootPath, "node_modules" ) )
- } );
+ FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "node_modules"))
+ });
}
}
}
diff --git a/Tests/MQTTnet.TestApp.NetCore/ServerTest.cs b/Tests/MQTTnet.TestApp.NetCore/ServerTest.cs
index 0a7d5575..f4a18cd5 100644
--- a/Tests/MQTTnet.TestApp.NetCore/ServerTest.cs
+++ b/Tests/MQTTnet.TestApp.NetCore/ServerTest.cs
@@ -35,14 +35,29 @@ namespace MQTTnet.TestApp.NetCore
options.Storage = new RetainedMessageHandler();
+ // Extend the timestamp for all messages from clients.
options.ApplicationMessageInterceptor = context =>
{
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.
- context.ApplicationMessage.Payload = Encoding.UTF8.GetBytes(DateTime.Now.ToString("O"));
- }
+ // Replace the payload with the timestamp. But also extending a JSON
+ // based payload with the timestamp is a suitable use case.
+ context.ApplicationMessage.Payload = Encoding.UTF8.GetBytes(DateTime.Now.ToString("O"));
+ }
+ };
+ // Protect several topics from being subscribed from every client.
+ options.SubscriptionsInterceptor = context =>
+ {
+ if (context.TopicFilter.Topic.StartsWith("admin/foo/bar") && context.ClientId != "theAdmin")
+ {
+ context.AcceptSubscription = false;
+ }
+
+ if (context.TopicFilter.Topic.StartsWith("the/secret/stuff") && context.ClientId != "Imperator")
+ {
+ context.AcceptSubscription = false;
+ context.CloseConnection = true;
+ }
};
});
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
index 47ee2586..1a12f950 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
@@ -264,7 +264,7 @@ namespace MQTTnet.TestApp.UniversalWindows
var mqttClient = serviceProvider.GetRequiredService();
}
-
+
{
// Create a new MQTT client.
var factory = new MqttFactory();
@@ -396,6 +396,64 @@ namespace MQTTnet.TestApp.UniversalWindows
return new ChainValidationResult[0];
};
+ {
+ // Start a MQTT server.
+ var mqttServer = new MqttFactory().CreateMqttServer();
+ await mqttServer.StartAsync();
+ Console.WriteLine("Press any key to exit.");
+ Console.ReadLine();
+ await mqttServer.StopAsync();
+ }
+
+ {
+ // Configure MQTT server.
+ var mqttServer = new MqttFactory().CreateMqttServer(options =>
+ {
+ options.ConnectionBacklog = 100;
+ options.DefaultEndpointOptions.Port = 1884;
+ options.ConnectionValidator = packet =>
+ {
+ if (packet.ClientId != "Highlander")
+ {
+ return MqttConnectReturnCode.ConnectionRefusedIdentifierRejected;
+ }
+
+ return MqttConnectReturnCode.ConnectionAccepted;
+ };
+ });
+ }
+
+ {
+ // Setup client validator.
+ var mqttServer = new MqttFactory().CreateMqttServer(options =>
+ {
+ options.ConnectionValidator = c =>
+ {
+ if (c.ClientId.Length < 10)
+ {
+ return MqttConnectReturnCode.ConnectionRefusedIdentifierRejected;
+ }
+
+ if (c.Username != "mySecretUser")
+ {
+ return MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
+ }
+
+ if (c.Password != "mySecretPassword")
+ {
+ return MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
+ }
+
+ return MqttConnectReturnCode.ConnectionAccepted;
+ };
+ });
+ }
+
+ {
+ // Create a new MQTT server.
+ var mqttServer = new MqttFactory().CreateMqttServer();
+ }
+
}
private async void StartServer(object sender, RoutedEventArgs e)
From 587622af81c6e03e5972d9bf194405c9100e8943 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Thu, 9 Nov 2017 08:23:40 +0100
Subject: [PATCH 032/149] Refactoring
---
Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 28 +++++++++----------
.../MainPage.xaml.cs | 16 +++++++++++
2 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
index 394374de..1729350c 100644
--- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
+++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
@@ -16,20 +16,6 @@ namespace MQTTnet
{
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())
{
@@ -128,5 +114,19 @@ namespace MQTTnet
return _serviceProvider.GetRequiredService();
}
+
+ private static IServiceProvider BuildServiceProvider()
+ {
+ var serviceProvider = new ServiceCollection()
+ .AddMqttClient()
+ .AddMqttServer()
+ .AddLogging()
+ .BuildServiceProvider();
+
+ serviceProvider.GetRequiredService()
+ .AddMqttTrace();
+
+ return serviceProvider;
+ }
}
}
\ No newline at end of file
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
index 1a12f950..6ae711be 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
@@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging;
using MQTTnet.Core;
using MQTTnet.Core.Client;
using MQTTnet.Core.Diagnostics;
+using MQTTnet.Core.ManagedClient;
using MQTTnet.Core.Protocol;
using MQTTnet.Core.Server;
using MQTTnet.Implementations;
@@ -454,6 +455,21 @@ namespace MQTTnet.TestApp.UniversalWindows
var mqttServer = new MqttFactory().CreateMqttServer();
}
+ {
+ // Setup and start a managed MQTT client.
+ var options = new ManagedMqttClientOptionsBuilder()
+ .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
+ .WithClientOptions(new MqttClientOptionsBuilder()
+ .WithClientId("Client1")
+ .WithTcpServer("broker.hivemq.com")
+ .WithTls().Build())
+ .Build();
+
+ var mqttClient = new MqttFactory().CreateManagedMqttClient();
+ await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("my/topic").Build());
+ await mqttClient.StartAsync(options);
+ }
+
}
private async void StartServer(object sender, RoutedEventArgs e)
From ad77dc0bea6067298b9fb44f0542e0e9d3da7133 Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Thu, 9 Nov 2017 10:22:44 +0100
Subject: [PATCH 033/149] improved server usage in aspnet so no exceptions are
thrown on startup
---
MQTTnet.Core/Server/IMqttServer.cs | 1 +
MQTTnet.Core/Server/MqttServer.cs | 3 ++
.../Server/MqttServerStartedEventArgs.cs | 8 +++++
Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs | 36 ++++++++++++-------
4 files changed, 36 insertions(+), 12 deletions(-)
create mode 100644 MQTTnet.Core/Server/MqttServerStartedEventArgs.cs
diff --git a/MQTTnet.Core/Server/IMqttServer.cs b/MQTTnet.Core/Server/IMqttServer.cs
index 71af0ee3..13c614fc 100644
--- a/MQTTnet.Core/Server/IMqttServer.cs
+++ b/MQTTnet.Core/Server/IMqttServer.cs
@@ -8,6 +8,7 @@ namespace MQTTnet.Core.Server
{
event EventHandler ClientConnected;
event EventHandler ClientDisconnected;
+ event EventHandler Started;
IList GetConnectedClients();
void Publish(IEnumerable applicationMessages);
diff --git a/MQTTnet.Core/Server/MqttServer.cs b/MQTTnet.Core/Server/MqttServer.cs
index 1e05764c..bd06a3a6 100644
--- a/MQTTnet.Core/Server/MqttServer.cs
+++ b/MQTTnet.Core/Server/MqttServer.cs
@@ -49,6 +49,7 @@ namespace MQTTnet.Core.Server
return _clientSessionsManager.GetConnectedClients();
}
+ public event EventHandler Started;
public event EventHandler ClientConnected;
public event EventHandler ClientDisconnected;
public event EventHandler ApplicationMessageReceived;
@@ -96,6 +97,8 @@ namespace MQTTnet.Core.Server
}
_logger.LogInformation("Started.");
+
+ Started?.Invoke(this, new MqttServerStartedEventArgs());
}
public async Task StopAsync()
diff --git a/MQTTnet.Core/Server/MqttServerStartedEventArgs.cs b/MQTTnet.Core/Server/MqttServerStartedEventArgs.cs
new file mode 100644
index 00000000..8f46bde8
--- /dev/null
+++ b/MQTTnet.Core/Server/MqttServerStartedEventArgs.cs
@@ -0,0 +1,8 @@
+using System;
+
+namespace MQTTnet.Core.Server
+{
+ public class MqttServerStartedEventArgs : EventArgs
+ {
+ }
+}
diff --git a/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs b/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs
index d321fd1e..55c57a18 100644
--- a/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs
+++ b/Tests/MQTTnet.TestApp.AspNetCore2/Startup.cs
@@ -5,7 +5,6 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
-using Microsoft.Extensions.Logging;
using MQTTnet.AspNetCore;
using MQTTnet.Core;
@@ -21,21 +20,34 @@ namespace MQTTnet.TestApp.AspNetCore2
}
// In class _Startup_ of the ASP.NET Core 2.0 project.
- public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+ public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMqttEndpoint();
- app.UseMqttServer(async server =>
+ app.UseMqttServer(server =>
{
- var msg = new MqttApplicationMessageBuilder()
- .WithPayload("Mqtt is awesome")
- .WithTopic("message");
-
- while (true)
+ server.Started += async (sender, args) =>
{
- server.PublishAsync(msg.Build()).Wait();
- await Task.Delay(TimeSpan.FromSeconds(2));
- msg.WithPayload("Mqtt is still awesome at " + DateTime.Now);
- }
+ var msg = new MqttApplicationMessageBuilder()
+ .WithPayload("Mqtt is awesome")
+ .WithTopic("message");
+
+ while (true)
+ {
+ try
+ {
+ await server.PublishAsync(msg.Build());
+ msg.WithPayload("Mqtt is still awesome at " + DateTime.Now);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ }
+ finally
+ {
+ await Task.Delay(TimeSpan.FromSeconds(2));
+ }
+ }
+ };
});
app.Use((context, next) =>
From 683d97dc14baa4b03f4d89272aaf3bfe3f3d9585 Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Thu, 9 Nov 2017 10:24:49 +0100
Subject: [PATCH 034/149] added another platform to overcome breaking change in
ms.extensions.di 2.0.0
---
Build/MQTTnet.nuspec | 15 ++++++++++++
Build/build.ps1 | 1 +
.../Implementations/MqttServerAdapter.cs | 2 +-
.../Implementations/MqttTcpChannel.cs | 2 +-
.../MQTTnet.Netstandard.csproj | 23 ++++++++++++++++---
.../MQTTnet.Core.Tests.csproj | 2 --
.../MQTTnet.TestApp.NetCore.csproj | 2 --
7 files changed, 38 insertions(+), 9 deletions(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 5fdc919a..3f26a870 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -41,6 +41,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -62,6 +73,10 @@
+
+
+
+
diff --git a/Build/build.ps1 b/Build/build.ps1
index e7d86d70..3efa1577 100644
--- a/Build/build.ps1
+++ b/Build/build.ps1
@@ -10,6 +10,7 @@ if ($path) {
&$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net452" /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="netstandard2.0" /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
&$msbuild ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
index f894233a..a6e6251e 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
@@ -1,4 +1,4 @@
-#if NET452 || NETSTANDARD1_3
+#if NET452 || NETSTANDARD1_3 || NETSTANDARD2_0
using System;
using System.Net;
using System.Net.Security;
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
index 0d6180c7..2bf418bc 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
@@ -1,4 +1,4 @@
-#if NET452 || NETSTANDARD1_3
+#if NET452 || NETSTANDARD1_3 || NETSTANDARD2_0
using System;
using System.Net.Security;
using System.Net.Sockets;
diff --git a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
index f981d604..266864d1 100644
--- a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
+++ b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
@@ -1,7 +1,7 @@
- netstandard1.3;net452;uap10.0
+ netstandard1.3;netstandard2.0;net452;uap10.0
MQTTnet
MQTTnet
2.5.0.0
@@ -32,23 +32,40 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj b/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
index 802d96d8..88ffbe41 100644
--- a/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
+++ b/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
@@ -7,7 +7,6 @@
-
@@ -15,7 +14,6 @@
-
\ No newline at end of file
diff --git a/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj b/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
index c4a2bac2..80d6a260 100644
--- a/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
+++ b/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
@@ -7,13 +7,11 @@
-
-
From b6cd4638b9871af7a9bbff74bac0afd6bc3e747a Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Thu, 9 Nov 2017 10:40:05 +0100
Subject: [PATCH 035/149] fixed another retain msg test timing issue
---
Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 39 +++++++++++++--------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
index b7098353..fc252678 100644
--- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
@@ -9,6 +9,7 @@ using MQTTnet.Core.Client;
using MQTTnet.Core.Protocol;
using MQTTnet.Core.Server;
using Microsoft.Extensions.DependencyInjection;
+using MQTTnet.Core.Internal;
using MQTTnet.Core.Packets;
namespace MQTTnet.Core.Tests
@@ -212,7 +213,6 @@ namespace MQTTnet.Core.Tests
.BuildServiceProvider();
var s = new MqttFactory(services).CreateMqttServer();
- var retainMessagemanager = services.GetRequiredService();
var receivedMessagesCount = 0;
try
@@ -223,19 +223,7 @@ namespace MQTTnet.Core.Tests
await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build());
await c1.DisconnectAsync();
- var subscribe = new MqttSubscribePacket()
- {
- TopicFilters = new List()
- {
- new TopicFilter("retained", MqttQualityOfServiceLevel.AtMostOnce)
- }
- };
-
- //make shure the retainedMessageManagerreceived the package
- while (!(await retainMessagemanager.GetSubscribedMessagesAsync(subscribe)).Any())
- {
- await Task.Delay(TimeSpan.FromMilliseconds(10));
- }
+ await services.WaitForRetainedMessage("retained").TimeoutAfter(TimeSpan.FromSeconds(5));
var c2 = await serverAdapter.ConnectTestClient(s, "c2");
c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++;
@@ -314,6 +302,8 @@ namespace MQTTnet.Core.Tests
await s.StopAsync();
}
+ await services.WaitForRetainedMessage("retained").TimeoutAfter(TimeSpan.FromSeconds(5));
+
s = new MqttFactory(services).CreateMqttServer(options => options.Storage = storage);
var receivedMessagesCount = 0;
@@ -436,4 +426,25 @@ namespace MQTTnet.Core.Tests
Assert.AreEqual(expectedReceivedMessagesCount, receivedMessagesCount);
}
}
+
+ public static class TestExtensions
+ {
+ public static async Task WaitForRetainedMessage(this IServiceProvider services, string topic)
+ {
+ var retainMessagemanager = services.GetRequiredService();
+
+ var subscribe = new MqttSubscribePacket()
+ {
+ TopicFilters = new List()
+ {
+ new TopicFilter(topic, MqttQualityOfServiceLevel.AtMostOnce)
+ }
+ };
+
+ while (!(await retainMessagemanager.GetSubscribedMessagesAsync(subscribe)).Any())
+ {
+ await Task.Delay(TimeSpan.FromMilliseconds(10));
+ }
+ }
+ }
}
From acbf9153f43b96c956e28bf41a6bf05cfa4da7a4 Mon Sep 17 00:00:00 2001
From: Jan Eggers
Date: Thu, 9 Nov 2017 11:06:50 +0100
Subject: [PATCH 036/149] fixed the other timing issue
---
MQTTnet.Core/Server/MqttClientSession.cs | 6 ++++--
Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 2 ++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index fb859b8f..cbdfc73f 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -94,9 +94,11 @@ namespace MQTTnet.Core.Server
}
finally
{
- if (_willMessage != null)
+ var willMessage = _willMessage;
+ if (willMessage != null)
{
- _sessionsManager.DispatchApplicationMessage(this, _willMessage);
+ _willMessage = null; //clear willmessage so it is send just once
+ _sessionsManager.DispatchApplicationMessage(this, willMessage);
}
}
}
diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
index fc252678..7fdaa3d3 100644
--- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
@@ -76,6 +76,8 @@ namespace MQTTnet.Core.Tests
await c2.DisconnectAsync();
await Task.Delay(1000);
+
+ await c1.DisconnectAsync();
}
finally
{
From c01edb192ff65e659b1c3d53e44f59aa953a4bd5 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Thu, 9 Nov 2017 13:26:03 +0100
Subject: [PATCH 037/149] Refactoring
---
Build/MQTTnet.nuspec | 19 ++-----------------
Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 4 +++-
.../TestMqttCommunicationAdapter.cs | 4 ++--
...=> TestMqttCommunicationAdapterFactory.cs} | 4 ++--
.../TestMqttServerAdapter.cs | 8 +++++---
5 files changed, 14 insertions(+), 25 deletions(-)
rename Tests/MQTTnet.Core.Tests/{MqttCommunicationAdapterFactory.cs => TestMqttCommunicationAdapterFactory.cs} (76%)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 5fdc919a..62630c12 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -2,7 +2,7 @@
MQTTnet
- 2.5.0
+ 2.5.1
Christian Kratky
Christian Kratky
https://github.com/chkr1011/MQTTnet/blob/master/LICENSE
@@ -10,22 +10,7 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).
- * [Core] Merged the platform specific projects (Thanks to @JanEggers)
-* [Core] Migrated the trace to a non-static approach (Breaking Change!)
-* [Core] Added a builder for application messages using a fluent API
-* [Core] Introduced CI and DI (Thanks to @JanEggers)
-* [Core] Added interfaces for publishing and receiving which applies to every client and server (Thanks to @ChristianRiedl)
-* [Core] Fixed an issue when reading from closed streams
-* [Client] Added a first version of a managed client which will manage the connection, subscription etc. automatically (Thanks to @JTrotta)
-* [Client] The session state response from the server is now returned in the _ConnectAsync_ method and also part of the _Connected_ event args
-* [Client] Added a _TopicFilterBuilder_ using a fluent API (Namespace Changes!)
-* [Client] Added several new options for the WebSocket channel (Thanks to @ChristianRiedl)
-* [Client] Refactored the options and added a builder using a fluent API (Breaking Change!)
-* [Client] Added more options for WebSocket connections like RequestHeaders, SubProtocol etc.
-* [Server] Added support for WebSockets via ASP.NET Core 2.0 (additional nuget) (Thanks to @ChristianRiedl, @JanEggers)
-* [Server] Added support for a custom application message interceptor
-* [Server] Fixed an issue with dropped connections on UWP (Thanks to @haeberle)
-* [Server] Added support for a custom subscription interceptor which allows denying of subscriptions and closing the connection
+ *
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 Xamarin
diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
index b7098353..fa826c55 100644
--- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs
@@ -53,6 +53,7 @@ namespace MQTTnet.Core.Tests
public async Task MqttServer_WillMessage()
{
var serverAdapter = new TestMqttServerAdapter();
+
var services = new ServiceCollection()
.AddLogging()
.AddMqttServer()
@@ -70,7 +71,7 @@ namespace MQTTnet.Core.Tests
var c2 = await serverAdapter.ConnectTestClient(s, "c2", willMessage);
c1.ApplicationMessageReceived += (_, __) => receivedMessagesCount++;
- await c1.SubscribeAsync(new TopicFilter("#", MqttQualityOfServiceLevel.AtMostOnce));
+ await c1.SubscribeAsync(new TopicFilter("#"));
await c2.DisconnectAsync();
@@ -80,6 +81,7 @@ namespace MQTTnet.Core.Tests
{
await s.StopAsync();
}
+
Assert.AreEqual(1, receivedMessagesCount);
}
diff --git a/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapter.cs b/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapter.cs
index 9e71f8a4..ecde0f14 100644
--- a/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapter.cs
+++ b/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapter.cs
@@ -33,7 +33,7 @@ namespace MQTTnet.Core.Tests
foreach (var packet in packets)
{
- Partner.SendPacketInternal(packet);
+ Partner.EnqueuePacketInternal(packet);
}
return Task.FromResult(0);
@@ -46,7 +46,7 @@ namespace MQTTnet.Core.Tests
return Task.Run(() => _incomingPackets.Take(), cancellationToken);
}
- private void SendPacketInternal(MqttBasePacket packet)
+ private void EnqueuePacketInternal(MqttBasePacket packet)
{
if (packet == null) throw new ArgumentNullException(nameof(packet));
diff --git a/Tests/MQTTnet.Core.Tests/MqttCommunicationAdapterFactory.cs b/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapterFactory.cs
similarity index 76%
rename from Tests/MQTTnet.Core.Tests/MqttCommunicationAdapterFactory.cs
rename to Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapterFactory.cs
index 0e56411c..4a0acadd 100644
--- a/Tests/MQTTnet.Core.Tests/MqttCommunicationAdapterFactory.cs
+++ b/Tests/MQTTnet.Core.Tests/TestMqttCommunicationAdapterFactory.cs
@@ -4,11 +4,11 @@ using MQTTnet.Core.Client;
namespace MQTTnet.Core.Tests
{
- public class MqttCommunicationAdapterFactory : IMqttCommunicationAdapterFactory
+ public class TestMqttCommunicationAdapterFactory : IMqttCommunicationAdapterFactory
{
private readonly IMqttCommunicationAdapter _adapter;
- public MqttCommunicationAdapterFactory(IMqttCommunicationAdapter adapter)
+ public TestMqttCommunicationAdapterFactory(IMqttCommunicationAdapter adapter)
{
_adapter = adapter;
}
diff --git a/Tests/MQTTnet.Core.Tests/TestMqttServerAdapter.cs b/Tests/MQTTnet.Core.Tests/TestMqttServerAdapter.cs
index 067d08fd..cac3b1c0 100644
--- a/Tests/MQTTnet.Core.Tests/TestMqttServerAdapter.cs
+++ b/Tests/MQTTnet.Core.Tests/TestMqttServerAdapter.cs
@@ -17,7 +17,11 @@ namespace MQTTnet.Core.Tests
adapterA.Partner = adapterB;
adapterB.Partner = adapterA;
- var client = new MqttClient(new MqttCommunicationAdapterFactory(adapterA), new TestLogger(), new MqttPacketDispatcher(new TestLogger()));
+ var client = new MqttClient(
+ new TestMqttCommunicationAdapterFactory(adapterA),
+ new TestLogger(),
+ new MqttPacketDispatcher(new TestLogger()));
+
var connected = WaitForClientToConnect(server, clientId);
FireClientAcceptedEvent(adapterB);
@@ -29,8 +33,6 @@ namespace MQTTnet.Core.Tests
ChannelOptions = new MqttClientTcpOptions()
};
- options.ChannelOptions = new MqttClientTcpOptions();
-
await client.ConnectAsync(options);
await connected;
From 3625363fcfb5bef40c84ee5b75647d381adf654a Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Sat, 11 Nov 2017 13:17:54 +0100
Subject: [PATCH 038/149] Fix references. Fix certificate handing issue
---
Build/MQTTnet.AspNetCore.nuspec | 6 +++---
Build/MQTTnet.nuspec | 7 ++++---
MQTTnet.Core/Client/MqttClientOptionsBuilder.cs | 2 +-
MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs | 5 +++++
MQTTnet.Core/Server/MqttClientSession.cs | 8 +++++---
5 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/Build/MQTTnet.AspNetCore.nuspec b/Build/MQTTnet.AspNetCore.nuspec
index 9cf4005e..30717332 100644
--- a/Build/MQTTnet.AspNetCore.nuspec
+++ b/Build/MQTTnet.AspNetCore.nuspec
@@ -2,7 +2,7 @@
MQTTnet.AspNetCore
- 2.5.0
+ 2.5.1
Christian Kratky
Christian Kratky
https://github.com/chkr1011/MQTTnet/blob/master/LICENSE
@@ -10,13 +10,13 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
This is a support library to integrate MQTTnet into AspNetCore.
- initial version
+ * Updated to MQTTnet 2.5.1.
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 Xamarin
-
+
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 771f5365..348ca796 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -10,14 +10,15 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).
- *
+ * Fixed several library reference issues.
+* [Client] Fixed issue in _MqttClientOptionsBuilder_ when using no certificates (Thanks to 1iveowl).
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 Xamarin
-
+
@@ -45,7 +46,7 @@
-
+
diff --git a/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs b/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
index 29a2d64f..fb18cc09 100644
--- a/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
+++ b/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
@@ -98,7 +98,7 @@ namespace MQTTnet.Core.Client
AllowUntrustedCertificates = allowUntrustedCertificates,
IgnoreCertificateChainErrors = ignoreCertificateChainErrors,
IgnoreCertificateRevocationErrors = ignoreCertificateRevocationErrors,
- Certificates = certificates.ToList()
+ Certificates = certificates?.ToList()
};
return this;
diff --git a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
index 6b370db6..1e0fc760 100644
--- a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
+++ b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
@@ -28,6 +28,11 @@ namespace MQTTnet.Core.Server
{
if (adapter == null) throw new ArgumentNullException(nameof(adapter));
+ if (cancellationToken.IsCancellationRequested)
+ {
+ return;
+ }
+
Task.Run(async () => await SendPendingPublishPacketsAsync(adapter, cancellationToken), cancellationToken).ConfigureAwait(false);
}
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index cbdfc73f..93b422ff 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -60,12 +60,14 @@ namespace MQTTnet.Core.Server
try
{
+ var cancellationTokenSource = new CancellationTokenSource();
+
_willMessage = willMessage;
_adapter = adapter;
- _cancellationTokenSource = new CancellationTokenSource();
+ _cancellationTokenSource = cancellationTokenSource;
- _pendingMessagesQueue.Start(adapter, _cancellationTokenSource.Token);
- await ReceivePacketsAsync(adapter, _cancellationTokenSource.Token).ConfigureAwait(false);
+ _pendingMessagesQueue.Start(adapter, cancellationTokenSource.Token);
+ await ReceivePacketsAsync(adapter, cancellationTokenSource.Token).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
From 0844abd7e568fd38ffa5464d964b5e089b53abe2 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Sat, 11 Nov 2017 13:23:11 +0100
Subject: [PATCH 039/149] Fix wrong version in nuget
---
Build/MQTTnet.nuspec | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 348ca796..2e56aa32 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -18,7 +18,7 @@
-
+
From afd56a7f6fdc9d54119b48484db58dfa1975f794 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Sun, 12 Nov 2017 09:22:17 +0100
Subject: [PATCH 040/149] added indication of what Mqtt TargetFramework is used
---
.../TargetFrameworkInfoProvider.cs | 23 +++++++++++++++++++
.../MQTTnet.TestApp.NetCore.csproj | 2 +-
Tests/MQTTnet.TestApp.NetCore/Program.cs | 2 +-
3 files changed, 25 insertions(+), 2 deletions(-)
create mode 100644 Frameworks/MQTTnet.NetStandard/TargetFrameworkInfoProvider.cs
diff --git a/Frameworks/MQTTnet.NetStandard/TargetFrameworkInfoProvider.cs b/Frameworks/MQTTnet.NetStandard/TargetFrameworkInfoProvider.cs
new file mode 100644
index 00000000..22369d9c
--- /dev/null
+++ b/Frameworks/MQTTnet.NetStandard/TargetFrameworkInfoProvider.cs
@@ -0,0 +1,23 @@
+namespace MQTTnet
+{
+ public static class TargetFrameworkInfoProvider
+ {
+ public static string TargetFramework
+ {
+ get
+ {
+#if NET452
+ return "net452";
+#elif NET461
+ return "net461";
+#elif NETSTANDARD1_3
+ return "netstandard1.3";
+#elif NETSTANDARD2_0
+ return "netstandard2.0";
+#elif WINDOWS_UWP
+ return "uap10.0";
+#endif
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj b/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
index 80d6a260..d89bdd31 100644
--- a/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
+++ b/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
@@ -3,7 +3,7 @@
Exe
Full
- netcoreapp2.0;net452
+ netcoreapp2.0;net452;net461
diff --git a/Tests/MQTTnet.TestApp.NetCore/Program.cs b/Tests/MQTTnet.TestApp.NetCore/Program.cs
index 42830870..d1c010fe 100644
--- a/Tests/MQTTnet.TestApp.NetCore/Program.cs
+++ b/Tests/MQTTnet.TestApp.NetCore/Program.cs
@@ -15,7 +15,7 @@ namespace MQTTnet.TestApp.NetCore
{
public static void Main()
{
- Console.WriteLine("MQTTnet - TestApp.NetFramework");
+ Console.WriteLine($"MQTTnet - TestApp.{TargetFrameworkInfoProvider.TargetFramework}");
Console.WriteLine("1 = Start client");
Console.WriteLine("2 = Start server");
Console.WriteLine("3 = Start performance test");
From bc9757576090b16d7117c4271dc2d434f6ac6ba5 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Sun, 12 Nov 2017 12:28:55 +0100
Subject: [PATCH 041/149] downgrade dependencies to be netstandard 1.3
compliant and remove net461 shim requirement
---
Build/MQTTnet.nuspec | 14 +++++++-------
.../MQTTnet.NetStandard/MQTTnet.Netstandard.csproj | 8 ++++----
MQTTnet.Core/MQTTnet.Core.csproj | 4 ++--
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 2e56aa32..1b01bfdf 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -18,10 +18,10 @@
-
-
-
-
+
+
+
+
@@ -47,9 +47,9 @@
-
-
-
+
+
+
diff --git a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
index 266864d1..19d1ce05 100644
--- a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
+++ b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
@@ -53,8 +53,8 @@
-
-
+
+
@@ -64,8 +64,8 @@
-
-
+
+
\ No newline at end of file
diff --git a/MQTTnet.Core/MQTTnet.Core.csproj b/MQTTnet.Core/MQTTnet.Core.csproj
index 71a518d5..522b3fb8 100644
--- a/MQTTnet.Core/MQTTnet.Core.csproj
+++ b/MQTTnet.Core/MQTTnet.Core.csproj
@@ -23,8 +23,8 @@
-
-
+
+
From 5cbbfedcce237d286ed18a7515037377d99a7b93 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Sun, 12 Nov 2017 12:33:56 +0100
Subject: [PATCH 042/149] added testproject for importing mqtt nugets and
verify bin folder
---
MQTTnet.sln | 21 ++++++++++++++++++-
.../MQTTnet.Test.NugetConsumption.csproj | 12 +++++++++++
.../MQTTnet.Test.NugetConsumption/Program.cs | 12 +++++++++++
.../nuget.config | 15 +++++++++++++
4 files changed, 59 insertions(+), 1 deletion(-)
create mode 100644 Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
create mode 100644 Tests/MQTTnet.Test.NugetConsumption/Program.cs
create mode 100644 Tests/MQTTnet.Test.NugetConsumption/nuget.config
diff --git a/MQTTnet.sln b/MQTTnet.sln
index 86fee978..1aeecd64 100644
--- a/MQTTnet.sln
+++ b/MQTTnet.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.27004.2006
+VisualStudioVersion = 15.0.27004.2008
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
@@ -35,6 +35,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.TestApp.AspNetCore2
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.AspNetCore", "Frameworks\MQTTnet.AspnetCore\MQTTnet.AspNetCore.csproj", "{F10C4060-F7EE-4A83-919F-FF723E72F94A}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MQTTnet.Test.NugetConsumption", "Tests\MQTTnet.Test.NugetConsumption\MQTTnet.Test.NugetConsumption.csproj", "{21AD2970-A8C7-4689-A35B-88082AFDABF8}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -165,6 +167,22 @@ Global
{F10C4060-F7EE-4A83-919F-FF723E72F94A}.Release|x64.Build.0 = Release|Any CPU
{F10C4060-F7EE-4A83-919F-FF723E72F94A}.Release|x86.ActiveCfg = Release|Any CPU
{F10C4060-F7EE-4A83-919F-FF723E72F94A}.Release|x86.Build.0 = Release|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|ARM.Build.0 = Debug|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|x64.Build.0 = Debug|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|x86.Build.0 = Debug|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|ARM.ActiveCfg = Release|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|ARM.Build.0 = Release|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|x64.ActiveCfg = Release|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|x64.Build.0 = Release|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|x86.ActiveCfg = Release|Any CPU
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -176,6 +194,7 @@ Global
{3D283AAD-AAA8-4339-8394-52F80B6304DB} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4}
{C6FF8AEA-0855-41EC-A1F3-AC262225BAB9} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4}
{F10C4060-F7EE-4A83-919F-FF723E72F94A} = {32A630A7-2598-41D7-B625-204CD906F5FB}
+ {21AD2970-A8C7-4689-A35B-88082AFDABF8} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {07536672-5CBC-4BE3-ACE0-708A431A7894}
diff --git a/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj b/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
new file mode 100644
index 00000000..3844ef83
--- /dev/null
+++ b/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
@@ -0,0 +1,12 @@
+
+
+
+ Exe
+ netcoreapp2.0;net452;net461
+
+
+
+
+
+
+
diff --git a/Tests/MQTTnet.Test.NugetConsumption/Program.cs b/Tests/MQTTnet.Test.NugetConsumption/Program.cs
new file mode 100644
index 00000000..09ff6c95
--- /dev/null
+++ b/Tests/MQTTnet.Test.NugetConsumption/Program.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace MQTTnet.Test.NugetConsumption
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ var server = new MqttFactory().CreateMqttServer();
+ }
+ }
+}
diff --git a/Tests/MQTTnet.Test.NugetConsumption/nuget.config b/Tests/MQTTnet.Test.NugetConsumption/nuget.config
new file mode 100644
index 00000000..65d399f1
--- /dev/null
+++ b/Tests/MQTTnet.Test.NugetConsumption/nuget.config
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From bdadfa1c264f6ddf6e787a35868af4da80b97394 Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Sun, 12 Nov 2017 14:07:33 +0100
Subject: [PATCH 043/149] added net461 build
---
Build/MQTTnet.nuspec | 9 +++++++++
Build/build.ps1 | 1 +
.../Implementations/MqttServerAdapter.cs | 6 +++---
.../Implementations/MqttTcpChannel.cs | 8 ++++----
.../MQTTnet.Netstandard.csproj | 8 +++++++-
.../MQTTnet.Test.NugetConsumption.csproj | 2 +-
Tests/MQTTnet.Test.NugetConsumption/nuget.config | 15 ---------------
7 files changed, 25 insertions(+), 24 deletions(-)
delete mode 100644 Tests/MQTTnet.Test.NugetConsumption/nuget.config
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 1b01bfdf..453c3522 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -52,6 +52,12 @@
+
+
+
+
+
+
@@ -71,6 +77,9 @@
+
+
+
\ No newline at end of file
diff --git a/Build/build.ps1 b/Build/build.ps1
index 3efa1577..1e47727c 100644
--- a/Build/build.ps1
+++ b/Build/build.ps1
@@ -9,6 +9,7 @@ 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="net452" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m
+ &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net461" /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="netstandard2.0" /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
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
index a6e6251e..e3f048db 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
@@ -1,4 +1,4 @@
-#if NET452 || NETSTANDARD1_3 || NETSTANDARD2_0
+#if NET452 || NET461 || NETSTANDARD1_3 || NETSTANDARD2_0
using System;
using System.Net;
using System.Net.Security;
@@ -98,7 +98,7 @@ namespace MQTTnet.Implementations
try
{
//todo: else branch can be used with min dependency NET46
-#if NET452
+#if NET452 || NET461
var clientSocket = await Task.Factory.FromAsync(_defaultEndpointSocket.BeginAccept, _defaultEndpointSocket.EndAccept, null).ConfigureAwait(false);
#else
var clientSocket = await _defaultEndpointSocket.AcceptAsync().ConfigureAwait(false);
@@ -122,7 +122,7 @@ namespace MQTTnet.Implementations
{
try
{
-#if NET452
+#if NET452 || NET461
var clientSocket = await Task.Factory.FromAsync(_tlsEndpointSocket.BeginAccept, _tlsEndpointSocket.EndAccept, null).ConfigureAwait(false);
#else
var clientSocket = await _tlsEndpointSocket.AcceptAsync().ConfigureAwait(false);
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
index 2bf418bc..a7e40268 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
@@ -1,4 +1,4 @@
-#if NET452 || NETSTANDARD1_3 || NETSTANDARD2_0
+#if NET452 || NET461 || NETSTANDARD1_3 || NETSTANDARD2_0
using System;
using System.Net.Security;
using System.Net.Sockets;
@@ -17,7 +17,7 @@ namespace MQTTnet.Implementations
private readonly MqttClientTcpOptions _options;
//todo: this can be used with min dependency NetStandard1.6
-#if NET452
+#if NET452 || NET461
// ReSharper disable once MemberCanBePrivate.Global
// ReSharper disable once AutoPropertyCanBeMadeGetOnly.Global
public static int BufferSize { get; set; } = 4096 * 20; // Can be changed for fine tuning by library user.
@@ -59,7 +59,7 @@ namespace MQTTnet.Implementations
}
//todo: else brach can be used with min dependency NET46
-#if NET452
+#if NET452 || NET461
await Task.Factory.FromAsync(_socket.BeginConnect, _socket.EndConnect, _options.Server, _options.GetPort(), null).ConfigureAwait(false);
#else
await _socket.ConnectAsync(_options.Server, _options.GetPort()).ConfigureAwait(false);
@@ -144,7 +144,7 @@ namespace MQTTnet.Implementations
//need two streams otherwise read and write have to be synchronized
//todo: if branch can be used with min dependency NetStandard1.6
-#if NET452
+#if NET452 || NET461
SendStream = new BufferedStream(stream, BufferSize);
ReceiveStream = new BufferedStream(stream, BufferSize);
#else
diff --git a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
index 19d1ce05..41c30d39 100644
--- a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
+++ b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
@@ -1,7 +1,7 @@
- netstandard1.3;netstandard2.0;net452;uap10.0
+ netstandard1.3;netstandard2.0;net452;net461;uap10.0
MQTTnet
MQTTnet
2.5.0.0
@@ -68,4 +68,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj b/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
index 3844ef83..53680050 100644
--- a/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
+++ b/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
@@ -6,7 +6,7 @@
-
+
diff --git a/Tests/MQTTnet.Test.NugetConsumption/nuget.config b/Tests/MQTTnet.Test.NugetConsumption/nuget.config
deleted file mode 100644
index 65d399f1..00000000
--- a/Tests/MQTTnet.Test.NugetConsumption/nuget.config
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
From 38904a62136d20ef0ead983ef9d764f3e7f7f9ef Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Sun, 12 Nov 2017 14:13:39 +0100
Subject: [PATCH 044/149] removed testapp again
---
MQTTnet.sln | 19 -------------------
.../MQTTnet.Test.NugetConsumption.csproj | 12 ------------
.../MQTTnet.Test.NugetConsumption/Program.cs | 12 ------------
3 files changed, 43 deletions(-)
delete mode 100644 Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
delete mode 100644 Tests/MQTTnet.Test.NugetConsumption/Program.cs
diff --git a/MQTTnet.sln b/MQTTnet.sln
index 1aeecd64..326fe7ea 100644
--- a/MQTTnet.sln
+++ b/MQTTnet.sln
@@ -35,8 +35,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.TestApp.AspNetCore2
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.AspNetCore", "Frameworks\MQTTnet.AspnetCore\MQTTnet.AspNetCore.csproj", "{F10C4060-F7EE-4A83-919F-FF723E72F94A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MQTTnet.Test.NugetConsumption", "Tests\MQTTnet.Test.NugetConsumption\MQTTnet.Test.NugetConsumption.csproj", "{21AD2970-A8C7-4689-A35B-88082AFDABF8}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -167,22 +165,6 @@ Global
{F10C4060-F7EE-4A83-919F-FF723E72F94A}.Release|x64.Build.0 = Release|Any CPU
{F10C4060-F7EE-4A83-919F-FF723E72F94A}.Release|x86.ActiveCfg = Release|Any CPU
{F10C4060-F7EE-4A83-919F-FF723E72F94A}.Release|x86.Build.0 = Release|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|ARM.Build.0 = Debug|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|x64.ActiveCfg = Debug|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|x64.Build.0 = Debug|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|x86.ActiveCfg = Debug|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Debug|x86.Build.0 = Debug|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|Any CPU.Build.0 = Release|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|ARM.ActiveCfg = Release|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|ARM.Build.0 = Release|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|x64.ActiveCfg = Release|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|x64.Build.0 = Release|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|x86.ActiveCfg = Release|Any CPU
- {21AD2970-A8C7-4689-A35B-88082AFDABF8}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -194,7 +176,6 @@ Global
{3D283AAD-AAA8-4339-8394-52F80B6304DB} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4}
{C6FF8AEA-0855-41EC-A1F3-AC262225BAB9} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4}
{F10C4060-F7EE-4A83-919F-FF723E72F94A} = {32A630A7-2598-41D7-B625-204CD906F5FB}
- {21AD2970-A8C7-4689-A35B-88082AFDABF8} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {07536672-5CBC-4BE3-ACE0-708A431A7894}
diff --git a/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj b/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
deleted file mode 100644
index 53680050..00000000
--- a/Tests/MQTTnet.Test.NugetConsumption/MQTTnet.Test.NugetConsumption.csproj
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
- Exe
- netcoreapp2.0;net452;net461
-
-
-
-
-
-
-
diff --git a/Tests/MQTTnet.Test.NugetConsumption/Program.cs b/Tests/MQTTnet.Test.NugetConsumption/Program.cs
deleted file mode 100644
index 09ff6c95..00000000
--- a/Tests/MQTTnet.Test.NugetConsumption/Program.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-
-namespace MQTTnet.Test.NugetConsumption
-{
- class Program
- {
- static void Main(string[] args)
- {
- var server = new MqttFactory().CreateMqttServer();
- }
- }
-}
From 8672fb2792e8e2c72b243c7b0179e2d4b721f6ce Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Sun, 12 Nov 2017 16:46:32 +0100
Subject: [PATCH 045/149] fixed websocket subprotocol negotiation
---
.../ApplicationBuilderExtensions.cs | 16 +++++++++++++++-
Tests/MQTTnet.TestApp.NetCore/ClientTest.cs | 8 ++++----
2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs b/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs
index 06ca74d4..210f8a4b 100644
--- a/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs
+++ b/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs
@@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using MQTTnet.Core.Server;
+using System.Linq;
namespace MQTTnet.AspNetCore
{
@@ -14,8 +15,21 @@ namespace MQTTnet.AspNetCore
{
if (context.Request.Path == path && context.WebSockets.IsWebSocketRequest)
{
+ string subprotocol = null;
+
+ if (context.Request.Headers.TryGetValue("Sec-WebSocket-Protocol", out var requestedSubProtocolValues))
+ {
+ if (requestedSubProtocolValues.Count > 0)
+ {
+ if (requestedSubProtocolValues.Any(v => v.ToLower() == "mqtt"))
+ {
+ subprotocol = "mqtt";
+ }
+ }
+ }
+
var adapter = app.ApplicationServices.GetRequiredService();
- using (var webSocket = await context.WebSockets.AcceptWebSocketAsync("mqtt"))
+ using (var webSocket = await context.WebSockets.AcceptWebSocketAsync(subprotocol))
{
await adapter.AcceptWebSocketAsync(webSocket);
}
diff --git a/Tests/MQTTnet.TestApp.NetCore/ClientTest.cs b/Tests/MQTTnet.TestApp.NetCore/ClientTest.cs
index df3cd760..bc644e54 100644
--- a/Tests/MQTTnet.TestApp.NetCore/ClientTest.cs
+++ b/Tests/MQTTnet.TestApp.NetCore/ClientTest.cs
@@ -21,10 +21,10 @@ namespace MQTTnet.TestApp.NetCore
{
Server = "localhost"
},
- ////ChannelOptions = new MqttClientWebSocketOptions
- ////{
- //// Uri = "localhost"
- ////}
+ //ChannelOptions = new MqttClientWebSocketOptions
+ //{
+ // Uri = "ws://localhost:59690/mqtt"
+ //}
};
var factory = new MqttFactory();
From c775867db49a68243cd798c5ee5759d75e6d17eb Mon Sep 17 00:00:00 2001
From: JanEggers
Date: Sun, 12 Nov 2017 16:58:13 +0100
Subject: [PATCH 046/149] merged if statements
---
.../ApplicationBuilderExtensions.cs | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs b/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs
index 210f8a4b..831392da 100644
--- a/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs
+++ b/Frameworks/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs
@@ -17,15 +17,12 @@ namespace MQTTnet.AspNetCore
{
string subprotocol = null;
- if (context.Request.Headers.TryGetValue("Sec-WebSocket-Protocol", out var requestedSubProtocolValues))
+ if (context.Request.Headers.TryGetValue("Sec-WebSocket-Protocol", out var requestedSubProtocolValues)
+ && requestedSubProtocolValues.Count > 0
+ && requestedSubProtocolValues.Any(v => v.ToLower() == "mqtt")
+ )
{
- if (requestedSubProtocolValues.Count > 0)
- {
- if (requestedSubProtocolValues.Any(v => v.ToLower() == "mqtt"))
- {
- subprotocol = "mqtt";
- }
- }
+ subprotocol = "mqtt";
}
var adapter = app.ApplicationServices.GetRequiredService();
From 0c4c93784d0732c862ae00318d677dbf0a86117a Mon Sep 17 00:00:00 2001
From: 1iveowl
Date: Sun, 12 Nov 2017 22:59:06 +0100
Subject: [PATCH 047/149] Reference to MQTT Tester
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 985c2837..9fb91672 100644
--- a/README.md
+++ b/README.md
@@ -78,6 +78,7 @@ This library is used in the following projects:
* MQTT Client Rx (Wrapper for Reactive Extensions, )
* Wirehome (Open Source Home Automation system for .NET, )
+* MQTT Tester app (for [Android](https://play.google.com/store/apps/details?id=com.liveowl.mqtttester), [iOS](https://itunes.apple.com/us/app/mqtt-tester/id1278621826?mt=8), and [Windows 10](https://www.microsoft.com/en-us/store/p/mqtt-tester/9wzdncrd272c))
If you use this library and want to see your project here please let me know.
@@ -101,4 +102,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
+SOFTWARE.
From c322817cb15ee575761721807327e4d0fca10b03 Mon Sep 17 00:00:00 2001
From: 1iveowl
Date: Sun, 12 Nov 2017 23:16:54 +0100
Subject: [PATCH 048/149] Reference to MQTT Tester
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 9fb91672..3fcbeaa6 100644
--- a/README.md
+++ b/README.md
@@ -77,8 +77,9 @@ If you want to contribute to this project just create a pull request. But only p
This library is used in the following projects:
* MQTT Client Rx (Wrapper for Reactive Extensions, )
+* MQTT Tester (MQTT test appfor [Android](https://play.google.com/store/apps/details?id=com.liveowl.mqtttester), [iOS](https://itunes.apple.com/us/app/mqtt-tester/id1278621826?mt=8), and [Windows 10](https://www.microsoft.com/en-us/store/p/mqtt-tester/9wzdncrd272c))
* Wirehome (Open Source Home Automation system for .NET, )
-* MQTT Tester app (for [Android](https://play.google.com/store/apps/details?id=com.liveowl.mqtttester), [iOS](https://itunes.apple.com/us/app/mqtt-tester/id1278621826?mt=8), and [Windows 10](https://www.microsoft.com/en-us/store/p/mqtt-tester/9wzdncrd272c))
+
If you use this library and want to see your project here please let me know.
From 9d971003d58647721c5865fdf6111f674f1e3110 Mon Sep 17 00:00:00 2001
From: 1iveowl
Date: Sun, 12 Nov 2017 23:17:26 +0100
Subject: [PATCH 049/149] Reference to MQTT Tester
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 3fcbeaa6..75fa488e 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ If you want to contribute to this project just create a pull request. But only p
This library is used in the following projects:
* MQTT Client Rx (Wrapper for Reactive Extensions, )
-* MQTT Tester (MQTT test appfor [Android](https://play.google.com/store/apps/details?id=com.liveowl.mqtttester), [iOS](https://itunes.apple.com/us/app/mqtt-tester/id1278621826?mt=8), and [Windows 10](https://www.microsoft.com/en-us/store/p/mqtt-tester/9wzdncrd272c))
+* MQTT Tester (MQTT test app for [Android](https://play.google.com/store/apps/details?id=com.liveowl.mqtttester), [iOS](https://itunes.apple.com/us/app/mqtt-tester/id1278621826?mt=8), and [Windows 10](https://www.microsoft.com/en-us/store/p/mqtt-tester/9wzdncrd272c))
* Wirehome (Open Source Home Automation system for .NET, )
From c4b706f8ad363f6f8b2da6d403774a653cd2143e Mon Sep 17 00:00:00 2001
From: 1iveowl
Date: Sun, 12 Nov 2017 23:19:37 +0100
Subject: [PATCH 050/149] Reference to MQTT Tester
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 75fa488e..6db587aa 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ If you want to contribute to this project just create a pull request. But only p
This library is used in the following projects:
* MQTT Client Rx (Wrapper for Reactive Extensions, )
-* MQTT Tester (MQTT test app for [Android](https://play.google.com/store/apps/details?id=com.liveowl.mqtttester), [iOS](https://itunes.apple.com/us/app/mqtt-tester/id1278621826?mt=8), and [Windows 10](https://www.microsoft.com/en-us/store/p/mqtt-tester/9wzdncrd272c))
+* MQTT Tester (MQTT client test app for [Android](https://play.google.com/store/apps/details?id=com.liveowl.mqtttester), [iOS](https://itunes.apple.com/us/app/mqtt-tester/id1278621826?mt=8), and [Windows 10](https://www.microsoft.com/en-us/store/p/mqtt-tester/9wzdncrd272c))
* Wirehome (Open Source Home Automation system for .NET, )
From 6e615f85eb640c813bcff4ddcc290ad0a2136847 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 15 Nov 2017 20:59:03 +0100
Subject: [PATCH 051/149] Update docs
---
Build/MQTTnet.nuspec | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 2e56aa32..519ebc25 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -2,7 +2,7 @@
MQTTnet
- 2.5.1
+ 2.5.1.1
Christian Kratky
Christian Kratky
https://github.com/chkr1011/MQTTnet/blob/master/LICENSE
@@ -10,8 +10,8 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).
- * Fixed several library reference issues.
-* [Client] Fixed issue in _MqttClientOptionsBuilder_ when using no certificates (Thanks to 1iveowl).
+ * [Client] Fixed WebSocket sub protocol negotiation (Thanks to @JanEggers)
+
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 Xamarin
From 8de87c8772a94c249b1a90fcd04ff0711a73a5e3 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Thu, 16 Nov 2017 00:28:56 +0100
Subject: [PATCH 052/149] Wrap COM exceptions, close client connection when
server stops, process retained messages from server
---
Build/MQTTnet.nuspec | 7 +-
.../Implementations/MqttWebSocketChannel.cs | 15 +-
.../Implementations/WebSocketStream.cs | 2 +-
Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 4 +-
.../MqttChannelCommunicationAdapter.cs | 231 ++++++++----------
MQTTnet.Core/Server/IMqttServer.cs | 3 +-
.../Server/MqttClientPendingMessagesQueue.cs | 2 +-
MQTTnet.Core/Server/MqttClientSession.cs | 53 ++--
.../Server/MqttClientSessionsManager.cs | 85 +++++--
MQTTnet.Core/Server/MqttServer.cs | 30 +--
10 files changed, 204 insertions(+), 228 deletions(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 8bdd4a17..c1cd3718 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -10,8 +10,11 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).
- * [Client] Fixed WebSocket sub protocol negotiation (Thanks to @JanEggers)
-
+ * [Core] Fixed library reference issues for .NET 4.6 (Thanks to @JanEggers).
+* [Core] Several COM exceptions are now wrapped properly resulting in less warnings in the trace.
+* [Client] Fixed WebSocket sub protocol negotiation for ASP.NET Core 2 servers (Thanks to @JanEggers).
+* [Server] Client connections are now closed when the server is stopped (Thanks to @zhudanfei).
+* [Server] Published messages from the server are now retained (if set) (Thanks to @ChristianRiedl). BREAKING CHANGE!
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 Xamarin
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
index 1314a1c3..c7cd3d02 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
@@ -19,9 +19,8 @@ namespace MQTTnet.Implementations
_options = options ?? throw new ArgumentNullException(nameof(options));
}
- public Stream SendStream => RawReceiveStream;
- public Stream ReceiveStream => RawReceiveStream;
- public Stream RawReceiveStream { get; private set; }
+ public Stream SendStream { get; private set; }
+ public Stream ReceiveStream { get; private set; }
public async Task ConnectAsync()
{
@@ -32,7 +31,7 @@ namespace MQTTnet.Implementations
}
_webSocket = new ClientWebSocket();
-
+
if (_options.RequestHeaders != null)
{
foreach (var requestHeader in _options.RequestHeaders)
@@ -64,13 +63,13 @@ namespace MQTTnet.Implementations
}
await _webSocket.ConnectAsync(new Uri(uri), CancellationToken.None).ConfigureAwait(false);
- RawReceiveStream = new WebSocketStream(_webSocket);
+
+ SendStream = new WebSocketStream(_webSocket);
+ ReceiveStream = SendStream;
}
public async Task DisconnectAsync()
{
- RawReceiveStream = null;
-
if (_webSocket == null)
{
return;
@@ -80,6 +79,8 @@ namespace MQTTnet.Implementations
{
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).ConfigureAwait(false);
}
+
+ _webSocket = null;
}
public void Dispose()
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/WebSocketStream.cs b/Frameworks/MQTTnet.NetStandard/Implementations/WebSocketStream.cs
index c27e4801..fb2d8121 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/WebSocketStream.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/WebSocketStream.cs
@@ -43,7 +43,7 @@ namespace MQTTnet.Implementations
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);
diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
index 1729350c..c8b7968e 100644
--- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
+++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
@@ -85,9 +85,7 @@ namespace MQTTnet
clientSessionsManager,
_serviceProvider.GetRequiredService(),
_serviceProvider.GetRequiredService>(),
- _serviceProvider.GetRequiredService>(),
- _serviceProvider.GetRequiredService()
- );
+ _serviceProvider.GetRequiredService>());
}
public IMqttClient CreateMqttClient()
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
index 35573023..c859ec0d 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
+using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Channel;
@@ -14,10 +15,12 @@ namespace MQTTnet.Core.Adapter
{
public class MqttChannelCommunicationAdapter : IMqttCommunicationAdapter
{
+ private const uint ErrorOperationAborted = 0x800703E3;
+
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
private readonly ILogger _logger;
private readonly IMqttCommunicationChannel _channel;
-
+
public MqttChannelCommunicationAdapter(IMqttCommunicationChannel channel, IMqttPacketSerializer serializer, ILogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
@@ -29,166 +32,87 @@ namespace MQTTnet.Core.Adapter
public async Task ConnectAsync(TimeSpan timeout)
{
- try
- {
- await _channel.ConnectAsync().TimeoutAfter(timeout).ConfigureAwait(false);
- }
- catch (TaskCanceledException)
- {
- throw;
- }
- catch (OperationCanceledException)
- {
- throw;
- }
- catch (MqttCommunicationTimedOutException)
- {
- throw;
- }
- catch (MqttCommunicationException)
- {
- throw;
- }
- catch (Exception exception)
- {
- throw new MqttCommunicationException(exception);
- }
+ await ExecuteAndWrapExceptionAsync(() => _channel.ConnectAsync().TimeoutAfter(timeout));
}
public async Task DisconnectAsync(TimeSpan timeout)
{
- try
- {
- await _channel.DisconnectAsync().TimeoutAfter(timeout).ConfigureAwait(false);
- }
- catch (TaskCanceledException)
- {
- throw;
- }
- catch (OperationCanceledException)
- {
- throw;
- }
- catch (MqttCommunicationTimedOutException)
- {
- throw;
- }
- catch (MqttCommunicationException)
- {
- throw;
- }
- catch (Exception exception)
- {
- throw new MqttCommunicationException(exception);
- }
+ await ExecuteAndWrapExceptionAsync(() => _channel.DisconnectAsync().TimeoutAfter(timeout));
}
public async Task SendPacketsAsync(TimeSpan timeout, CancellationToken cancellationToken, IEnumerable packets)
{
- try
+ await ExecuteAndWrapExceptionAsync(async () =>
{
await _semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
-
- foreach (var packet in packets)
+ try
{
- if (packet == null)
+ foreach (var packet in packets)
{
- continue;
+ if (packet == null)
+ {
+ continue;
+ }
+
+ _logger.LogInformation("TX >>> {0} [Timeout={1}]", packet, timeout);
+
+ var writeBuffer = PacketSerializer.Serialize(packet);
+ await _channel.SendStream.WriteAsync(writeBuffer, 0, writeBuffer.Length, cancellationToken).ConfigureAwait(false);
}
- _logger.LogInformation("TX >>> {0} [Timeout={1}]", packet, timeout);
-
- var writeBuffer = PacketSerializer.Serialize(packet);
- await _channel.SendStream.WriteAsync(writeBuffer, 0, writeBuffer.Length, cancellationToken).ConfigureAwait(false);
+ if (timeout > TimeSpan.Zero)
+ {
+ await _channel.SendStream.FlushAsync(cancellationToken).TimeoutAfter(timeout).ConfigureAwait(false);
+ }
+ else
+ {
+ await _channel.SendStream.FlushAsync(cancellationToken).ConfigureAwait(false);
+ }
}
-
- if (timeout > TimeSpan.Zero)
+ finally
{
- await _channel.SendStream.FlushAsync(cancellationToken).TimeoutAfter(timeout).ConfigureAwait(false);
+ _semaphore.Release();
}
- else
- {
- await _channel.SendStream.FlushAsync(cancellationToken).ConfigureAwait(false);
- }
- }
- catch (TaskCanceledException)
- {
- throw;
- }
- catch (OperationCanceledException)
- {
- throw;
- }
- catch (MqttCommunicationTimedOutException)
- {
- throw;
- }
- catch (MqttCommunicationException)
- {
- throw;
- }
- catch (Exception exception)
- {
- throw new MqttCommunicationException(exception);
- }
- finally
- {
- _semaphore.Release();
- }
+ });
}
public async Task ReceivePacketAsync(TimeSpan timeout, CancellationToken cancellationToken)
{
- ReceivedMqttPacket receivedMqttPacket = null;
- try
+ MqttBasePacket packet = null;
+ await ExecuteAndWrapExceptionAsync(async () =>
{
- if (timeout > TimeSpan.Zero)
+ ReceivedMqttPacket receivedMqttPacket = null;
+ try
{
- receivedMqttPacket = await ReceiveAsync(_channel.ReceiveStream, cancellationToken).TimeoutAfter(timeout).ConfigureAwait(false);
- }
- else
- {
- receivedMqttPacket = await ReceiveAsync(_channel.ReceiveStream, cancellationToken).ConfigureAwait(false);
- }
+ if (timeout > TimeSpan.Zero)
+ {
+ receivedMqttPacket = await ReceiveAsync(_channel.ReceiveStream, cancellationToken).TimeoutAfter(timeout).ConfigureAwait(false);
+ }
+ else
+ {
+ receivedMqttPacket = await ReceiveAsync(_channel.ReceiveStream, cancellationToken).ConfigureAwait(false);
+ }
- if (receivedMqttPacket == null || cancellationToken.IsCancellationRequested)
- {
- throw new TaskCanceledException();
- }
+ if (receivedMqttPacket == null || cancellationToken.IsCancellationRequested)
+ {
+ throw new TaskCanceledException();
+ }
- var packet = PacketSerializer.Deserialize(receivedMqttPacket);
- if (packet == null)
- {
- throw new MqttProtocolViolationException("Received malformed packet.");
- }
+ packet = PacketSerializer.Deserialize(receivedMqttPacket);
+ if (packet == null)
+ {
+ throw new MqttProtocolViolationException("Received malformed packet.");
+ }
- _logger.LogInformation("RX <<< {0}", packet);
- return packet;
- }
- catch (TaskCanceledException)
- {
- throw;
- }
- catch (OperationCanceledException)
- {
- throw;
- }
- catch (MqttCommunicationTimedOutException)
- {
- throw;
- }
- catch (MqttCommunicationException)
- {
- throw;
- }
- catch (Exception exception)
- {
- throw new MqttCommunicationException(exception);
- }
- finally
- {
- receivedMqttPacket?.Dispose();
- }
+ _logger.LogInformation("RX <<< {0}", packet);
+ }
+ finally
+ {
+ receivedMqttPacket?.Dispose();
+ }
+ });
+
+ return packet;
}
private static async Task ReceiveAsync(Stream stream, CancellationToken cancellationToken)
@@ -215,5 +139,42 @@ namespace MQTTnet.Core.Adapter
return new ReceivedMqttPacket(header, new MemoryStream(body, 0, body.Length));
}
+
+ private static async Task ExecuteAndWrapExceptionAsync(Func action)
+ {
+ try
+ {
+ await action().ConfigureAwait(false);
+ }
+ catch (TaskCanceledException)
+ {
+ throw;
+ }
+ catch (OperationCanceledException)
+ {
+ throw;
+ }
+ catch (MqttCommunicationTimedOutException)
+ {
+ throw;
+ }
+ catch (MqttCommunicationException)
+ {
+ throw;
+ }
+ catch (COMException comException)
+ {
+ if ((uint)comException.HResult == ErrorOperationAborted)
+ {
+ throw new OperationCanceledException();
+ }
+
+ throw new MqttCommunicationException(comException);
+ }
+ catch (Exception exception)
+ {
+ throw new MqttCommunicationException(exception);
+ }
+ }
}
}
diff --git a/MQTTnet.Core/Server/IMqttServer.cs b/MQTTnet.Core/Server/IMqttServer.cs
index 13c614fc..8d860777 100644
--- a/MQTTnet.Core/Server/IMqttServer.cs
+++ b/MQTTnet.Core/Server/IMqttServer.cs
@@ -10,8 +10,7 @@ namespace MQTTnet.Core.Server
event EventHandler ClientDisconnected;
event EventHandler Started;
- IList GetConnectedClients();
- void Publish(IEnumerable applicationMessages);
+ Task> GetConnectedClientsAsync();
Task StartAsync();
Task StopAsync();
diff --git a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
index 1e0fc760..16c90944 100644
--- a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
+++ b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
@@ -96,7 +96,7 @@ namespace MQTTnet.Core.Server
_pendingPublishPackets.Add(packet, CancellationToken.None);
}
- _session.Stop();
+ await _session.StopAsync();
}
}
}
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index 93b422ff..42451dd0 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -17,7 +17,6 @@ namespace MQTTnet.Core.Server
{
private readonly HashSet _unacknowledgedPublishPackets = new HashSet();
- private readonly IMqttClientRetainedMessageManager _clientRetainedMessageManager;
private readonly MqttClientSubscriptionsManager _subscriptionsManager;
private readonly MqttClientSessionsManager _sessionsManager;
private readonly MqttClientPendingMessagesQueue _pendingMessagesQueue;
@@ -34,10 +33,8 @@ namespace MQTTnet.Core.Server
MqttClientSessionsManager sessionsManager,
MqttClientSubscriptionsManager subscriptionsManager,
ILogger logger,
- ILogger messageQueueLogger,
- IMqttClientRetainedMessageManager clientRetainedMessageManager)
+ ILogger messageQueueLogger)
{
- _clientRetainedMessageManager = clientRetainedMessageManager ?? throw new ArgumentNullException(nameof(clientRetainedMessageManager));
_sessionsManager = sessionsManager ?? throw new ArgumentNullException(nameof(sessionsManager));
_subscriptionsManager = subscriptionsManager ?? throw new ArgumentNullException(nameof(subscriptionsManager));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
@@ -82,7 +79,7 @@ namespace MQTTnet.Core.Server
}
}
- public void Stop()
+ public async Task StopAsync()
{
try
{
@@ -90,17 +87,21 @@ namespace MQTTnet.Core.Server
_cancellationTokenSource?.Dispose();
_cancellationTokenSource = null;
- _adapter = null;
+ if (_adapter != null)
+ {
+ await _adapter.DisconnectAsync(_options.DefaultCommunicationTimeout).ConfigureAwait(false);
+ _adapter = null;
+ }
- _logger.LogInformation("Client '{0}': Disconnected.", ClientId);
+ _logger.LogInformation("Client '{0}': Session stopped.", ClientId);
}
finally
{
- var willMessage = _willMessage;
+ var willMessage = _willMessage;
if (willMessage != null)
{
_willMessage = null; //clear willmessage so it is send just once
- _sessionsManager.DispatchApplicationMessage(this, willMessage);
+ await _sessionsManager.DispatchApplicationMessageAsync(this, willMessage);
}
}
}
@@ -133,12 +134,12 @@ namespace MQTTnet.Core.Server
catch (MqttCommunicationException exception)
{
_logger.LogWarning(new EventId(), exception, "Client '{0}': Communication exception while processing client packets.", ClientId);
- Stop();
+ await StopAsync();
}
catch (Exception exception)
{
_logger.LogError(new EventId(), exception, "Client '{0}': Unhandled exception while processing client packets.", ClientId);
- Stop();
+ await StopAsync();
}
}
@@ -182,14 +183,11 @@ namespace MQTTnet.Core.Server
if (packet is MqttDisconnectPacket || packet is MqttConnectPacket)
{
- Stop();
- return Task.FromResult(0);
+ return StopAsync();
}
_logger.LogWarning("Client '{0}': Received not supported packet ({1}). Closing connection.", ClientId, packet);
- Stop();
-
- return Task.FromResult(0);
+ return StopAsync();
}
private async Task HandleIncomingSubscribePacketAsync(IMqttCommunicationAdapter adapter, MqttSubscribePacket subscribePacket, CancellationToken cancellationToken)
@@ -202,13 +200,13 @@ namespace MQTTnet.Core.Server
if (subscribeResult.CloseConnection)
{
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttDisconnectPacket()).ConfigureAwait(false);
- Stop();
+ await StopAsync();
}
}
private async Task EnqueueSubscribedRetainedMessagesAsync(MqttSubscribePacket subscribePacket)
{
- var retainedMessages = await _clientRetainedMessageManager.GetSubscribedMessagesAsync(subscribePacket).ConfigureAwait(false);
+ var retainedMessages = await _sessionsManager.GetRetainedMessagesAsync(subscribePacket).ConfigureAwait(false);
foreach (var publishPacket in retainedMessages)
{
EnqueuePublishPacket(publishPacket.ToPublishPacket());
@@ -219,29 +217,16 @@ namespace MQTTnet.Core.Server
{
var applicationMessage = publishPacket.ToApplicationMessage();
- var interceptorContext = new MqttApplicationMessageInterceptorContext
- {
- ApplicationMessage = applicationMessage
- };
-
- _options.ApplicationMessageInterceptor?.Invoke(interceptorContext);
- applicationMessage = interceptorContext.ApplicationMessage;
-
- if (applicationMessage.Retain)
- {
- await _clientRetainedMessageManager.HandleMessageAsync(ClientId, applicationMessage).ConfigureAwait(false);
- }
-
switch (applicationMessage.QualityOfServiceLevel)
{
case MqttQualityOfServiceLevel.AtMostOnce:
{
- _sessionsManager.DispatchApplicationMessage(this, applicationMessage);
+ await _sessionsManager.DispatchApplicationMessageAsync(this, applicationMessage);
return;
}
case MqttQualityOfServiceLevel.AtLeastOnce:
{
- _sessionsManager.DispatchApplicationMessage(this, applicationMessage);
+ await _sessionsManager.DispatchApplicationMessageAsync(this, applicationMessage);
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken,
new MqttPubAckPacket { PacketIdentifier = publishPacket.PacketIdentifier });
@@ -256,7 +241,7 @@ namespace MQTTnet.Core.Server
_unacknowledgedPublishPackets.Add(publishPacket.PacketIdentifier);
}
- _sessionsManager.DispatchApplicationMessage(this, applicationMessage);
+ await _sessionsManager.DispatchApplicationMessageAsync(this, applicationMessage);
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken,
new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier }).ConfigureAwait(false);
diff --git a/MQTTnet.Core/Server/MqttClientSessionsManager.cs b/MQTTnet.Core/Server/MqttClientSessionsManager.cs
index 48fd33ec..80722ab7 100644
--- a/MQTTnet.Core/Server/MqttClientSessionsManager.cs
+++ b/MQTTnet.Core/Server/MqttClientSessionsManager.cs
@@ -16,19 +16,24 @@ namespace MQTTnet.Core.Server
{
public sealed class MqttClientSessionsManager
{
- private readonly Dictionary _clientSessions = new Dictionary();
+ private readonly Dictionary _sessions = new Dictionary();
+ private readonly SemaphoreSlim _sessionsSemaphore = new SemaphoreSlim(1, 1);
+
+ private readonly MqttServerOptions _options;
private readonly ILogger _logger;
private readonly IMqttClientSesssionFactory _clientSesssionFactory;
- private readonly MqttServerOptions _options;
+ private readonly IMqttClientRetainedMessageManager _clientRetainedMessageManager;
public MqttClientSessionsManager(
- IOptions options,
+ IOptions options,
ILogger logger,
- IMqttClientSesssionFactory clientSesssionFactory)
+ IMqttClientSesssionFactory clientSesssionFactory,
+ IMqttClientRetainedMessageManager clientRetainedMessageManager)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_options = options.Value ?? throw new ArgumentNullException(nameof(options));
_clientSesssionFactory = clientSesssionFactory ?? throw new ArgumentNullException(nameof(clientSesssionFactory));
+ _clientRetainedMessageManager = clientRetainedMessageManager ?? throw new ArgumentNullException(nameof(clientRetainedMessageManager));
}
public event EventHandler ClientConnected;
@@ -61,7 +66,7 @@ namespace MQTTnet.Core.Server
return;
}
- var clientSession = GetOrCreateClientSession(connectPacket);
+ var clientSession = await GetOrCreateClientSessionAsync(connectPacket);
await clientAdapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new MqttConnAckPacket
{
@@ -92,7 +97,7 @@ namespace MQTTnet.Core.Server
}
catch (Exception)
{
- //ignored
+ // ignored
}
ClientDisconnected?.Invoke(this, new MqttClientDisconnectedEventArgs(new ConnectedMqttClient
@@ -103,30 +108,58 @@ namespace MQTTnet.Core.Server
}
}
- public void Clear()
+ public async Task StopAsync()
{
- lock (_clientSessions)
+ await _sessionsSemaphore.WaitAsync().ConfigureAwait(false);
+ try
{
- _clientSessions.Clear();
+ foreach (var session in _sessions)
+ {
+ await session.Value.StopAsync();
+ }
+
+ _sessions.Clear();
+ }
+ finally
+ {
+ _sessionsSemaphore.Release();
}
}
- public IList GetConnectedClients()
+ public async Task> GetConnectedClientsAsync()
{
- lock (_clientSessions)
+ await _sessionsSemaphore.WaitAsync().ConfigureAwait(false);
+ try
{
- return _clientSessions.Where(s => s.Value.IsConnected).Select(s => new ConnectedMqttClient
+ return _sessions.Where(s => s.Value.IsConnected).Select(s => new ConnectedMqttClient
{
ClientId = s.Value.ClientId,
ProtocolVersion = s.Value.ProtocolVersion ?? MqttProtocolVersion.V311
}).ToList();
}
+ finally
+ {
+ _sessionsSemaphore.Release();
+ }
}
- public void DispatchApplicationMessage(MqttClientSession senderClientSession, MqttApplicationMessage applicationMessage)
+ public async Task DispatchApplicationMessageAsync(MqttClientSession senderClientSession, MqttApplicationMessage applicationMessage)
{
try
{
+ var interceptorContext = new MqttApplicationMessageInterceptorContext
+ {
+ ApplicationMessage = applicationMessage
+ };
+
+ _options.ApplicationMessageInterceptor?.Invoke(interceptorContext);
+ applicationMessage = interceptorContext.ApplicationMessage;
+
+ if (applicationMessage.Retain)
+ {
+ await _clientRetainedMessageManager.HandleMessageAsync(senderClientSession?.ClientId, applicationMessage).ConfigureAwait(false);
+ }
+
var eventArgs = new MqttApplicationMessageReceivedEventArgs(senderClientSession?.ClientId, applicationMessage);
ApplicationMessageReceived?.Invoke(this, eventArgs);
}
@@ -135,15 +168,20 @@ namespace MQTTnet.Core.Server
_logger.LogError(new EventId(), exception, "Error while processing application message");
}
- lock (_clientSessions)
+ lock (_sessions)
{
- foreach (var clientSession in _clientSessions.Values.ToList())
+ foreach (var clientSession in _sessions.Values.ToList())
{
clientSession.EnqueuePublishPacket(applicationMessage.ToPublishPacket());
}
}
}
+ public Task> GetRetainedMessagesAsync(MqttSubscribePacket subscribePacket)
+ {
+ return _clientRetainedMessageManager.GetSubscribedMessagesAsync(subscribePacket);
+ }
+
private MqttConnectReturnCode ValidateConnection(MqttConnectPacket connectPacket)
{
if (_options.ConnectionValidator != null)
@@ -154,17 +192,18 @@ namespace MQTTnet.Core.Server
return MqttConnectReturnCode.ConnectionAccepted;
}
- private GetOrCreateClientSessionResult GetOrCreateClientSession(MqttConnectPacket connectPacket)
+ private async Task GetOrCreateClientSessionAsync(MqttConnectPacket connectPacket)
{
- lock (_clientSessions)
+ await _sessionsSemaphore.WaitAsync().ConfigureAwait(false);
+ try
{
- var isSessionPresent = _clientSessions.TryGetValue(connectPacket.ClientId, out var clientSession);
+ var isSessionPresent = _sessions.TryGetValue(connectPacket.ClientId, out var clientSession);
if (isSessionPresent)
{
if (connectPacket.CleanSession)
{
- _clientSessions.Remove(connectPacket.ClientId);
- clientSession.Stop();
+ _sessions.Remove(connectPacket.ClientId);
+ await clientSession.StopAsync();
clientSession = null;
_logger.LogTrace("Stopped existing session of client '{0}'.", connectPacket.ClientId);
@@ -181,13 +220,17 @@ namespace MQTTnet.Core.Server
isExistingSession = false;
clientSession = _clientSesssionFactory.CreateClientSession(connectPacket.ClientId, this);
- _clientSessions[connectPacket.ClientId] = clientSession;
+ _sessions[connectPacket.ClientId] = clientSession;
_logger.LogTrace("Created a new session for client '{0}'.", connectPacket.ClientId);
}
return new GetOrCreateClientSessionResult { IsExistingSession = isExistingSession, Session = clientSession };
}
+ finally
+ {
+ _sessionsSemaphore.Release();
+ }
}
}
}
\ No newline at end of file
diff --git a/MQTTnet.Core/Server/MqttServer.cs b/MQTTnet.Core/Server/MqttServer.cs
index bd06a3a6..c671907e 100644
--- a/MQTTnet.Core/Server/MqttServer.cs
+++ b/MQTTnet.Core/Server/MqttServer.cs
@@ -20,12 +20,11 @@ namespace MQTTnet.Core.Server
private CancellationTokenSource _cancellationTokenSource;
public MqttServer(
- IOptions options,
+ IOptions options,
IEnumerable adapters,
ILogger logger,
MqttClientSessionsManager clientSessionsManager,
- IMqttClientRetainedMessageManager clientRetainedMessageManager
- )
+ IMqttClientRetainedMessageManager clientRetainedMessageManager)
{
_options = options.Value ?? throw new ArgumentNullException(nameof(options));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
@@ -35,7 +34,7 @@ namespace MQTTnet.Core.Server
if (adapters == null)
{
throw new ArgumentNullException(nameof(adapters));
- }
+ }
_adapters = adapters.ToList();
@@ -44,9 +43,9 @@ namespace MQTTnet.Core.Server
_clientSessionsManager.ClientDisconnected += OnClientDisconnected;
}
- public IList GetConnectedClients()
+ public Task> GetConnectedClientsAsync()
{
- return _clientSessionsManager.GetConnectedClients();
+ return _clientSessionsManager.GetConnectedClientsAsync();
}
public event EventHandler Started;
@@ -54,7 +53,7 @@ namespace MQTTnet.Core.Server
public event EventHandler ClientDisconnected;
public event EventHandler ApplicationMessageReceived;
- public void Publish(IEnumerable applicationMessages)
+ public async Task PublishAsync(IEnumerable applicationMessages)
{
if (applicationMessages == null) throw new ArgumentNullException(nameof(applicationMessages));
@@ -65,23 +64,10 @@ namespace MQTTnet.Core.Server
foreach (var applicationMessage in applicationMessages)
{
- var interceptorContext = new MqttApplicationMessageInterceptorContext
- {
- ApplicationMessage = applicationMessage
- };
-
- _options.ApplicationMessageInterceptor?.Invoke(interceptorContext);
-
- _clientSessionsManager.DispatchApplicationMessage(null, interceptorContext.ApplicationMessage);
+ await _clientSessionsManager.DispatchApplicationMessageAsync(null, applicationMessage);
}
}
- public Task PublishAsync(IEnumerable applicationMessages)
- {
- Publish(applicationMessages);
- return Task.FromResult(0);
- }
-
public async Task StartAsync()
{
if (_cancellationTokenSource != null) throw new InvalidOperationException("The MQTT server is already started.");
@@ -113,7 +99,7 @@ namespace MQTTnet.Core.Server
await adapter.StopAsync();
}
- _clientSessionsManager.Clear();
+ await _clientSessionsManager.StopAsync();
_logger.LogInformation("Stopped.");
}
From 5bcda12ca930038e1a10c512daedfda077c156f8 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Thu, 16 Nov 2017 14:17:58 +0100
Subject: [PATCH 053/149] Fix QoS handling in server
---
.../Server/CheckSubscriptionsResult.cs | 11 ++++++
MQTTnet.Core/Server/MqttClientSession.cs | 4 ++-
.../Server/MqttClientSubscriptionsManager.cs | 34 ++++++++++++-------
.../MqttSubscriptionsManagerTests.cs | 14 ++++----
4 files changed, 42 insertions(+), 21 deletions(-)
create mode 100644 MQTTnet.Core/Server/CheckSubscriptionsResult.cs
diff --git a/MQTTnet.Core/Server/CheckSubscriptionsResult.cs b/MQTTnet.Core/Server/CheckSubscriptionsResult.cs
new file mode 100644
index 00000000..625457ff
--- /dev/null
+++ b/MQTTnet.Core/Server/CheckSubscriptionsResult.cs
@@ -0,0 +1,11 @@
+using MQTTnet.Core.Protocol;
+
+namespace MQTTnet.Core.Server
+{
+ public class CheckSubscriptionsResult
+ {
+ public bool IsSubscribed { get; set; }
+
+ public MqttQualityOfServiceLevel QualityOfServiceLevel { get; set; }
+ }
+}
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index 42451dd0..ad1416ed 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -110,11 +110,13 @@ namespace MQTTnet.Core.Server
{
if (publishPacket == null) throw new ArgumentNullException(nameof(publishPacket));
- if (!_subscriptionsManager.IsSubscribed(publishPacket))
+ var result = _subscriptionsManager.CheckSubscriptions(publishPacket);
+ if (!result.IsSubscribed)
{
return;
}
+ publishPacket.QualityOfServiceLevel = result.QualityOfServiceLevel;
_pendingMessagesQueue.Enqueue(publishPacket);
}
diff --git a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs
index 1b0d6c4c..5af3a2de 100644
--- a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs
+++ b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs
@@ -8,7 +8,7 @@ namespace MQTTnet.Core.Server
{
public sealed class MqttClientSubscriptionsManager
{
- private readonly Dictionary _subscribedTopics = new Dictionary();
+ private readonly Dictionary _subscriptions = new Dictionary();
private readonly MqttServerOptions _options;
public MqttClientSubscriptionsManager(IOptions options)
@@ -23,7 +23,7 @@ namespace MQTTnet.Core.Server
var responsePacket = subscribePacket.CreateResponse();
var closeConnection = false;
- lock (_subscribedTopics)
+ lock (_subscriptions)
{
foreach (var topicFilter in subscribePacket.TopicFilters)
{
@@ -38,7 +38,7 @@ namespace MQTTnet.Core.Server
if (interceptorContext.AcceptSubscription)
{
- _subscribedTopics[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
+ _subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
}
}
}
@@ -54,40 +54,48 @@ namespace MQTTnet.Core.Server
{
if (unsubscribePacket == null) throw new ArgumentNullException(nameof(unsubscribePacket));
- lock (_subscribedTopics)
+ lock (_subscriptions)
{
foreach (var topicFilter in unsubscribePacket.TopicFilters)
{
- _subscribedTopics.Remove(topicFilter);
+ _subscriptions.Remove(topicFilter);
}
}
return unsubscribePacket.CreateResponse();
}
- public bool IsSubscribed(MqttPublishPacket publishPacket)
+ public CheckSubscriptionsResult CheckSubscriptions(MqttPublishPacket publishPacket)
{
if (publishPacket == null) throw new ArgumentNullException(nameof(publishPacket));
- lock (_subscribedTopics)
+ lock (_subscriptions)
{
- foreach (var subscribedTopic in _subscribedTopics)
+ foreach (var subscription in _subscriptions)
{
- if (publishPacket.QualityOfServiceLevel > subscribedTopic.Value)
+ if (!MqttTopicFilterComparer.IsMatch(publishPacket.Topic, subscription.Key))
{
continue;
}
- if (!MqttTopicFilterComparer.IsMatch(publishPacket.Topic, subscribedTopic.Key))
+ var effectiveQos = subscription.Value;
+ if (publishPacket.QualityOfServiceLevel < effectiveQos)
{
- continue;
+ effectiveQos = publishPacket.QualityOfServiceLevel;
}
- return true;
+ return new CheckSubscriptionsResult
+ {
+ IsSubscribed = true,
+ QualityOfServiceLevel = effectiveQos
+ };
}
}
- return false;
+ return new CheckSubscriptionsResult
+ {
+ IsSubscribed = false
+ };
}
}
}
diff --git a/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs b/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs
index d46354c7..44bad993 100644
--- a/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs
+++ b/Tests/MQTTnet.Core.Tests/MqttSubscriptionsManagerTests.cs
@@ -15,7 +15,7 @@ namespace MQTTnet.Core.Tests
var sm = new MqttClientSubscriptionsManager(new OptionsWrapper(new MqttServerOptions()));
var sp = new MqttSubscribePacket();
- sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce));
+ sp.TopicFilters.Add(new TopicFilter("A/B/C"));
sm.Subscribe(sp, "");
@@ -25,7 +25,7 @@ namespace MQTTnet.Core.Tests
QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
};
- Assert.IsTrue(sm.IsSubscribed(pp));
+ Assert.IsTrue(sm.CheckSubscriptions(pp).IsSubscribed);
}
[TestMethod]
@@ -34,7 +34,7 @@ namespace MQTTnet.Core.Tests
var sm = new MqttClientSubscriptionsManager(new OptionsWrapper(new MqttServerOptions()));
var sp = new MqttSubscribePacket();
- sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce));
+ sp.TopicFilters.Add(new TopicFilter("A/B/C"));
sm.Subscribe(sp, "");
@@ -44,7 +44,7 @@ namespace MQTTnet.Core.Tests
QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
};
- Assert.IsFalse(sm.IsSubscribed(pp));
+ Assert.IsFalse(sm.CheckSubscriptions(pp).IsSubscribed);
}
[TestMethod]
@@ -53,7 +53,7 @@ namespace MQTTnet.Core.Tests
var sm = new MqttClientSubscriptionsManager(new OptionsWrapper(new MqttServerOptions()));
var sp = new MqttSubscribePacket();
- sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce));
+ sp.TopicFilters.Add(new TopicFilter("A/B/C"));
sm.Subscribe(sp, "");
@@ -63,13 +63,13 @@ namespace MQTTnet.Core.Tests
QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
};
- Assert.IsTrue(sm.IsSubscribed(pp));
+ Assert.IsTrue(sm.CheckSubscriptions(pp).IsSubscribed);
var up = new MqttUnsubscribePacket();
up.TopicFilters.Add("A/B/C");
sm.Unsubscribe(up);
- Assert.IsFalse(sm.IsSubscribed(pp));
+ Assert.IsFalse(sm.CheckSubscriptions(pp).IsSubscribed);
}
}
}
From acc269e702d148a33bdb40329fb7fbdaa0d72b59 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Fri, 17 Nov 2017 21:13:01 +0100
Subject: [PATCH 054/149] Fixed WebSocket client stream
---
Build/MQTTnet.nuspec | 4 +-
.../MqttWebSocketServerAdapter.cs | 46 -------
.../MqttWebSocketServerChannel.cs | 60 +++++++++
.../Implementations/MqttWebSocketChannel.cs | 6 +-
.../Implementations/WebSocketStream.cs | 97 ++++++++++----
Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 2 +-
MQTTnet.Core/Client/MqttClient.cs | 124 ++++++++++--------
MQTTnet.Core/Packets/MqttPublishPacket.cs | 5 +-
MQTTnet.Core/Serializer/MqttPacketReader.cs | 2 +-
.../MainPage.xaml | 1 +
.../MainPage.xaml.cs | 22 ++--
11 files changed, 225 insertions(+), 144 deletions(-)
create mode 100644 Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerChannel.cs
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index c1cd3718..6b111fc0 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -10,9 +10,11 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).
- * [Core] Fixed library reference issues for .NET 4.6 (Thanks to @JanEggers).
+ * [Core] Fixed library reference issues for .NET 4.6 and netstandard 2.0 (Thanks to @JanEggers).
* [Core] Several COM exceptions are now wrapped properly resulting in less warnings in the trace.
+* [Core] Removed application message payload from trace to reduce trace size and increase performance.
* [Client] Fixed WebSocket sub protocol negotiation for ASP.NET Core 2 servers (Thanks to @JanEggers).
+* [Client] Fixed broken connection after 30 seconds then using WebSocket protocol (Thanks to @ChristianRiedl).
* [Server] Client connections are now closed when the server is stopped (Thanks to @zhudanfei).
* [Server] Published messages from the server are now retained (if set) (Thanks to @ChristianRiedl). BREAKING CHANGE!
diff --git a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
index 45bf5457..0e3a3d5f 100644
--- a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
+++ b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
@@ -1,12 +1,8 @@
using System;
-using System.IO;
using System.Net.WebSockets;
-using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
-using MQTTnet.Core.Channel;
using MQTTnet.Core.Server;
-using MQTTnet.Implementations;
namespace MQTTnet.AspNetCore
{
@@ -47,47 +43,5 @@ namespace MQTTnet.AspNetCore
{
StopAsync();
}
-
- private class MqttWebSocketServerChannel : IMqttCommunicationChannel, IDisposable
- {
- private readonly WebSocket _webSocket;
-
- public MqttWebSocketServerChannel(WebSocket webSocket)
- {
- _webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket));
-
- RawReceiveStream = new WebSocketStream(_webSocket);
- }
-
- public Stream SendStream => RawReceiveStream;
- public Stream ReceiveStream => RawReceiveStream;
- public Stream RawReceiveStream { get; }
-
- public Task ConnectAsync()
- {
- return Task.CompletedTask;
- }
-
- public Task DisconnectAsync()
- {
- RawReceiveStream?.Dispose();
-
- if (_webSocket == null)
- {
- return Task.CompletedTask;
- }
-
- return _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
- }
-
- public void Dispose()
- {
- RawReceiveStream?.Dispose();
- SendStream?.Dispose();
- ReceiveStream?.Dispose();
-
- _webSocket?.Dispose();
- }
- }
}
}
\ No newline at end of file
diff --git a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerChannel.cs b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerChannel.cs
new file mode 100644
index 00000000..54cfb0b9
--- /dev/null
+++ b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerChannel.cs
@@ -0,0 +1,60 @@
+using System;
+using System.IO;
+using System.Net.WebSockets;
+using System.Threading;
+using System.Threading.Tasks;
+using MQTTnet.Core.Channel;
+using MQTTnet.Implementations;
+
+namespace MQTTnet.AspNetCore
+{
+ public class MqttWebSocketServerChannel : IMqttCommunicationChannel, IDisposable
+ {
+ private WebSocket _webSocket;
+
+ public MqttWebSocketServerChannel(WebSocket webSocket)
+ {
+ _webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket));
+
+ SendStream = new WebSocketStream(_webSocket);
+ ReceiveStream = SendStream;
+ }
+
+ public Stream SendStream { get; private set; }
+ public Stream ReceiveStream { get; private set; }
+
+ public Task ConnectAsync()
+ {
+ return Task.CompletedTask;
+ }
+
+ public async Task DisconnectAsync()
+ {
+ if (_webSocket == null)
+ {
+ return;
+ }
+
+ try
+ {
+ await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
+ }
+ finally
+ {
+ Dispose();
+ }
+ }
+
+ public void Dispose()
+ {
+ SendStream?.Dispose();
+ ReceiveStream?.Dispose();
+
+ _webSocket?.Dispose();
+
+ SendStream = null;
+ ReceiveStream = null;
+ _webSocket = null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
index c7cd3d02..8f56c945 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
@@ -11,6 +11,10 @@ namespace MQTTnet.Implementations
{
public sealed class MqttWebSocketChannel : IMqttCommunicationChannel, IDisposable
{
+ // ReSharper disable once MemberCanBePrivate.Global
+ // ReSharper disable once AutoPropertyCanBeMadeGetOnly.Global
+ public static int BufferSize { get; set; } = 4096 * 20; // Can be changed for fine tuning by library user.
+
private readonly MqttClientWebSocketOptions _options;
private ClientWebSocket _webSocket;
@@ -80,7 +84,7 @@ namespace MQTTnet.Implementations
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).ConfigureAwait(false);
}
- _webSocket = null;
+ Dispose();
}
public void Dispose()
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/WebSocketStream.cs b/Frameworks/MQTTnet.NetStandard/Implementations/WebSocketStream.cs
index fb2d8121..4ff11dad 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/WebSocketStream.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/WebSocketStream.cs
@@ -1,5 +1,7 @@
using System;
+using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
@@ -10,7 +12,9 @@ namespace MQTTnet.Implementations
public class WebSocketStream : Stream
{
private readonly WebSocket _webSocket;
-
+ private readonly byte[] _chunkBuffer = new byte[MqttWebSocketChannel.BufferSize];
+ private readonly Queue _buffer = new Queue(MqttWebSocketChannel.BufferSize);
+
public WebSocketStream(WebSocket webSocket)
{
_webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket));
@@ -34,33 +38,9 @@ namespace MQTTnet.Implementations
{
}
- public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ public override Task FlushAsync(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);
+ return Task.FromResult(0);
}
public override int Read(byte[] buffer, int offset, int count)
@@ -68,11 +48,58 @@ namespace MQTTnet.Implementations
return ReadAsync(buffer, offset, count).GetAwaiter().GetResult();
}
+ public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ {
+ var bytesRead = 0;
+
+ // Use existing date from buffer.
+ while (count > 0 && _buffer.Any())
+ {
+ buffer[offset++] = _buffer.Dequeue();
+ count--;
+ bytesRead++;
+ }
+
+ if (count == 0)
+ {
+ return bytesRead;
+ }
+
+ while (_webSocket.State == WebSocketState.Open)
+ {
+ await FetchChunkAsync(cancellationToken);
+
+ while (count > 0 && _buffer.Any())
+ {
+ buffer[offset++] = _buffer.Dequeue();
+ count--;
+ bytesRead++;
+ }
+
+ if (count == 0)
+ {
+ return bytesRead;
+ }
+ }
+
+ if (_webSocket.State == WebSocketState.Closed)
+ {
+ throw new MqttCommunicationException("WebSocket connection closed.");
+ }
+
+ return bytesRead;
+ }
+
public override void Write(byte[] buffer, int offset, int count)
{
WriteAsync(buffer, offset, count).GetAwaiter().GetResult();
}
+ 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 long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
@@ -82,5 +109,21 @@ namespace MQTTnet.Implementations
{
throw new NotSupportedException();
}
+
+ private async Task FetchChunkAsync(CancellationToken cancellationToken)
+ {
+ var response = await _webSocket.ReceiveAsync(new ArraySegment(_chunkBuffer, 0, _chunkBuffer.Length), cancellationToken).ConfigureAwait(false);
+
+ for (var i = 0; i < response.Count; i++)
+ {
+ var @byte = _chunkBuffer[i];
+ _buffer.Enqueue(@byte);
+ }
+
+ if (response.MessageType == WebSocketMessageType.Close)
+ {
+ await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken).ConfigureAwait(false);
+ }
+ }
}
}
diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
index c8b7968e..6037929e 100644
--- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
+++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
@@ -23,7 +23,7 @@ namespace MQTTnet
public MqttFactory(IServiceProvider serviceProvider)
{
- _serviceProvider = serviceProvider;
+ _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
}
public ILoggerFactory GetLoggerFactory()
diff --git a/MQTTnet.Core/Client/MqttClient.cs b/MQTTnet.Core/Client/MqttClient.cs
index 202cbc58..fcab3fba 100644
--- a/MQTTnet.Core/Client/MqttClient.cs
+++ b/MQTTnet.Core/Client/MqttClient.cs
@@ -60,14 +60,14 @@ namespace MQTTnet.Core.Client
await _adapter.ConnectAsync(_options.CommunicationTimeout).ConfigureAwait(false);
_logger.LogTrace("Connection with server established.");
- await SetupIncomingPacketProcessingAsync().ConfigureAwait(false);
+ await StartReceivingPacketsAsync(_cancellationTokenSource.Token).ConfigureAwait(false);
var connectResponse = await AuthenticateAsync(options.WillMessage).ConfigureAwait(false);
_logger.LogTrace("MQTT connection with server established.");
if (_options.KeepAlivePeriod != TimeSpan.Zero)
{
- StartSendKeepAliveMessages(_cancellationTokenSource.Token);
+ StartSendingKeepAliveMessages(_cancellationTokenSource.Token);
}
IsConnected = true;
@@ -96,7 +96,6 @@ namespace MQTTnet.Core.Client
finally
{
await DisconnectInternalAsync().ConfigureAwait(false);
- _scopeHandle.Dispose();
}
}
@@ -149,36 +148,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).ConfigureAwait(false);
- break;
- }
+ {
+ // No packet identifier is used for QoS 0 [3.3.2.2 Packet Identifier]
+ await _adapter.SendPacketsAsync(_options.CommunicationTimeout, _cancellationTokenSource.Token, qosPackets).ConfigureAwait(false);
+ break;
+ }
case MqttQualityOfServiceLevel.AtLeastOnce:
- {
- foreach (var publishPacket in qosPackets)
{
- publishPacket.PacketIdentifier = GetNewPacketIdentifier();
- await SendAndReceiveAsync(publishPacket).ConfigureAwait(false);
- }
+ foreach (var publishPacket in qosPackets)
+ {
+ publishPacket.PacketIdentifier = GetNewPacketIdentifier();
+ await SendAndReceiveAsync(publishPacket).ConfigureAwait(false);
+ }
- break;
- }
+ break;
+ }
case MqttQualityOfServiceLevel.ExactlyOnce:
- {
- foreach (var publishPacket in qosPackets)
{
- publishPacket.PacketIdentifier = GetNewPacketIdentifier();
- var pubRecPacket = await SendAndReceiveAsync(publishPacket).ConfigureAwait(false);
- await SendAndReceiveAsync(pubRecPacket.CreateResponse()).ConfigureAwait(false);
- }
+ foreach (var publishPacket in qosPackets)
+ {
+ 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 +190,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
};
@@ -204,24 +203,6 @@ namespace MQTTnet.Core.Client
return response;
}
- private async Task SetupIncomingPacketProcessingAsync()
- {
- _isReceivingPackets = false;
-
-#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
- Task.Factory.StartNew(
- () => ReceivePackets(_cancellationTokenSource.Token),
- _cancellationTokenSource.Token,
- 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
-
- while (!_isReceivingPackets && _cancellationTokenSource != null && !_cancellationTokenSource.IsCancellationRequested)
- {
- await Task.Delay(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false);
- }
- }
-
private void ThrowIfNotConnected()
{
if (!IsConnected) throw new MqttCommunicationException("The client is not connected.");
@@ -234,6 +215,8 @@ namespace MQTTnet.Core.Client
private async Task DisconnectInternalAsync()
{
+ _scopeHandle?.Dispose();
+
var clientWasConnected = IsConnected;
IsConnected = false;
@@ -258,6 +241,7 @@ namespace MQTTnet.Core.Client
}
finally
{
+ _logger.LogInformation("Disconnected.");
Disconnected?.Invoke(this, new MqttClientDisconnectedEventArgs(clientWasConnected));
}
}
@@ -324,7 +308,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 +321,7 @@ namespace MQTTnet.Core.Client
}
FireApplicationMessageReceivedEvent(publishPacket);
- await SendAsync(new MqttPubRecPacket {PacketIdentifier = publishPacket.PacketIdentifier});
+ await SendAsync(new MqttPubRecPacket { PacketIdentifier = publishPacket.PacketIdentifier });
return;
}
@@ -363,12 +347,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)
@@ -390,6 +374,12 @@ namespace MQTTnet.Core.Client
}
catch (OperationCanceledException)
{
+ if (cancellationToken.IsCancellationRequested)
+ {
+ return;
+ }
+
+ await DisconnectInternalAsync().ConfigureAwait(false);
}
catch (MqttCommunicationException exception)
{
@@ -412,7 +402,7 @@ namespace MQTTnet.Core.Client
}
}
- private async Task ReceivePackets(CancellationToken cancellationToken)
+ private async Task ReceivePacketsAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Start receiving packets.");
@@ -423,6 +413,7 @@ namespace MQTTnet.Core.Client
_isReceivingPackets = true;
var packet = await _adapter.ReceivePacketAsync(TimeSpan.Zero, cancellationToken).ConfigureAwait(false);
+
if (cancellationToken.IsCancellationRequested)
{
return;
@@ -433,6 +424,12 @@ namespace MQTTnet.Core.Client
}
catch (OperationCanceledException)
{
+ if (cancellationToken.IsCancellationRequested)
+ {
+ return;
+ }
+
+ await DisconnectInternalAsync().ConfigureAwait(false);
}
catch (MqttCommunicationException exception)
{
@@ -458,15 +455,34 @@ namespace MQTTnet.Core.Client
private void StartProcessReceivedPacket(MqttBasePacket packet, CancellationToken cancellationToken)
{
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
- Task.Run(() => ProcessReceivedPacketAsync(packet), cancellationToken).ConfigureAwait(false);
+ Task.Run(
+ () => ProcessReceivedPacketAsync(packet),
+ cancellationToken).ConfigureAwait(false);
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
}
- private void StartSendKeepAliveMessages(CancellationToken cancellationToken)
+ private async Task StartReceivingPacketsAsync(CancellationToken cancellationToken)
+ {
+ _isReceivingPackets = false;
+
+#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
+ Task.Run(
+ async () => await ReceivePacketsAsync(cancellationToken),
+ cancellationToken).ConfigureAwait(false);
+#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
+
+ while (!_isReceivingPackets && !cancellationToken.IsCancellationRequested)
+ {
+ await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken).ConfigureAwait(false);
+ }
+ }
+
+ private void StartSendingKeepAliveMessages(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.Run(
+ async () => await SendKeepAliveMessagesAsync(cancellationToken),
+ cancellationToken).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/Packets/MqttPublishPacket.cs b/MQTTnet.Core/Packets/MqttPublishPacket.cs
index 447aaed7..b7d10d11 100644
--- a/MQTTnet.Core/Packets/MqttPublishPacket.cs
+++ b/MQTTnet.Core/Packets/MqttPublishPacket.cs
@@ -1,5 +1,4 @@
-using System;
-using MQTTnet.Core.Protocol;
+using MQTTnet.Core.Protocol;
namespace MQTTnet.Core.Packets
{
@@ -19,7 +18,7 @@ namespace MQTTnet.Core.Packets
{
return nameof(MqttPublishPacket) +
": [Topic=" + Topic + "]" +
- " [Payload=" + Convert.ToBase64String(Payload) + "]" +
+ " [PayloadLength=" + Payload?.Length + "]" +
" [QoSLevel=" + QualityOfServiceLevel + "]" +
" [Dup=" + Dup + "]" +
" [Retain=" + Retain + "]" +
diff --git a/MQTTnet.Core/Serializer/MqttPacketReader.cs b/MQTTnet.Core/Serializer/MqttPacketReader.cs
index 97b6478c..9fcae9e5 100644
--- a/MQTTnet.Core/Serializer/MqttPacketReader.cs
+++ b/MQTTnet.Core/Serializer/MqttPacketReader.cs
@@ -91,7 +91,7 @@ namespace MQTTnet.Core.Serializer
if (buffer == -1)
{
- break;
+ throw new MqttCommunicationException("Connection closed while reading remaining length data.");
}
encodedByte = (byte)buffer;
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
index 4fdbd2e6..43b26c7a 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml
@@ -78,6 +78,7 @@
Received messages:
+ Add received messages to list
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
index 6ae711be..5e1a1261 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
@@ -30,14 +30,14 @@ namespace MQTTnet.TestApp.UniversalWindows
private async void OnTraceMessagePublished(object sender, MqttNetTraceMessagePublishedEventArgs e)
{
- await Trace.Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
+ var text = $"[{e.TraceMessage.Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{e.TraceMessage.Level}] [{e.TraceMessage.Source}] [{e.TraceMessage.ThreadId}] [{e.TraceMessage.Message}]{Environment.NewLine}";
+ if (e.TraceMessage.Exception != null)
+ {
+ text += $"{e.TraceMessage.Exception}{Environment.NewLine}";
+ }
+
+ await Trace.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
{
- var text = $"[{e.TraceMessage.Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{e.TraceMessage.Level}] [{e.TraceMessage.Source}] [{e.TraceMessage.ThreadId}] [{e.TraceMessage.Message}]{Environment.NewLine}";
- if (e.TraceMessage.Exception != null)
- {
- text += $"{e.TraceMessage.Exception}{Environment.NewLine}";
- }
-
Trace.Text += text;
});
}
@@ -109,11 +109,13 @@ namespace MQTTnet.TestApp.UniversalWindows
{
var item = $"Timestamp: {DateTime.Now:O} | Topic: {eventArgs.ApplicationMessage.Topic} | Payload: {Encoding.UTF8.GetString(eventArgs.ApplicationMessage.Payload)} | QoS: {eventArgs.ApplicationMessage.QualityOfServiceLevel}";
- await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
+ await Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
{
- ReceivedMessages.Items.Add(item);
+ if (AddReceivedMessagesToList.IsChecked == true)
+ {
+ ReceivedMessages.Items.Add(item);
+ }
});
-
}
private async void Publish(object sender, RoutedEventArgs e)
From f8078a68941236b15e3dc6b09ba08a448e5cc6d0 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Fri, 17 Nov 2017 21:26:43 +0100
Subject: [PATCH 055/149] Update version info
---
Build/MQTTnet.nuspec | 2 +-
Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj | 2 ++
Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj | 4 ++--
MQTTnet.Core/MQTTnet.Core.csproj | 4 ++--
4 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 6b111fc0..cd218576 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -2,7 +2,7 @@
MQTTnet
- 2.5.1.1
+ 2.5.2-rc1
Christian Kratky
Christian Kratky
https://github.com/chkr1011/MQTTnet/blob/master/LICENSE
diff --git a/Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj b/Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj
index 5142cc15..5556b11c 100644
--- a/Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj
+++ b/Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj
@@ -2,6 +2,8 @@
netstandard2.0
+ 2.5.2.0
+ 2.5.2.0
diff --git a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
index 41c30d39..6349d3ea 100644
--- a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
+++ b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
@@ -4,8 +4,8 @@
netstandard1.3;netstandard2.0;net452;net461;uap10.0
MQTTnet
MQTTnet
- 2.5.0.0
- 2.5.0.0
+ 2.5.2.0
+ 2.5.2.0
0.0.0.0
diff --git a/MQTTnet.Core/MQTTnet.Core.csproj b/MQTTnet.Core/MQTTnet.Core.csproj
index 522b3fb8..d50466f1 100644
--- a/MQTTnet.Core/MQTTnet.Core.csproj
+++ b/MQTTnet.Core/MQTTnet.Core.csproj
@@ -17,8 +17,8 @@
- 2.5.0.0
- 2.5.0.0
+ 2.5.2.0
+ 2.5.2.0
From 8411382c42768be59728a942d0880ae739d2e437 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Fri, 17 Nov 2017 21:29:37 +0100
Subject: [PATCH 056/149] Update build script
---
Build/build.ps1 | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/Build/build.ps1 b/Build/build.ps1
index 1e47727c..09eabf25 100644
--- a/Build/build.ps1
+++ b/Build/build.ps1
@@ -1,4 +1,4 @@
-param([string]$version)
+param([string]$assemblyVersion, [string]$nugetVersion)
if ([string]::IsNullOrEmpty($version)) {$version = "0.0.1"}
@@ -8,17 +8,16 @@ $path = &$vswhere -latest -products * -requires Microsoft.Component.MSBuild -pro
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="net452" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m
- &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net461" /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="netstandard2.0" /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
+ &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net452" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m
+ &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net461" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m
+ &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard1.3" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m
+ &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m
+ &$msbuild ..\Frameworks\MQTTnet.Netstandard\MQTTnet.Netstandard.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="uap10.0" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m
- &$msbuild ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$version /p:AssemblyVersion=$version /verbosity:m
+ &$msbuild ..\Frameworks\MQTTnet.AspNetCore\MQTTnet.AspNetCore.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m
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
-}
-
+ .\NuGet.exe pack MQTTnet.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $nugetVersion
+ .\NuGet.exe pack MQTTnet.AspNetCore.nuspec -Verbosity detailed -Symbols -OutputDir "NuGet" -Version $nugetVersion
+}
\ No newline at end of file
From e0235aedff1614927491342ca5fee96f80bc3b02 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Tue, 21 Nov 2017 20:55:57 +0100
Subject: [PATCH 057/149] Refactor trace messages
---
Build/MQTTnet.nuspec | 10 +--
.../MqttChannelCommunicationAdapter.cs | 4 +
MQTTnet.Core/Packets/MqttConnAckPacket.cs | 2 +-
MQTTnet.Core/Packets/MqttConnectPacket.cs | 2 +-
MQTTnet.Core/Packets/MqttDisconnectPacket.cs | 4 +
MQTTnet.Core/Packets/MqttPingReqPacket.cs | 2 +-
MQTTnet.Core/Packets/MqttPingRespPacket.cs | 2 +-
MQTTnet.Core/Packets/MqttPubAckPacket.cs | 4 +
MQTTnet.Core/Packets/MqttPubCompPacket.cs | 4 +
MQTTnet.Core/Packets/MqttPubRecPacket.cs | 4 +
MQTTnet.Core/Packets/MqttPubRelPacket.cs | 4 +
MQTTnet.Core/Packets/MqttPublishPacket.cs | 5 +-
MQTTnet.Core/Packets/MqttSubAckPacket.cs | 2 +-
MQTTnet.Core/Packets/MqttSubscribePacket.cs | 2 +-
MQTTnet.Core/Packets/MqttUnsubAckPacket.cs | 5 ++
MQTTnet.Core/Packets/MqttUnsubscribe.cs | 6 ++
.../MqttClientRetainedMessagesManager.cs | 77 ++++++++++---------
.../MainPage.xaml.cs | 30 ++++++--
18 files changed, 111 insertions(+), 58 deletions(-)
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index cd218576..faccaefb 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -2,7 +2,7 @@
MQTTnet
- 2.5.2-rc1
+ 2.5.2
Christian Kratky
Christian Kratky
https://github.com/chkr1011/MQTTnet/blob/master/LICENSE
@@ -10,13 +10,7 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).
- * [Core] Fixed library reference issues for .NET 4.6 and netstandard 2.0 (Thanks to @JanEggers).
-* [Core] Several COM exceptions are now wrapped properly resulting in less warnings in the trace.
-* [Core] Removed application message payload from trace to reduce trace size and increase performance.
-* [Client] Fixed WebSocket sub protocol negotiation for ASP.NET Core 2 servers (Thanks to @JanEggers).
-* [Client] Fixed broken connection after 30 seconds then using WebSocket protocol (Thanks to @ChristianRiedl).
-* [Server] Client connections are now closed when the server is stopped (Thanks to @zhudanfei).
-* [Server] Published messages from the server are now retained (if set) (Thanks to @ChristianRiedl). BREAKING CHANGE!
+ * [Core] Refactored trace messages.
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 Xamarin
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
index c859ec0d..5b0038d1 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
@@ -32,11 +32,15 @@ namespace MQTTnet.Core.Adapter
public async Task ConnectAsync(TimeSpan timeout)
{
+ _logger.LogInformation("Connecting [Timeout={0}]", timeout);
+
await ExecuteAndWrapExceptionAsync(() => _channel.ConnectAsync().TimeoutAfter(timeout));
}
public async Task DisconnectAsync(TimeSpan timeout)
{
+ _logger.LogInformation("Disconnecting [Timeout={0}]", timeout);
+
await ExecuteAndWrapExceptionAsync(() => _channel.DisconnectAsync().TimeoutAfter(timeout));
}
diff --git a/MQTTnet.Core/Packets/MqttConnAckPacket.cs b/MQTTnet.Core/Packets/MqttConnAckPacket.cs
index e80a0af5..0410e669 100644
--- a/MQTTnet.Core/Packets/MqttConnAckPacket.cs
+++ b/MQTTnet.Core/Packets/MqttConnAckPacket.cs
@@ -10,7 +10,7 @@ namespace MQTTnet.Core.Packets
public override string ToString()
{
- return nameof(MqttConnAckPacket) + ": [ConnectReturnCode=" + ConnectReturnCode + "] [IsSessionPresent=" + IsSessionPresent + "]";
+ return "ConnAck: [ConnectReturnCode=" + ConnectReturnCode + "] [IsSessionPresent=" + IsSessionPresent + "]";
}
}
}
diff --git a/MQTTnet.Core/Packets/MqttConnectPacket.cs b/MQTTnet.Core/Packets/MqttConnectPacket.cs
index b1d6e3b9..48817120 100644
--- a/MQTTnet.Core/Packets/MqttConnectPacket.cs
+++ b/MQTTnet.Core/Packets/MqttConnectPacket.cs
@@ -20,7 +20,7 @@ namespace MQTTnet.Core.Packets
public override string ToString()
{
- return nameof(MqttConnectPacket) + ": [ClientId=" + ClientId + "] [Username=" + Username + "] [Password=" + Password + "] [KeepAlivePeriod=" + KeepAlivePeriod + "] [CleanSession=" + CleanSession + "]";
+ return "Connect: [ClientId=" + ClientId + "] [Username=" + Username + "] [Password=" + Password + "] [KeepAlivePeriod=" + KeepAlivePeriod + "] [CleanSession=" + CleanSession + "]";
}
}
}
diff --git a/MQTTnet.Core/Packets/MqttDisconnectPacket.cs b/MQTTnet.Core/Packets/MqttDisconnectPacket.cs
index 5be8407f..4db7f795 100644
--- a/MQTTnet.Core/Packets/MqttDisconnectPacket.cs
+++ b/MQTTnet.Core/Packets/MqttDisconnectPacket.cs
@@ -2,5 +2,9 @@
{
public sealed class MqttDisconnectPacket : MqttBasePacket
{
+ public override string ToString()
+ {
+ return "Disconnect";
+ }
}
}
diff --git a/MQTTnet.Core/Packets/MqttPingReqPacket.cs b/MQTTnet.Core/Packets/MqttPingReqPacket.cs
index 3df1c3ae..9836b5aa 100644
--- a/MQTTnet.Core/Packets/MqttPingReqPacket.cs
+++ b/MQTTnet.Core/Packets/MqttPingReqPacket.cs
@@ -4,7 +4,7 @@
{
public override string ToString()
{
- return nameof(MqttPingReqPacket);
+ return "PingReq";
}
}
}
diff --git a/MQTTnet.Core/Packets/MqttPingRespPacket.cs b/MQTTnet.Core/Packets/MqttPingRespPacket.cs
index 753a357d..eff12b83 100644
--- a/MQTTnet.Core/Packets/MqttPingRespPacket.cs
+++ b/MQTTnet.Core/Packets/MqttPingRespPacket.cs
@@ -4,7 +4,7 @@
{
public override string ToString()
{
- return nameof(MqttPingRespPacket);
+ return "PingResp";
}
}
}
diff --git a/MQTTnet.Core/Packets/MqttPubAckPacket.cs b/MQTTnet.Core/Packets/MqttPubAckPacket.cs
index b3e5d3e3..9e07cd32 100644
--- a/MQTTnet.Core/Packets/MqttPubAckPacket.cs
+++ b/MQTTnet.Core/Packets/MqttPubAckPacket.cs
@@ -2,5 +2,9 @@
{
public sealed class MqttPubAckPacket : MqttBasePublishPacket
{
+ public override string ToString()
+ {
+ return "PubAck";
+ }
}
}
diff --git a/MQTTnet.Core/Packets/MqttPubCompPacket.cs b/MQTTnet.Core/Packets/MqttPubCompPacket.cs
index cb6b485f..9b819fd0 100644
--- a/MQTTnet.Core/Packets/MqttPubCompPacket.cs
+++ b/MQTTnet.Core/Packets/MqttPubCompPacket.cs
@@ -2,5 +2,9 @@
{
public sealed class MqttPubCompPacket : MqttBasePublishPacket
{
+ public override string ToString()
+ {
+ return "PubComp";
+ }
}
}
diff --git a/MQTTnet.Core/Packets/MqttPubRecPacket.cs b/MQTTnet.Core/Packets/MqttPubRecPacket.cs
index a8ed3337..3b876559 100644
--- a/MQTTnet.Core/Packets/MqttPubRecPacket.cs
+++ b/MQTTnet.Core/Packets/MqttPubRecPacket.cs
@@ -2,5 +2,9 @@
{
public sealed class MqttPubRecPacket : MqttBasePublishPacket
{
+ public override string ToString()
+ {
+ return "PubRec";
+ }
}
}
diff --git a/MQTTnet.Core/Packets/MqttPubRelPacket.cs b/MQTTnet.Core/Packets/MqttPubRelPacket.cs
index c95d16bf..9d926894 100644
--- a/MQTTnet.Core/Packets/MqttPubRelPacket.cs
+++ b/MQTTnet.Core/Packets/MqttPubRelPacket.cs
@@ -2,5 +2,9 @@
{
public sealed class MqttPubRelPacket : MqttBasePublishPacket
{
+ public override string ToString()
+ {
+ return "PubRel";
+ }
}
}
diff --git a/MQTTnet.Core/Packets/MqttPublishPacket.cs b/MQTTnet.Core/Packets/MqttPublishPacket.cs
index b7d10d11..573ff691 100644
--- a/MQTTnet.Core/Packets/MqttPublishPacket.cs
+++ b/MQTTnet.Core/Packets/MqttPublishPacket.cs
@@ -16,9 +16,8 @@ namespace MQTTnet.Core.Packets
public override string ToString()
{
- return nameof(MqttPublishPacket) +
- ": [Topic=" + Topic + "]" +
- " [PayloadLength=" + Payload?.Length + "]" +
+ return "Publish: [Topic=" + Topic + "]" +
+ " [Payload.Length=" + Payload?.Length + "]" +
" [QoSLevel=" + QualityOfServiceLevel + "]" +
" [Dup=" + Dup + "]" +
" [Retain=" + Retain + "]" +
diff --git a/MQTTnet.Core/Packets/MqttSubAckPacket.cs b/MQTTnet.Core/Packets/MqttSubAckPacket.cs
index 5882d4c8..05431a3f 100644
--- a/MQTTnet.Core/Packets/MqttSubAckPacket.cs
+++ b/MQTTnet.Core/Packets/MqttSubAckPacket.cs
@@ -13,7 +13,7 @@ namespace MQTTnet.Core.Packets
public override string ToString()
{
var subscribeReturnCodesText = string.Join(",", SubscribeReturnCodes.Select(f => f.ToString()));
- return nameof(MqttSubAckPacket) + ": [PacketIdentifier=" + PacketIdentifier + "] [SubscribeReturnCodes=" + subscribeReturnCodesText + "]";
+ return "SubAck: [PacketIdentifier=" + PacketIdentifier + "] [SubscribeReturnCodes=" + subscribeReturnCodesText + "]";
}
}
}
diff --git a/MQTTnet.Core/Packets/MqttSubscribePacket.cs b/MQTTnet.Core/Packets/MqttSubscribePacket.cs
index 5cf1c260..c911efcc 100644
--- a/MQTTnet.Core/Packets/MqttSubscribePacket.cs
+++ b/MQTTnet.Core/Packets/MqttSubscribePacket.cs
@@ -12,7 +12,7 @@ namespace MQTTnet.Core.Packets
public override string ToString()
{
var topicFiltersText = string.Join(",", TopicFilters.Select(f => f.Topic + "@" + f.QualityOfServiceLevel));
- return nameof(MqttSubscribePacket) + ": [PacketIdentifier=" + PacketIdentifier + "] [TopicFilters=" + topicFiltersText + "]";
+ return "Subscribe: [PacketIdentifier=" + PacketIdentifier + "] [TopicFilters=" + topicFiltersText + "]";
}
}
}
diff --git a/MQTTnet.Core/Packets/MqttUnsubAckPacket.cs b/MQTTnet.Core/Packets/MqttUnsubAckPacket.cs
index 57a5a7dd..3554fa95 100644
--- a/MQTTnet.Core/Packets/MqttUnsubAckPacket.cs
+++ b/MQTTnet.Core/Packets/MqttUnsubAckPacket.cs
@@ -3,5 +3,10 @@
public sealed class MqttUnsubAckPacket : MqttBasePacket, IMqttPacketWithIdentifier
{
public ushort PacketIdentifier { get; set; }
+
+ public override string ToString()
+ {
+ return "UnsubAck: [PacketIdentifier=" + PacketIdentifier + "]";
+ }
}
}
diff --git a/MQTTnet.Core/Packets/MqttUnsubscribe.cs b/MQTTnet.Core/Packets/MqttUnsubscribe.cs
index 269bfcbb..1e06e50e 100644
--- a/MQTTnet.Core/Packets/MqttUnsubscribe.cs
+++ b/MQTTnet.Core/Packets/MqttUnsubscribe.cs
@@ -7,5 +7,11 @@ namespace MQTTnet.Core.Packets
public ushort PacketIdentifier { get; set; }
public IList TopicFilters { get; set; } = new List();
+
+ public override string ToString()
+ {
+ var topicFiltersText = string.Join(",", TopicFilters);
+ return "Subscribe: [PacketIdentifier=" + PacketIdentifier + "] [TopicFilters=" + topicFiltersText + "]";
+ }
}
}
diff --git a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
index ab1d4871..5fe8522c 100644
--- a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
+++ b/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
@@ -57,42 +57,7 @@ namespace MQTTnet.Core.Server
await _gate.WaitAsync().ConfigureAwait(false);
try
{
- var saveIsRequired = false;
-
- if (applicationMessage.Payload?.Any() == false)
- {
- saveIsRequired = _retainedMessages.Remove(applicationMessage.Topic);
- _logger.LogInformation("Client '{0}' cleared retained message for topic '{1}'.", clientId, applicationMessage.Topic);
- }
- else
- {
- if (!_retainedMessages.ContainsKey(applicationMessage.Topic))
- {
- _retainedMessages[applicationMessage.Topic] = applicationMessage;
- saveIsRequired = true;
- }
- else
- {
- var existingMessage = _retainedMessages[applicationMessage.Topic];
- if (existingMessage.QualityOfServiceLevel != applicationMessage.QualityOfServiceLevel || !existingMessage.Payload.SequenceEqual(applicationMessage.Payload ?? new byte[0]))
- {
- _retainedMessages[applicationMessage.Topic] = applicationMessage;
- saveIsRequired = true;
- }
- }
-
- _logger.LogInformation("Client '{0}' set retained message for topic '{1}'.", clientId, applicationMessage.Topic);
- }
-
- if (!saveIsRequired)
- {
- _logger.LogTrace("Skipped saving retained messages because no changes were detected.");
- }
-
- if (saveIsRequired && _options.Storage != null)
- {
- await _options.Storage.SaveRetainedMessagesAsync(_retainedMessages.Values.ToList());
- }
+ await HandleMessageInternalAsync(clientId, applicationMessage);
}
catch (Exception exception)
{
@@ -137,5 +102,45 @@ namespace MQTTnet.Core.Server
return retainedMessages;
}
+
+ private async Task HandleMessageInternalAsync(string clientId, MqttApplicationMessage applicationMessage)
+ {
+ var saveIsRequired = false;
+
+ if (applicationMessage.Payload?.Any() == false)
+ {
+ saveIsRequired = _retainedMessages.Remove(applicationMessage.Topic);
+ _logger.LogInformation("Client '{0}' cleared retained message for topic '{1}'.", clientId, applicationMessage.Topic);
+ }
+ else
+ {
+ if (!_retainedMessages.ContainsKey(applicationMessage.Topic))
+ {
+ _retainedMessages[applicationMessage.Topic] = applicationMessage;
+ saveIsRequired = true;
+ }
+ else
+ {
+ var existingMessage = _retainedMessages[applicationMessage.Topic];
+ if (existingMessage.QualityOfServiceLevel != applicationMessage.QualityOfServiceLevel || !existingMessage.Payload.SequenceEqual(applicationMessage.Payload ?? new byte[0]))
+ {
+ _retainedMessages[applicationMessage.Topic] = applicationMessage;
+ saveIsRequired = true;
+ }
+ }
+
+ _logger.LogInformation("Client '{0}' set retained message for topic '{1}'.", clientId, applicationMessage.Topic);
+ }
+
+ if (!saveIsRequired)
+ {
+ _logger.LogTrace("Skipped saving retained messages because no changes were detected.");
+ }
+
+ if (saveIsRequired && _options.Storage != null)
+ {
+ await _options.Storage.SaveRetainedMessagesAsync(_retainedMessages.Values.ToList());
+ }
+ }
}
}
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
index 5e1a1261..fcf6d091 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MainPage.xaml.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Concurrent;
using System.Text;
using System.Threading.Tasks;
using Windows.Security.Cryptography.Certificates;
@@ -18,6 +19,8 @@ namespace MQTTnet.TestApp.UniversalWindows
{
public sealed partial class MainPage
{
+ private readonly ConcurrentQueue _traceMessages = new ConcurrentQueue();
+
private IMqttClient _mqttClient;
private IMqttServer _mqttServer;
@@ -30,15 +33,32 @@ namespace MQTTnet.TestApp.UniversalWindows
private async void OnTraceMessagePublished(object sender, MqttNetTraceMessagePublishedEventArgs e)
{
- var text = $"[{e.TraceMessage.Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{e.TraceMessage.Level}] [{e.TraceMessage.Source}] [{e.TraceMessage.ThreadId}] [{e.TraceMessage.Message}]{Environment.NewLine}";
- if (e.TraceMessage.Exception != null)
+ _traceMessages.Enqueue(e.TraceMessage);
+ while (_traceMessages.Count > 100)
{
- text += $"{e.TraceMessage.Exception}{Environment.NewLine}";
+ _traceMessages.TryDequeue(out _);
}
-
+
+ var logText = new StringBuilder();
+ foreach (var traceMessage in _traceMessages)
+ {
+ logText.AppendFormat(
+ "[{0:yyyy-MM-dd HH:mm:ss.fff}] [{1}] [{2}] [{3}] [{4}]{5}", traceMessage.Timestamp,
+ traceMessage.Level,
+ traceMessage.Source,
+ traceMessage.ThreadId,
+ traceMessage.Message,
+ Environment.NewLine);
+
+ if (traceMessage.Exception != null)
+ {
+ logText.AppendLine(traceMessage.Exception.ToString());
+ }
+ }
+
await Trace.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
{
- Trace.Text += text;
+ Trace.Text = logText.ToString();
});
}
From 861d3dfa0f4503d9b7cf44612bf5fb5778edba43 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Tue, 21 Nov 2017 21:00:48 +0100
Subject: [PATCH 058/149] Fix version info
---
Build/MQTTnet.AspNetCore.nuspec | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/Build/MQTTnet.AspNetCore.nuspec b/Build/MQTTnet.AspNetCore.nuspec
index 30717332..b29ad5c3 100644
--- a/Build/MQTTnet.AspNetCore.nuspec
+++ b/Build/MQTTnet.AspNetCore.nuspec
@@ -2,7 +2,7 @@
MQTTnet.AspNetCore
- 2.5.1
+ 2.5.2
Christian Kratky
Christian Kratky
https://github.com/chkr1011/MQTTnet/blob/master/LICENSE
@@ -10,13 +10,14 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
This is a support library to integrate MQTTnet into AspNetCore.
- * Updated to MQTTnet 2.5.1.
+ * Updated to MQTTnet 2.5.2.
+* Fixed WebSocket protocol negotiation.
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 Xamarin
-
+
From 77b80dc53ea8c24ca2754e90c72f7160a94383a4 Mon Sep 17 00:00:00 2001
From: Christian Kratky
Date: Wed, 22 Nov 2017 22:30:55 +0100
Subject: [PATCH 059/149] Removed 3rd-Party libraries.
---
Build/MQTTnet.nuspec | 27 +---
.../MQTTnet.AspnetCore/MqttHostedServer.cs | 16 +-
.../MqttWebSocketServerAdapter.cs | 11 +-
.../MqttWebSocketServerChannel.cs | 2 +-
.../ServiceCollectionExtensions.cs | 2 -
.../Diagnostics/MqttNetConsoleTrace.cs | 50 ++++++
.../MqttClientAdapterFactory.cs | 26 ++++
.../Implementations/MqttServerAdapter.Uwp.cs | 13 +-
.../Implementations/MqttServerAdapter.cs | 17 +--
.../Implementations/MqttTcpChannel.Uwp.cs | 2 +-
.../Implementations/MqttTcpChannel.cs | 2 +-
.../Implementations/MqttWebSocketChannel.cs | 13 +-
.../MQTTnet.Netstandard.csproj | 25 +--
Frameworks/MQTTnet.NetStandard/MqttFactory.cs | 128 +++-------------
.../ServiceCollectionExtensions.cs | 70 ---------
...ationAdapter.cs => IMqttChannelAdapter.cs} | 2 +-
.../IMqttCommunicationAdapterFactory.cs | 12 --
...cationAdapter.cs => MqttChannelAdapter.cs} | 18 +--
...ons.cs => MqttChannelAdapterExtensions.cs} | 4 +-
...qttServerAdapterClientAcceptedEventArgs.cs | 4 +-
...ommunicationChannel.cs => IMqttChannel.cs} | 2 +-
.../Client/IMqttClientAdapterFactory.cs | 10 ++
MQTTnet.Core/Client/IMqttClientFactory.cs | 7 +-
MQTTnet.Core/Client/IMqttClientOptions.cs | 4 -
MQTTnet.Core/Client/MqttClient.cs | 60 ++++----
MQTTnet.Core/Client/MqttClientOptions.cs | 3 -
.../Client/MqttClientOptionsBuilder.cs | 6 -
MQTTnet.Core/Client/MqttPacketDispatcher.cs | 8 +-
MQTTnet.Core/Diagnostics/IMqttNetLogger.cs | 21 +++
MQTTnet.Core/Diagnostics/MqttNetGlobalLog.cs | 18 +++
MQTTnet.Core/Diagnostics/MqttNetLogLevel.cs | 13 ++
...ttTraceMessage.cs => MqttNetLogMessage.cs} | 10 +-
.../MqttNetLogMessagePublishedEventArgs.cs | 14 ++
MQTTnet.Core/Diagnostics/MqttNetLogger.cs | 87 +++++++----
MQTTnet.Core/Diagnostics/MqttNetTrace.cs | 35 -----
.../MqttNetTraceMessagePublishedEventArgs.cs | 14 --
MQTTnet.Core/MQTTnet.Core.csproj | 10 +-
.../ManagedClient/ManagedMqttClient.cs | 38 ++---
.../IMqttClientRetainedMessageManager.cs | 15 --
.../Server/IMqttClientSesssionFactory.cs | 7 -
MQTTnet.Core/Server/IMqttServer.cs | 2 +-
MQTTnet.Core/Server/IMqttServerFactory.cs | 6 +-
.../Server/MqttClientPendingMessagesQueue.cs | 24 +--
MQTTnet.Core/Server/MqttClientSession.cs | 44 +++---
.../Server/MqttClientSessionsManager.cs | 42 ++---
.../Server/MqttClientSubscriptionsManager.cs | 5 +-
...ager.cs => MqttRetainedMessagesManager.cs} | 21 ++-
MQTTnet.Core/Server/MqttServer.cs | 105 +++++++------
.../MQTTnet.Core.Tests.csproj | 2 +-
.../MqttLoggerProviderTest.cs | 51 -------
Tests/MQTTnet.Core.Tests/MqttServerTests.cs | 143 +++++-------------
.../MqttSubscriptionsManagerTests.cs | 9 +-
.../ServiceCollectionTest.cs | 30 ----
.../TestClientSessionFactory.cs | 14 --
Tests/MQTTnet.Core.Tests/TestLogger.cs | 26 ----
.../TestMqttCommunicationAdapter.cs | 2 +-
.../TestMqttCommunicationAdapterFactory.cs | 17 +--
.../TestMqttServerAdapter.cs | 6 +-
Tests/MQTTnet.TestApp.NetCore/ClientTest.cs | 4 +-
.../MQTTnet.TestApp.NetCore.csproj | 6 -
.../ManagedClientTest.cs | 12 +-
.../PerformanceTest.cs | 57 ++-----
Tests/MQTTnet.TestApp.NetCore/Program.cs | 3 -
Tests/MQTTnet.TestApp.NetCore/ServerTest.cs | 47 +++---
.../MQTTnet.TestApp.UniversalWindows.csproj | 6 -
.../MainPage.xaml.cs | 121 ++++++---------
66 files changed, 626 insertions(+), 1005 deletions(-)
create mode 100644 Frameworks/MQTTnet.NetStandard/Diagnostics/MqttNetConsoleTrace.cs
create mode 100644 Frameworks/MQTTnet.NetStandard/Implementations/MqttClientAdapterFactory.cs
delete mode 100644 Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs
rename MQTTnet.Core/Adapter/{IMqttCommunicationAdapter.cs => IMqttChannelAdapter.cs} (92%)
delete mode 100644 MQTTnet.Core/Adapter/IMqttCommunicationAdapterFactory.cs
rename MQTTnet.Core/Adapter/{MqttChannelCommunicationAdapter.cs => MqttChannelAdapter.cs} (89%)
rename MQTTnet.Core/Adapter/{MqttCommunicationAdapterExtensions.cs => MqttChannelAdapterExtensions.cs} (58%)
rename MQTTnet.Core/Channel/{IMqttCommunicationChannel.cs => IMqttChannel.cs} (83%)
create mode 100644 MQTTnet.Core/Client/IMqttClientAdapterFactory.cs
create mode 100644 MQTTnet.Core/Diagnostics/IMqttNetLogger.cs
create mode 100644 MQTTnet.Core/Diagnostics/MqttNetGlobalLog.cs
create mode 100644 MQTTnet.Core/Diagnostics/MqttNetLogLevel.cs
rename MQTTnet.Core/Diagnostics/{MqttTraceMessage.cs => MqttNetLogMessage.cs} (61%)
create mode 100644 MQTTnet.Core/Diagnostics/MqttNetLogMessagePublishedEventArgs.cs
delete mode 100644 MQTTnet.Core/Diagnostics/MqttNetTrace.cs
delete mode 100644 MQTTnet.Core/Diagnostics/MqttNetTraceMessagePublishedEventArgs.cs
delete mode 100644 MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
delete mode 100644 MQTTnet.Core/Server/IMqttClientSesssionFactory.cs
rename MQTTnet.Core/Server/{MqttClientRetainedMessagesManager.cs => MqttRetainedMessagesManager.cs} (80%)
delete mode 100644 Tests/MQTTnet.Core.Tests/MqttLoggerProviderTest.cs
delete mode 100644 Tests/MQTTnet.Core.Tests/ServiceCollectionTest.cs
delete mode 100644 Tests/MQTTnet.Core.Tests/TestClientSessionFactory.cs
delete mode 100644 Tests/MQTTnet.Core.Tests/TestLogger.cs
diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index faccaefb..8dd284ea 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -2,7 +2,7 @@
MQTTnet
- 2.5.2
+ 2.5.3
Christian Kratky
Christian Kratky
https://github.com/chkr1011/MQTTnet/blob/master/LICENSE
@@ -10,7 +10,9 @@
https://raw.githubusercontent.com/chkr1011/MQTTnet/master/Images/Logo_128x128.png
false
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).
- * [Core] Refactored trace messages.
+ * [Core] Removed all dependencies to other libraries (BREAKING CHANGE!).
+* [Core] Updated SDK libraries.
+* [Client] Fixed broken support for WebSocketSecure connections (Thanks to @StAI).
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 Xamarin
@@ -18,43 +20,26 @@
-
-
-
-
-
+
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
diff --git a/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs b/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs
index 8d005187..e21b8fe5 100644
--- a/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs
+++ b/Frameworks/MQTTnet.AspnetCore/MqttHostedServer.cs
@@ -2,29 +2,27 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Diagnostics;
using MQTTnet.Core.Server;
namespace MQTTnet.AspNetCore
{
public class MqttHostedServer : MqttServer, IHostedService
{
+ private readonly MqttServerOptions _options;
+
public MqttHostedServer(
- IOptions options,
+ MqttServerOptions options,
IEnumerable adapters,
- ILogger logger,
- MqttClientSessionsManager clientSessionsManager,
- IMqttClientRetainedMessageManager clientRetainedMessageManager
- )
- : base(options, adapters, logger, clientSessionsManager, clientRetainedMessageManager)
+ IMqttNetLogger logger) : base(adapters, logger)
{
+ _options = options;
}
public Task StartAsync(CancellationToken cancellationToken)
{
- return StartAsync();
+ return StartAsync(_options);
}
public Task StopAsync(CancellationToken cancellationToken)
diff --git a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
index 0e3a3d5f..27810924 100644
--- a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
+++ b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
@@ -2,19 +2,14 @@
using System.Net.WebSockets;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Diagnostics;
+using MQTTnet.Core.Serializer;
using MQTTnet.Core.Server;
namespace MQTTnet.AspNetCore
{
public class MqttWebSocketServerAdapter : IMqttServerAdapter, IDisposable
{
- private readonly IMqttCommunicationAdapterFactory _mqttCommunicationAdapterFactory;
-
- public MqttWebSocketServerAdapter(IMqttCommunicationAdapterFactory mqttCommunicationAdapterFactory)
- {
- _mqttCommunicationAdapterFactory = mqttCommunicationAdapterFactory ?? throw new ArgumentNullException(nameof(mqttCommunicationAdapterFactory));
- }
-
public event EventHandler ClientAccepted;
public Task StartAsync(MqttServerOptions options)
@@ -32,7 +27,7 @@ namespace MQTTnet.AspNetCore
if (webSocket == null) throw new ArgumentNullException(nameof(webSocket));
var channel = new MqttWebSocketServerChannel(webSocket);
- var clientAdapter = _mqttCommunicationAdapterFactory.CreateServerCommunicationAdapter(channel);
+ var clientAdapter = new MqttChannelAdapter(channel, new MqttPacketSerializer(), new MqttNetLogger());
var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);
ClientAccepted?.Invoke(this, eventArgs);
diff --git a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerChannel.cs b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerChannel.cs
index 54cfb0b9..55b49400 100644
--- a/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerChannel.cs
+++ b/Frameworks/MQTTnet.AspnetCore/MqttWebSocketServerChannel.cs
@@ -8,7 +8,7 @@ using MQTTnet.Implementations;
namespace MQTTnet.AspNetCore
{
- public class MqttWebSocketServerChannel : IMqttCommunicationChannel, IDisposable
+ public class MqttWebSocketServerChannel : IMqttChannel, IDisposable
{
private WebSocket _webSocket;
diff --git a/Frameworks/MQTTnet.AspnetCore/ServiceCollectionExtensions.cs b/Frameworks/MQTTnet.AspnetCore/ServiceCollectionExtensions.cs
index f915ab43..f39b1cf8 100644
--- a/Frameworks/MQTTnet.AspnetCore/ServiceCollectionExtensions.cs
+++ b/Frameworks/MQTTnet.AspnetCore/ServiceCollectionExtensions.cs
@@ -9,8 +9,6 @@ namespace MQTTnet.AspNetCore
{
public static IServiceCollection AddHostedMqttServer(this IServiceCollection services)
{
- services.AddMqttServerServices();
-
services.AddSingleton(s => s.GetService());
services.AddSingleton(s => s.GetService());
services.AddSingleton();
diff --git a/Frameworks/MQTTnet.NetStandard/Diagnostics/MqttNetConsoleTrace.cs b/Frameworks/MQTTnet.NetStandard/Diagnostics/MqttNetConsoleTrace.cs
new file mode 100644
index 00000000..d660b17c
--- /dev/null
+++ b/Frameworks/MQTTnet.NetStandard/Diagnostics/MqttNetConsoleTrace.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Text;
+using MQTTnet.Core.Diagnostics;
+
+namespace MQTTnet.Diagnostics
+{
+ public static class MqttNetConsoleTrace
+ {
+ private static readonly object Lock = new object();
+
+ public static void ForwardToConsole()
+ {
+ MqttNetGlobalLog.LogMessagePublished -= PrintToConsole;
+ MqttNetGlobalLog.LogMessagePublished += PrintToConsole;
+ }
+
+ private static void PrintToConsole(object sender, MqttNetLogMessagePublishedEventArgs e)
+ {
+ var output = new StringBuilder();
+ output.AppendLine($">> [{e.TraceMessage.Timestamp:O}] [{e.TraceMessage.ThreadId}] [{e.TraceMessage.Source}] [{e.TraceMessage.Level}]: {e.TraceMessage.Message}");
+ if (e.TraceMessage.Exception != null)
+ {
+ output.AppendLine(e.TraceMessage.Exception.ToString());
+ }
+
+ lock (Lock)
+ {
+ var backupColor = Console.ForegroundColor;
+ switch (e.TraceMessage.Level)
+ {
+ case MqttNetLogLevel.Error:
+ Console.ForegroundColor = ConsoleColor.Red;
+ break;
+ case MqttNetLogLevel.Warning:
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ break;
+ case MqttNetLogLevel.Info:
+ Console.ForegroundColor = ConsoleColor.Green;
+ break;
+ case MqttNetLogLevel.Verbose:
+ Console.ForegroundColor = ConsoleColor.Gray;
+ break;
+ }
+
+ Console.Write(output);
+ Console.ForegroundColor = backupColor;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttClientAdapterFactory.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttClientAdapterFactory.cs
new file mode 100644
index 00000000..9884c86f
--- /dev/null
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttClientAdapterFactory.cs
@@ -0,0 +1,26 @@
+using System;
+using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Client;
+using MQTTnet.Core.Diagnostics;
+using MQTTnet.Core.Serializer;
+
+namespace MQTTnet.Implementations
+{
+ public class MqttClientAdapterFactory : IMqttClientAdapterFactory
+ {
+ public IMqttChannelAdapter CreateClientAdapter(IMqttClientChannelOptions options, IMqttNetLogger logger)
+ {
+ if (options == null) throw new ArgumentNullException(nameof(options));
+
+ switch (options)
+ {
+ case MqttClientTcpOptions tcpOptions:
+ return new MqttChannelAdapter(new MqttTcpChannel(tcpOptions), new MqttPacketSerializer(), logger);
+ case MqttClientWebSocketOptions webSocketOptions:
+ return new MqttChannelAdapter(new MqttWebSocketChannel(webSocketOptions), new MqttPacketSerializer(), logger);
+ default:
+ throw new NotSupportedException();
+ }
+ }
+ }
+}
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.Uwp.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.Uwp.cs
index 658cfe83..1b8a43cd 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.Uwp.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.Uwp.cs
@@ -4,20 +4,19 @@ using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
using MQTTnet.Core.Server;
using Windows.Networking.Sockets;
-using Microsoft.Extensions.Logging;
+using MQTTnet.Core.Diagnostics;
+using MQTTnet.Core.Serializer;
namespace MQTTnet.Implementations
{
public class MqttServerAdapter : IMqttServerAdapter, IDisposable
{
- private readonly ILogger _logger;
- private readonly IMqttCommunicationAdapterFactory _communicationAdapterFactory;
+ private readonly IMqttNetLogger _logger;
private StreamSocketListener _defaultEndpointSocket;
- public MqttServerAdapter(ILogger logger, IMqttCommunicationAdapterFactory communicationAdapterFactory)
+ public MqttServerAdapter(IMqttNetLogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _communicationAdapterFactory = communicationAdapterFactory ?? throw new ArgumentNullException(nameof(communicationAdapterFactory));
}
public event EventHandler ClientAccepted;
@@ -63,12 +62,12 @@ namespace MQTTnet.Implementations
{
try
{
- var clientAdapter = _communicationAdapterFactory.CreateServerCommunicationAdapter(new MqttTcpChannel(args.Socket));
+ var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(args.Socket), new MqttPacketSerializer(), _logger);
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Error while accepting connection at default endpoint.");
+ _logger.Error(exception, "Error while accepting connection at default endpoint.");
}
}
}
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
index e3f048db..3b8515c5 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttServerAdapter.cs
@@ -9,24 +9,23 @@ using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
using MQTTnet.Core.Server;
-using Microsoft.Extensions.Logging;
+using MQTTnet.Core.Diagnostics;
+using MQTTnet.Core.Serializer;
namespace MQTTnet.Implementations
{
public class MqttServerAdapter : IMqttServerAdapter, IDisposable
{
- private readonly ILogger _logger;
- private readonly IMqttCommunicationAdapterFactory _communicationAdapterFactory;
+ private readonly IMqttNetLogger _logger;
private CancellationTokenSource _cancellationTokenSource;
private Socket _defaultEndpointSocket;
private Socket _tlsEndpointSocket;
private X509Certificate2 _tlsCertificate;
- public MqttServerAdapter(ILogger logger, IMqttCommunicationAdapterFactory communicationAdapterFactory)
+ public MqttServerAdapter(IMqttNetLogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _communicationAdapterFactory = communicationAdapterFactory ?? throw new ArgumentNullException(nameof(communicationAdapterFactory));
}
public event EventHandler ClientAccepted;
@@ -103,12 +102,12 @@ namespace MQTTnet.Implementations
#else
var clientSocket = await _defaultEndpointSocket.AcceptAsync().ConfigureAwait(false);
#endif
- var clientAdapter = _communicationAdapterFactory.CreateServerCommunicationAdapter(new MqttTcpChannel(clientSocket, null));
+ var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(clientSocket, null), new MqttPacketSerializer(), _logger);
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Error while accepting connection at default endpoint.");
+ _logger.Error(exception, "Error while accepting connection at default endpoint.");
//excessive CPU consumed if in endless loop of socket errors
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
@@ -131,12 +130,12 @@ namespace MQTTnet.Implementations
var sslStream = new SslStream(new NetworkStream(clientSocket));
await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, SslProtocols.Tls12, false).ConfigureAwait(false);
- var clientAdapter = _communicationAdapterFactory.CreateServerCommunicationAdapter(new MqttTcpChannel(clientSocket, sslStream));
+ var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketSerializer(), _logger);
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Error while accepting connection at TLS endpoint.");
+ _logger.Error(exception, "Error while accepting connection at TLS endpoint.");
//excessive CPU consumed if in endless loop of socket errors
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
index 06fa1377..964bfbfe 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.Uwp.cs
@@ -13,7 +13,7 @@ using MQTTnet.Core.Client;
namespace MQTTnet.Implementations
{
- public sealed class MqttTcpChannel : IMqttCommunicationChannel, IDisposable
+ public sealed class MqttTcpChannel : IMqttChannel, IDisposable
{
private readonly MqttClientTcpOptions _options;
private StreamSocket _socket;
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
index a7e40268..ce9dcf6c 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpChannel.cs
@@ -12,7 +12,7 @@ using System.Linq;
namespace MQTTnet.Implementations
{
- public sealed class MqttTcpChannel : IMqttCommunicationChannel, IDisposable
+ public sealed class MqttTcpChannel : IMqttChannel, IDisposable
{
private readonly MqttClientTcpOptions _options;
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
index 8f56c945..9046bb9c 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttWebSocketChannel.cs
@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace MQTTnet.Implementations
{
- public sealed class MqttWebSocketChannel : IMqttCommunicationChannel, IDisposable
+ public sealed class MqttWebSocketChannel : IMqttChannel, IDisposable
{
// ReSharper disable once MemberCanBePrivate.Global
// ReSharper disable once AutoPropertyCanBeMadeGetOnly.Global
@@ -29,9 +29,16 @@ namespace MQTTnet.Implementations
public async Task ConnectAsync()
{
var uri = _options.Uri;
- if (!uri.StartsWith("ws://", StringComparison.OrdinalIgnoreCase))
+ if (!uri.StartsWith("ws://", StringComparison.OrdinalIgnoreCase) && !uri.StartsWith("wss://", StringComparison.OrdinalIgnoreCase))
{
- uri = "ws://" + uri;
+ if (!_options.TlsOptions.UseTls)
+ {
+ uri = "ws://" + uri;
+ }
+ else
+ {
+ uri = "wss://" + uri;
+ }
}
_webSocket = new ClientWebSocket();
diff --git a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
index 6349d3ea..9b6211d8 100644
--- a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
+++ b/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
@@ -4,8 +4,10 @@
netstandard1.3;netstandard2.0;net452;net461;uap10.0
MQTTnet
MQTTnet
- 2.5.2.0
- 2.5.2.0
+ False
+ Full
+ 2.5.3.0
+ 2.5.3.0
0.0.0.0
@@ -31,9 +33,6 @@
-
-
-
@@ -42,36 +41,22 @@
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
\ No newline at end of file
diff --git a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
index 6037929e..99e57af6 100644
--- a/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
+++ b/Frameworks/MQTTnet.NetStandard/MqttFactory.cs
@@ -1,130 +1,52 @@
using System;
+using System.Collections.Generic;
using MQTTnet.Core.Adapter;
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;
-using MQTTnet.Core.Channel;
+using MQTTnet.Core.Diagnostics;
namespace MQTTnet
{
- public class MqttFactory : IMqttCommunicationAdapterFactory, IMqttClientSesssionFactory, IMqttClientFactory, IMqttServerFactory
+ public class MqttFactory : IMqttClientFactory, IMqttServerFactory
{
- private readonly IServiceProvider _serviceProvider;
-
- public MqttFactory()
- : this(BuildServiceProvider())
- {
- }
-
- public MqttFactory(IServiceProvider serviceProvider)
- {
- _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
- }
-
- public ILoggerFactory GetLoggerFactory()
- {
- return _serviceProvider.GetRequiredService();
- }
-
- public IMqttCommunicationAdapter CreateClientCommunicationAdapter(IMqttClientOptions options)
- {
- var logger = _serviceProvider.GetRequiredService>();
- return new MqttChannelCommunicationAdapter(CreateCommunicationChannel(options.ChannelOptions), CreateSerializer(options.ProtocolVersion), logger);
- }
-
- public IMqttCommunicationAdapter CreateServerCommunicationAdapter(IMqttCommunicationChannel channel)
- {
- var serializer = _serviceProvider.GetRequiredService();
- var logger = _serviceProvider.GetRequiredService>();
- return new MqttChannelCommunicationAdapter(channel, serializer, logger);
- }
-
- public IMqttCommunicationChannel CreateCommunicationChannel(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();
+ return CreateMqttClient(new MqttNetLogger());
+ }
+
+ public IMqttClient CreateMqttClient(IMqttNetLogger logger)
+ {
+ if (logger == null) throw new ArgumentNullException(nameof(logger));
+
+ return new MqttClient(new MqttClientAdapterFactory(), logger);
}
public IManagedMqttClient CreateManagedMqttClient()
{
- return _serviceProvider.GetRequiredService();
+ return new ManagedMqttClient(CreateMqttClient(), new MqttNetLogger());
+ }
+
+ public IManagedMqttClient CreateManagedMqttClient(IMqttNetLogger logger)
+ {
+ if (logger == null) throw new ArgumentNullException(nameof(logger));
+
+ return new ManagedMqttClient(CreateMqttClient(), logger);
}
public IMqttServer CreateMqttServer()
{
- return _serviceProvider.GetRequiredService();
+ var logger = new MqttNetLogger();
+ return CreateMqttServer(new List { new MqttServerAdapter(logger) }, logger);
}
- public IMqttServer CreateMqttServer(Action configure)
+ public IMqttServer CreateMqttServer(IEnumerable adapters, IMqttNetLogger logger)
{
- if (configure == null) throw new ArgumentNullException(nameof(configure));
+ if (adapters == null) throw new ArgumentNullException(nameof(adapters));
+ if (logger == null) throw new ArgumentNullException(nameof(logger));
- var options = _serviceProvider.GetRequiredService>();
- configure(options.Value);
-
- return _serviceProvider.GetRequiredService();
- }
-
- private static IServiceProvider BuildServiceProvider()
- {
- var serviceProvider = new ServiceCollection()
- .AddMqttClient()
- .AddMqttServer()
- .AddLogging()
- .BuildServiceProvider();
-
- serviceProvider.GetRequiredService()
- .AddMqttTrace();
-
- return serviceProvider;
+ return new MqttServer(adapters, logger);
}
}
}
\ No newline at end of file
diff --git a/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs b/Frameworks/MQTTnet.NetStandard/ServiceCollectionExtensions.cs
deleted file mode 100644
index 4e6639a7..00000000
--- a/Frameworks/MQTTnet.NetStandard/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.AddSingleton();
- services.AddTransient();
- services.AddSingleton();
- 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.Core/Adapter/IMqttCommunicationAdapter.cs b/MQTTnet.Core/Adapter/IMqttChannelAdapter.cs
similarity index 92%
rename from MQTTnet.Core/Adapter/IMqttCommunicationAdapter.cs
rename to MQTTnet.Core/Adapter/IMqttChannelAdapter.cs
index 78586f66..13908f62 100644
--- a/MQTTnet.Core/Adapter/IMqttCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/IMqttChannelAdapter.cs
@@ -7,7 +7,7 @@ using MQTTnet.Core.Serializer;
namespace MQTTnet.Core.Adapter
{
- public interface IMqttCommunicationAdapter
+ public interface IMqttChannelAdapter
{
IMqttPacketSerializer PacketSerializer { get; }
diff --git a/MQTTnet.Core/Adapter/IMqttCommunicationAdapterFactory.cs b/MQTTnet.Core/Adapter/IMqttCommunicationAdapterFactory.cs
deleted file mode 100644
index 96098812..00000000
--- a/MQTTnet.Core/Adapter/IMqttCommunicationAdapterFactory.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using MQTTnet.Core.Client;
-using MQTTnet.Core.Channel;
-
-namespace MQTTnet.Core.Adapter
-{
- public interface IMqttCommunicationAdapterFactory
- {
- IMqttCommunicationAdapter CreateClientCommunicationAdapter(IMqttClientOptions options);
-
- IMqttCommunicationAdapter CreateServerCommunicationAdapter(IMqttCommunicationChannel channel);
- }
-}
\ No newline at end of file
diff --git a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs b/MQTTnet.Core/Adapter/MqttChannelAdapter.cs
similarity index 89%
rename from MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
rename to MQTTnet.Core/Adapter/MqttChannelAdapter.cs
index 5b0038d1..5dfcfc01 100644
--- a/MQTTnet.Core/Adapter/MqttChannelCommunicationAdapter.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelAdapter.cs
@@ -5,23 +5,23 @@ using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Channel;
+using MQTTnet.Core.Diagnostics;
using MQTTnet.Core.Exceptions;
using MQTTnet.Core.Internal;
using MQTTnet.Core.Packets;
using MQTTnet.Core.Serializer;
-using Microsoft.Extensions.Logging;
namespace MQTTnet.Core.Adapter
{
- public class MqttChannelCommunicationAdapter : IMqttCommunicationAdapter
+ public class MqttChannelAdapter : IMqttChannelAdapter
{
private const uint ErrorOperationAborted = 0x800703E3;
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
- private readonly ILogger _logger;
- private readonly IMqttCommunicationChannel _channel;
+ private readonly IMqttNetLogger _logger;
+ private readonly IMqttChannel _channel;
- public MqttChannelCommunicationAdapter(IMqttCommunicationChannel channel, IMqttPacketSerializer serializer, ILogger logger)
+ public MqttChannelAdapter(IMqttChannel channel, IMqttPacketSerializer serializer, IMqttNetLogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_channel = channel ?? throw new ArgumentNullException(nameof(channel));
@@ -32,14 +32,14 @@ namespace MQTTnet.Core.Adapter
public async Task ConnectAsync(TimeSpan timeout)
{
- _logger.LogInformation("Connecting [Timeout={0}]", timeout);
+ _logger.Info("Connecting [Timeout={0}]", timeout);
await ExecuteAndWrapExceptionAsync(() => _channel.ConnectAsync().TimeoutAfter(timeout));
}
public async Task DisconnectAsync(TimeSpan timeout)
{
- _logger.LogInformation("Disconnecting [Timeout={0}]", timeout);
+ _logger.Info("Disconnecting [Timeout={0}]", timeout);
await ExecuteAndWrapExceptionAsync(() => _channel.DisconnectAsync().TimeoutAfter(timeout));
}
@@ -58,7 +58,7 @@ namespace MQTTnet.Core.Adapter
continue;
}
- _logger.LogInformation("TX >>> {0} [Timeout={1}]", packet, timeout);
+ _logger.Trace("TX >>> {0} [Timeout={1}]", packet, timeout);
var writeBuffer = PacketSerializer.Serialize(packet);
await _channel.SendStream.WriteAsync(writeBuffer, 0, writeBuffer.Length, cancellationToken).ConfigureAwait(false);
@@ -108,7 +108,7 @@ namespace MQTTnet.Core.Adapter
throw new MqttProtocolViolationException("Received malformed packet.");
}
- _logger.LogInformation("RX <<< {0}", packet);
+ _logger.Trace("RX <<< {0}", packet);
}
finally
{
diff --git a/MQTTnet.Core/Adapter/MqttCommunicationAdapterExtensions.cs b/MQTTnet.Core/Adapter/MqttChannelAdapterExtensions.cs
similarity index 58%
rename from MQTTnet.Core/Adapter/MqttCommunicationAdapterExtensions.cs
rename to MQTTnet.Core/Adapter/MqttChannelAdapterExtensions.cs
index 2142fd07..f271248f 100644
--- a/MQTTnet.Core/Adapter/MqttCommunicationAdapterExtensions.cs
+++ b/MQTTnet.Core/Adapter/MqttChannelAdapterExtensions.cs
@@ -5,9 +5,9 @@ using MQTTnet.Core.Packets;
namespace MQTTnet.Core.Adapter
{
- public static class MqttCommunicationAdapterExtensions
+ public static class MqttChannelAdapterExtensions
{
- public static Task SendPacketsAsync(this IMqttCommunicationAdapter adapter, TimeSpan timeout, CancellationToken cancellationToken, params MqttBasePacket[] packets)
+ public static Task SendPacketsAsync(this IMqttChannelAdapter adapter, TimeSpan timeout, CancellationToken cancellationToken, params MqttBasePacket[] packets)
{
if (adapter == null) throw new ArgumentNullException(nameof(adapter));
diff --git a/MQTTnet.Core/Adapter/MqttServerAdapterClientAcceptedEventArgs.cs b/MQTTnet.Core/Adapter/MqttServerAdapterClientAcceptedEventArgs.cs
index 6caca0e9..341f6327 100644
--- a/MQTTnet.Core/Adapter/MqttServerAdapterClientAcceptedEventArgs.cs
+++ b/MQTTnet.Core/Adapter/MqttServerAdapterClientAcceptedEventArgs.cs
@@ -5,12 +5,12 @@ namespace MQTTnet.Core.Adapter
{
public class MqttServerAdapterClientAcceptedEventArgs : EventArgs
{
- public MqttServerAdapterClientAcceptedEventArgs(IMqttCommunicationAdapter client)
+ public MqttServerAdapterClientAcceptedEventArgs(IMqttChannelAdapter client)
{
Client = client ?? throw new ArgumentNullException(nameof(client));
}
- public IMqttCommunicationAdapter Client { get; }
+ public IMqttChannelAdapter Client { get; }
public Task SessionTask { get; set; }
}
diff --git a/MQTTnet.Core/Channel/IMqttCommunicationChannel.cs b/MQTTnet.Core/Channel/IMqttChannel.cs
similarity index 83%
rename from MQTTnet.Core/Channel/IMqttCommunicationChannel.cs
rename to MQTTnet.Core/Channel/IMqttChannel.cs
index e7a74c18..92c0681b 100644
--- a/MQTTnet.Core/Channel/IMqttCommunicationChannel.cs
+++ b/MQTTnet.Core/Channel/IMqttChannel.cs
@@ -3,7 +3,7 @@ using System.IO;
namespace MQTTnet.Core.Channel
{
- public interface IMqttCommunicationChannel
+ public interface IMqttChannel
{
Stream SendStream { get; }
Stream ReceiveStream { get; }
diff --git a/MQTTnet.Core/Client/IMqttClientAdapterFactory.cs b/MQTTnet.Core/Client/IMqttClientAdapterFactory.cs
new file mode 100644
index 00000000..3bd61431
--- /dev/null
+++ b/MQTTnet.Core/Client/IMqttClientAdapterFactory.cs
@@ -0,0 +1,10 @@
+using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Diagnostics;
+
+namespace MQTTnet.Core.Client
+{
+ public interface IMqttClientAdapterFactory
+ {
+ IMqttChannelAdapter CreateClientAdapter(IMqttClientChannelOptions options, IMqttNetLogger logger);
+ }
+}
diff --git a/MQTTnet.Core/Client/IMqttClientFactory.cs b/MQTTnet.Core/Client/IMqttClientFactory.cs
index c8b5ef3e..8acdb91a 100644
--- a/MQTTnet.Core/Client/IMqttClientFactory.cs
+++ b/MQTTnet.Core/Client/IMqttClientFactory.cs
@@ -1,4 +1,5 @@
-using MQTTnet.Core.ManagedClient;
+using MQTTnet.Core.Diagnostics;
+using MQTTnet.Core.ManagedClient;
namespace MQTTnet.Core.Client
{
@@ -6,6 +7,10 @@ namespace MQTTnet.Core.Client
{
IMqttClient CreateMqttClient();
+ IMqttClient CreateMqttClient(IMqttNetLogger logger);
+
IManagedMqttClient CreateManagedMqttClient();
+
+ IManagedMqttClient CreateManagedMqttClient(IMqttNetLogger logger);
}
}
\ No newline at end of file
diff --git a/MQTTnet.Core/Client/IMqttClientOptions.cs b/MQTTnet.Core/Client/IMqttClientOptions.cs
index ae771922..9139d5cb 100644
--- a/MQTTnet.Core/Client/IMqttClientOptions.cs
+++ b/MQTTnet.Core/Client/IMqttClientOptions.cs
@@ -7,10 +7,6 @@ namespace MQTTnet.Core.Client
{
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 fcab3fba..f270a381 100644
--- a/MQTTnet.Core/Client/MqttClient.cs
+++ b/MQTTnet.Core/Client/MqttClient.cs
@@ -4,33 +4,34 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Diagnostics;
using MQTTnet.Core.Exceptions;
using MQTTnet.Core.Internal;
using MQTTnet.Core.Packets;
using MQTTnet.Core.Protocol;
-using Microsoft.Extensions.Logging;
namespace MQTTnet.Core.Client
{
public class MqttClient : IMqttClient
{
private readonly HashSet _unacknowledgedPublishPackets = new HashSet();
+
+ private readonly IMqttClientAdapterFactory _adapterFactory;
private readonly MqttPacketDispatcher _packetDispatcher;
- private readonly IMqttCommunicationAdapterFactory _communicationAdapterFactory;
- private readonly ILogger _logger;
+ private readonly IMqttNetLogger _logger;
private IMqttClientOptions _options;
private bool _isReceivingPackets;
private int _latestPacketIdentifier;
private CancellationTokenSource _cancellationTokenSource;
- private IMqttCommunicationAdapter _adapter;
- private IDisposable _scopeHandle;
+ private IMqttChannelAdapter _adapter;
- public MqttClient(IMqttCommunicationAdapterFactory communicationAdapterFactory, ILogger logger, MqttPacketDispatcher packetDispatcher)
+ public MqttClient(IMqttClientAdapterFactory channelFactory, IMqttNetLogger logger)
{
- _communicationAdapterFactory = communicationAdapterFactory ?? throw new ArgumentNullException(nameof(communicationAdapterFactory));
+ _adapterFactory = channelFactory ?? throw new ArgumentNullException(nameof(channelFactory));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _packetDispatcher = packetDispatcher ?? throw new ArgumentNullException(nameof(packetDispatcher));
+
+ _packetDispatcher = new MqttPacketDispatcher(logger);
}
public event EventHandler Connected;
@@ -53,17 +54,16 @@ namespace MQTTnet.Core.Client
_latestPacketIdentifier = 0;
_packetDispatcher.Reset();
- _adapter = _communicationAdapterFactory.CreateClientCommunicationAdapter(options);
-
- _scopeHandle = _logger.BeginScope(options.LogId ?? options.ClientId);
- _logger.LogTrace("Trying to connect with server.");
+ _adapter = _adapterFactory.CreateClientAdapter(options.ChannelOptions, _logger);
+
+ _logger.Trace("Trying to connect with server.");
await _adapter.ConnectAsync(_options.CommunicationTimeout).ConfigureAwait(false);
- _logger.LogTrace("Connection with server established.");
+ _logger.Trace("Connection with server established.");
await StartReceivingPacketsAsync(_cancellationTokenSource.Token).ConfigureAwait(false);
var connectResponse = await AuthenticateAsync(options.WillMessage).ConfigureAwait(false);
- _logger.LogTrace("MQTT connection with server established.");
+ _logger.Trace("MQTT connection with server established.");
if (_options.KeepAlivePeriod != TimeSpan.Zero)
{
@@ -76,7 +76,7 @@ namespace MQTTnet.Core.Client
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Error while connecting with server.");
+ _logger.Error(exception, "Error while connecting with server.");
await DisconnectInternalAsync().ConfigureAwait(false);
throw;
}
@@ -215,8 +215,6 @@ namespace MQTTnet.Core.Client
private async Task DisconnectInternalAsync()
{
- _scopeHandle?.Dispose();
-
var clientWasConnected = IsConnected;
IsConnected = false;
@@ -233,15 +231,15 @@ namespace MQTTnet.Core.Client
try
{
await _adapter.DisconnectAsync(_options.CommunicationTimeout).ConfigureAwait(false);
- _logger.LogInformation("Disconnected from adapter.");
+ _logger.Info("Disconnected from adapter.");
}
catch (Exception exception)
{
- _logger.LogWarning(new EventId(), exception, "Error while disconnecting from adapter.");
+ _logger.Warning(exception, "Error while disconnecting from adapter.");
}
finally
{
- _logger.LogInformation("Disconnected.");
+ _logger.Info("Disconnected.");
Disconnected?.Invoke(this, new MqttClientDisconnectedEventArgs(clientWasConnected));
}
}
@@ -250,7 +248,7 @@ namespace MQTTnet.Core.Client
{
try
{
- _logger.LogInformation("Received <<< {0}", packet);
+ _logger.Info("Received <<< {0}", packet);
if (packet is MqttPingReqPacket)
{
@@ -280,7 +278,7 @@ namespace MQTTnet.Core.Client
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while processing received packet.");
+ _logger.Error(exception, "Unhandled exception while processing received packet.");
}
}
@@ -293,7 +291,7 @@ namespace MQTTnet.Core.Client
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while handling application message.");
+ _logger.Error(exception, "Unhandled exception while handling application message.");
}
}
@@ -357,7 +355,7 @@ namespace MQTTnet.Core.Client
private async Task SendKeepAliveMessagesAsync(CancellationToken cancellationToken)
{
- _logger.LogInformation("Start sending keep alive packets.");
+ _logger.Info("Start sending keep alive packets.");
try
{
@@ -388,23 +386,23 @@ namespace MQTTnet.Core.Client
return;
}
- _logger.LogWarning(new EventId(), exception, "MQTT communication exception while sending/receiving keep alive packets.");
+ _logger.Warning(exception, "MQTT communication exception while sending/receiving keep alive packets.");
await DisconnectInternalAsync().ConfigureAwait(false);
}
catch (Exception exception)
{
- _logger.LogWarning(new EventId(), exception, "Unhandled exception while sending/receiving keep alive packets.");
+ _logger.Warning(exception, "Unhandled exception while sending/receiving keep alive packets.");
await DisconnectInternalAsync().ConfigureAwait(false);
}
finally
{
- _logger.LogInformation("Stopped sending keep alive packets.");
+ _logger.Info("Stopped sending keep alive packets.");
}
}
private async Task ReceivePacketsAsync(CancellationToken cancellationToken)
{
- _logger.LogInformation("Start receiving packets.");
+ _logger.Info("Start receiving packets.");
try
{
@@ -438,17 +436,17 @@ namespace MQTTnet.Core.Client
return;
}
- _logger.LogWarning(new EventId(), exception, "MQTT communication exception while receiving packets.");
+ _logger.Warning(exception, "MQTT communication exception while receiving packets.");
await DisconnectInternalAsync().ConfigureAwait(false);
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while receiving packets.");
+ _logger.Error(exception, "Unhandled exception while receiving packets.");
await DisconnectInternalAsync().ConfigureAwait(false);
}
finally
{
- _logger.LogInformation(nameof(MqttClient), "Stopped receiving packets.");
+ _logger.Info("Stopped receiving packets.");
}
}
diff --git a/MQTTnet.Core/Client/MqttClientOptions.cs b/MQTTnet.Core/Client/MqttClientOptions.cs
index 1b1c1bb8..04cf8bdb 100644
--- a/MQTTnet.Core/Client/MqttClientOptions.cs
+++ b/MQTTnet.Core/Client/MqttClientOptions.cs
@@ -9,9 +9,6 @@ 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();
diff --git a/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs b/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
index fb18cc09..429a3fa7 100644
--- a/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
+++ b/MQTTnet.Core/Client/MqttClientOptionsBuilder.cs
@@ -12,12 +12,6 @@ namespace MQTTnet.Core.Client
private MqttClientTlsOptions _tlsOptions;
- public MqttClientOptionsBuilder WithLogId(string value)
- {
- _options.LogId = value;
- return this;
- }
-
public MqttClientOptionsBuilder WithProtocolVersion(MqttProtocolVersion value)
{
_options.ProtocolVersion = value;
diff --git a/MQTTnet.Core/Client/MqttPacketDispatcher.cs b/MQTTnet.Core/Client/MqttPacketDispatcher.cs
index a999d697..dd9c7140 100644
--- a/MQTTnet.Core/Client/MqttPacketDispatcher.cs
+++ b/MQTTnet.Core/Client/MqttPacketDispatcher.cs
@@ -1,10 +1,10 @@
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
+using MQTTnet.Core.Diagnostics;
using MQTTnet.Core.Exceptions;
using MQTTnet.Core.Internal;
using MQTTnet.Core.Packets;
-using Microsoft.Extensions.Logging;
namespace MQTTnet.Core.Client
{
@@ -12,9 +12,9 @@ namespace MQTTnet.Core.Client
{
private readonly ConcurrentDictionary> _packetByResponseType = new ConcurrentDictionary>();
private readonly ConcurrentDictionary>> _packetByResponseTypeAndIdentifier = new ConcurrentDictionary>>();
- private readonly ILogger _logger;
+ private readonly IMqttNetLogger _logger;
- public MqttPacketDispatcher(ILogger logger)
+ public MqttPacketDispatcher(IMqttNetLogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
@@ -30,7 +30,7 @@ namespace MQTTnet.Core.Client
}
catch (MqttCommunicationTimedOutException)
{
- _logger.LogWarning("Timeout while waiting for packet of type '{0}'.", responseType.Name);
+ _logger.Warning("Timeout while waiting for packet of type '{0}'.", responseType.Name);
throw;
}
finally
diff --git a/MQTTnet.Core/Diagnostics/IMqttNetLogger.cs b/MQTTnet.Core/Diagnostics/IMqttNetLogger.cs
new file mode 100644
index 00000000..99f7b193
--- /dev/null
+++ b/MQTTnet.Core/Diagnostics/IMqttNetLogger.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace MQTTnet.Core.Diagnostics
+{
+ public interface IMqttNetLogger
+ {
+ event EventHandler LogMessagePublished;
+
+ void Trace(string message, params object[] parameters);
+
+ void Info(string message, params object[] parameters);
+
+ void Warning(Exception exception, string message, params object[] parameters);
+
+ void Warning(string message, params object[] parameters);
+
+ void Error(Exception exception, string message, params object[] parameters);
+
+ void Error(string message, params object[] parameters);
+ }
+}
diff --git a/MQTTnet.Core/Diagnostics/MqttNetGlobalLog.cs b/MQTTnet.Core/Diagnostics/MqttNetGlobalLog.cs
new file mode 100644
index 00000000..64326826
--- /dev/null
+++ b/MQTTnet.Core/Diagnostics/MqttNetGlobalLog.cs
@@ -0,0 +1,18 @@
+using System;
+
+namespace MQTTnet.Core.Diagnostics
+{
+ public static class MqttNetGlobalLog
+ {
+ public static event EventHandler LogMessagePublished;
+
+ public static bool HasListeners => LogMessagePublished != null;
+
+ public static void Publish(MqttNetLogMessage logMessage)
+ {
+ if (logMessage == null) throw new ArgumentNullException(nameof(logMessage));
+
+ LogMessagePublished?.Invoke(null, new MqttNetLogMessagePublishedEventArgs(logMessage));
+ }
+ }
+}
diff --git a/MQTTnet.Core/Diagnostics/MqttNetLogLevel.cs b/MQTTnet.Core/Diagnostics/MqttNetLogLevel.cs
new file mode 100644
index 00000000..32e5de17
--- /dev/null
+++ b/MQTTnet.Core/Diagnostics/MqttNetLogLevel.cs
@@ -0,0 +1,13 @@
+namespace MQTTnet.Core.Diagnostics
+{
+ public enum MqttNetLogLevel
+ {
+ Verbose,
+
+ Info,
+
+ Warning,
+
+ Error
+ }
+}
diff --git a/MQTTnet.Core/Diagnostics/MqttTraceMessage.cs b/MQTTnet.Core/Diagnostics/MqttNetLogMessage.cs
similarity index 61%
rename from MQTTnet.Core/Diagnostics/MqttTraceMessage.cs
rename to MQTTnet.Core/Diagnostics/MqttNetLogMessage.cs
index 852aae45..e1598eb2 100644
--- a/MQTTnet.Core/Diagnostics/MqttTraceMessage.cs
+++ b/MQTTnet.Core/Diagnostics/MqttNetLogMessage.cs
@@ -1,12 +1,12 @@
using System;
-using Microsoft.Extensions.Logging;
namespace MQTTnet.Core.Diagnostics
{
- public sealed class MqttNetTraceMessage
+ public sealed class MqttNetLogMessage
{
- public MqttNetTraceMessage(DateTime timestamp, int threadId, string source, LogLevel level, string message, Exception exception)
+ public MqttNetLogMessage(string logId, DateTime timestamp, int threadId, string source, MqttNetLogLevel level, string message, Exception exception)
{
+ LogId = logId;
Timestamp = timestamp;
ThreadId = threadId;
Source = source;
@@ -15,13 +15,15 @@ namespace MQTTnet.Core.Diagnostics
Exception = exception;
}
+ public string LogId { get; }
+
public DateTime Timestamp { get; }
public int ThreadId { get; }
public string Source { get; }
- public LogLevel Level { get; }
+ public MqttNetLogLevel Level { get; }
public string Message { get; }
diff --git a/MQTTnet.Core/Diagnostics/MqttNetLogMessagePublishedEventArgs.cs b/MQTTnet.Core/Diagnostics/MqttNetLogMessagePublishedEventArgs.cs
new file mode 100644
index 00000000..46c54685
--- /dev/null
+++ b/MQTTnet.Core/Diagnostics/MqttNetLogMessagePublishedEventArgs.cs
@@ -0,0 +1,14 @@
+using System;
+
+namespace MQTTnet.Core.Diagnostics
+{
+ public sealed class MqttNetLogMessagePublishedEventArgs : EventArgs
+ {
+ public MqttNetLogMessagePublishedEventArgs(MqttNetLogMessage logMessage)
+ {
+ TraceMessage = logMessage ?? throw new ArgumentNullException(nameof(logMessage));
+ }
+
+ public MqttNetLogMessage TraceMessage { get; }
+ }
+}
diff --git a/MQTTnet.Core/Diagnostics/MqttNetLogger.cs b/MQTTnet.Core/Diagnostics/MqttNetLogger.cs
index 32d96093..a879af1b 100644
--- a/MQTTnet.Core/Diagnostics/MqttNetLogger.cs
+++ b/MQTTnet.Core/Diagnostics/MqttNetLogger.cs
@@ -1,52 +1,73 @@
using System;
-using Microsoft.Extensions.Logging;
namespace MQTTnet.Core.Diagnostics
{
- public class MqttNetLogger : ILogger
+ public class MqttNetLogger : IMqttNetLogger
{
- private readonly string _categoryName;
- private readonly MqttNetTrace _mqttNetTrace;
+ private readonly string _logId;
- public MqttNetLogger(string categoryName, MqttNetTrace mqttNetTrace)
+ public MqttNetLogger(string logId = null)
{
- _categoryName = categoryName;
- _mqttNetTrace = mqttNetTrace;
+ _logId = logId;
+ }
+
+ public event EventHandler LogMessagePublished;
+
+ public void Trace(string message, params object[] parameters)
+ {
+ Publish(MqttNetLogLevel.Verbose, null, message, parameters);
}
- public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter)
+ public void Info(string message, params object[] parameters)
{
- if (formatter == null)
- {
- throw new ArgumentNullException(nameof(formatter));
- }
+ Publish(MqttNetLogLevel.Info, null, message, parameters);
+ }
- if (!MqttNetTrace.HasListeners)
+ public void Warning(Exception exception, string message, params object[] parameters)
+ {
+ Publish(MqttNetLogLevel.Warning, exception, message, parameters);
+ }
+
+ public void Warning(string message, params object[] parameters)
+ {
+ Warning(null, message, parameters);
+ }
+
+ public void Error(Exception exception, string message, params object[] parameters)
+ {
+ Publish(MqttNetLogLevel.Error, exception, message, parameters);
+ }
+
+ public void Error(string message, params object[] parameters)
+ {
+ Warning(null, message, parameters);
+ }
+
+ private void Publish(MqttNetLogLevel logLevel, Exception exception, string message, object[] parameters)
+ {
+ var hasLocalListeners = LogMessagePublished != null;
+ var hasGlobalListeners = MqttNetGlobalLog.HasListeners;
+
+ if (!hasLocalListeners && !hasGlobalListeners)
{
return;
}
- var message = formatter(state, exception);
- var traceMessage = new MqttNetTraceMessage(DateTime.Now, Environment.CurrentManagedThreadId, _categoryName, logLevel, message, exception);
- _mqttNetTrace.Publish(traceMessage);
- }
-
- public bool IsEnabled(LogLevel logLevel)
- {
- return MqttNetTrace.HasListeners;
- }
-
- //not supported: async local requires netstandard1.3
- //for implementation see https://github.com/aspnet/Logging/blob/dev/src/Microsoft.Extensions.Logging.Console/ConsoleLogScope.cs
- public IDisposable BeginScope(TState state)
- {
- return new DisposableScope();
- }
-
- private class DisposableScope : IDisposable
- {
- public void Dispose()
+ if (parameters.Length > 0)
{
+ message = string.Format(message, parameters);
+ }
+
+ var traceMessage = new MqttNetLogMessage(_logId, DateTime.Now, Environment.CurrentManagedThreadId, typeof(TSource).Name, logLevel, message, exception);
+
+ if (hasGlobalListeners)
+ {
+ MqttNetGlobalLog.Publish(traceMessage);
+ }
+
+ if (hasLocalListeners)
+ {
+ LogMessagePublished?.Invoke(this, new MqttNetLogMessagePublishedEventArgs(traceMessage));
}
}
}
diff --git a/MQTTnet.Core/Diagnostics/MqttNetTrace.cs b/MQTTnet.Core/Diagnostics/MqttNetTrace.cs
deleted file mode 100644
index f75c7a9b..00000000
--- a/MQTTnet.Core/Diagnostics/MqttNetTrace.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using Microsoft.Extensions.Logging;
-
-namespace MQTTnet.Core.Diagnostics
-{
- public class MqttNetTrace : ILoggerProvider
- {
- private readonly ConcurrentDictionary _loggers = new ConcurrentDictionary();
-
- public static event EventHandler TraceMessagePublished;
-
- public static bool HasListeners => TraceMessagePublished != null;
-
- public void Publish(MqttNetTraceMessage traceMessage)
- {
- TraceMessagePublished?.Invoke(this, new MqttNetTraceMessagePublishedEventArgs(traceMessage));
- }
-
- public void Dispose()
- {
- TraceMessagePublished = null;
- }
-
- public ILogger CreateLogger(string categoryName)
- {
- return _loggers.GetOrAdd(categoryName, CreateLoggerImplementation);
- }
-
- private MqttNetLogger CreateLoggerImplementation(string categoryName)
- {
- return new MqttNetLogger(categoryName, this);
- }
- }
-}
diff --git a/MQTTnet.Core/Diagnostics/MqttNetTraceMessagePublishedEventArgs.cs b/MQTTnet.Core/Diagnostics/MqttNetTraceMessagePublishedEventArgs.cs
deleted file mode 100644
index 5b8f796d..00000000
--- a/MQTTnet.Core/Diagnostics/MqttNetTraceMessagePublishedEventArgs.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace MQTTnet.Core.Diagnostics
-{
- public sealed class MqttNetTraceMessagePublishedEventArgs : EventArgs
- {
- public MqttNetTraceMessagePublishedEventArgs(MqttNetTraceMessage traceMessage)
- {
- TraceMessage = traceMessage ?? throw new ArgumentNullException(nameof(traceMessage));
- }
-
- public MqttNetTraceMessage TraceMessage { get; }
- }
-}
diff --git a/MQTTnet.Core/MQTTnet.Core.csproj b/MQTTnet.Core/MQTTnet.Core.csproj
index d50466f1..60afc301 100644
--- a/MQTTnet.Core/MQTTnet.Core.csproj
+++ b/MQTTnet.Core/MQTTnet.Core.csproj
@@ -17,15 +17,9 @@
- 2.5.2.0
- 2.5.2.0
+ 2.5.3.0
+ 2.5.3.0
-
-
-
-
-
-
\ No newline at end of file
diff --git a/MQTTnet.Core/ManagedClient/ManagedMqttClient.cs b/MQTTnet.Core/ManagedClient/ManagedMqttClient.cs
index 4eb40b23..c2e40777 100644
--- a/MQTTnet.Core/ManagedClient/ManagedMqttClient.cs
+++ b/MQTTnet.Core/ManagedClient/ManagedMqttClient.cs
@@ -5,9 +5,9 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Client;
+using MQTTnet.Core.Diagnostics;
using MQTTnet.Core.Exceptions;
using MQTTnet.Core.Protocol;
-using Microsoft.Extensions.Logging;
namespace MQTTnet.Core.ManagedClient
{
@@ -18,7 +18,7 @@ namespace MQTTnet.Core.ManagedClient
private readonly HashSet _subscriptions = new HashSet();
private readonly IMqttClient _mqttClient;
- private readonly ILogger _logger;
+ private readonly IMqttNetLogger _logger;
private CancellationTokenSource _connectionCancellationToken;
private CancellationTokenSource _publishingCancellationToken;
@@ -26,7 +26,7 @@ namespace MQTTnet.Core.ManagedClient
private IManagedMqttClientOptions _options;
private bool _subscriptionsNotPushed;
- public ManagedMqttClient(ILogger logger, IMqttClient mqttClient)
+ public ManagedMqttClient(IMqttClient mqttClient, IMqttNetLogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
@@ -52,10 +52,7 @@ namespace MQTTnet.Core.ManagedClient
throw new NotSupportedException("The managed client does not support existing sessions.");
}
- if (_connectionCancellationToken != null)
- {
- throw new InvalidOperationException("The managed client is already started.");
- }
+ if (_connectionCancellationToken != null) throw new InvalidOperationException("The managed client is already started.");
_options = options;
await _storageManager.SetStorageAsync(_options.Storage).ConfigureAwait(false);
@@ -72,10 +69,10 @@ namespace MQTTnet.Core.ManagedClient
_connectionCancellationToken = new CancellationTokenSource();
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
- Task.Factory.StartNew(() => MaintainConnectionAsync(_connectionCancellationToken.Token), _connectionCancellationToken.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default).ConfigureAwait(false);
+ Task.Run(async () => await MaintainConnectionAsync(_connectionCancellationToken.Token), _connectionCancellationToken.Token).ConfigureAwait(false);
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
- _logger.LogInformation("Started");
+ _logger.Info("Started");
}
public Task StopAsync()
@@ -83,6 +80,9 @@ namespace MQTTnet.Core.ManagedClient
_connectionCancellationToken?.Cancel(false);
_connectionCancellationToken = null;
+ _publishingCancellationToken?.Cancel(false);
+ _publishingCancellationToken = null;
+
while (_messageQueue.Any())
{
_messageQueue.Take();
@@ -159,7 +159,7 @@ namespace MQTTnet.Core.ManagedClient
_publishingCancellationToken = new CancellationTokenSource();
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
- Task.Factory.StartNew(() => PublishQueuedMessagesAsync(_publishingCancellationToken.Token), _publishingCancellationToken.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default).ConfigureAwait(false);
+ Task.Run(async () => await PublishQueuedMessagesAsync(_publishingCancellationToken.Token), _publishingCancellationToken.Token).ConfigureAwait(false);
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
continue;
@@ -167,7 +167,7 @@ namespace MQTTnet.Core.ManagedClient
if (connectionState == ReconnectionResult.StillConnected)
{
- await Task.Delay(100, _connectionCancellationToken.Token).ConfigureAwait(false); // Consider using the _Disconnected_ event here. (TaskCompletionSource)
+ await Task.Delay(TimeSpan.FromSeconds(1), _connectionCancellationToken.Token).ConfigureAwait(false);
}
}
}
@@ -176,16 +176,16 @@ namespace MQTTnet.Core.ManagedClient
}
catch (MqttCommunicationException exception)
{
- _logger.LogWarning(new EventId(), exception, "Communication exception while maintaining connection.");
+ _logger.Warning(exception, "Communication exception while maintaining connection.");
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while maintaining connection.");
+ _logger.Error(exception, "Unhandled exception while maintaining connection.");
}
finally
{
await _mqttClient.DisconnectAsync().ConfigureAwait(false);
- _logger.LogInformation("Stopped");
+ _logger.Info("Stopped");
}
}
@@ -215,7 +215,7 @@ namespace MQTTnet.Core.ManagedClient
}
finally
{
- _logger.LogInformation("Stopped publishing messages");
+ _logger.Info("Stopped publishing messages");
}
}
@@ -227,7 +227,7 @@ namespace MQTTnet.Core.ManagedClient
}
catch (MqttCommunicationException exception)
{
- _logger.LogWarning(new EventId(), exception, "Publishing application message failed.");
+ _logger.Warning(exception, "Publishing application message failed.");
if (message.QualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
{
@@ -236,13 +236,13 @@ namespace MQTTnet.Core.ManagedClient
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while publishing queued application message.");
+ _logger.Error(exception, "Unhandled exception while publishing queued application message.");
}
}
private async Task PushSubscriptionsAsync()
{
- _logger.LogInformation(nameof(ManagedMqttClient), "Synchronizing subscriptions");
+ _logger.Info(nameof(ManagedMqttClient), "Synchronizing subscriptions");
List subscriptions;
lock (_subscriptions)
@@ -262,7 +262,7 @@ namespace MQTTnet.Core.ManagedClient
}
catch (Exception exception)
{
- _logger.LogWarning(new EventId(), exception, "Synchronizing subscriptions failed");
+ _logger.Warning(exception, "Synchronizing subscriptions failed");
_subscriptionsNotPushed = true;
}
}
diff --git a/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs b/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
deleted file mode 100644
index f4008998..00000000
--- a/MQTTnet.Core/Server/IMqttClientRetainedMessageManager.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using MQTTnet.Core.Packets;
-
-namespace MQTTnet.Core.Server
-{
- public interface IMqttClientRetainedMessageManager
- {
- Task LoadMessagesAsync();
-
- Task HandleMessageAsync(string clientId, MqttApplicationMessage applicationMessage);
-
- Task> GetSubscribedMessagesAsync(MqttSubscribePacket subscribePacket);
- }
-}
diff --git a/MQTTnet.Core/Server/IMqttClientSesssionFactory.cs b/MQTTnet.Core/Server/IMqttClientSesssionFactory.cs
deleted file mode 100644
index f58dd5e7..00000000
--- a/MQTTnet.Core/Server/IMqttClientSesssionFactory.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace MQTTnet.Core.Server
-{
- public interface IMqttClientSesssionFactory
- {
- MqttClientSession CreateClientSession(string sessionId, MqttClientSessionsManager mqttClientSessionsManager);
- }
-}
diff --git a/MQTTnet.Core/Server/IMqttServer.cs b/MQTTnet.Core/Server/IMqttServer.cs
index 8d860777..936e897e 100644
--- a/MQTTnet.Core/Server/IMqttServer.cs
+++ b/MQTTnet.Core/Server/IMqttServer.cs
@@ -12,7 +12,7 @@ namespace MQTTnet.Core.Server
Task> GetConnectedClientsAsync();
- Task StartAsync();
+ Task StartAsync(MqttServerOptions options);
Task StopAsync();
}
}
\ No newline at end of file
diff --git a/MQTTnet.Core/Server/IMqttServerFactory.cs b/MQTTnet.Core/Server/IMqttServerFactory.cs
index 500614b0..378dfb01 100644
--- a/MQTTnet.Core/Server/IMqttServerFactory.cs
+++ b/MQTTnet.Core/Server/IMqttServerFactory.cs
@@ -1,4 +1,6 @@
-using System;
+using System.Collections.Generic;
+using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Diagnostics;
namespace MQTTnet.Core.Server
{
@@ -6,6 +8,6 @@ namespace MQTTnet.Core.Server
{
IMqttServer CreateMqttServer();
- IMqttServer CreateMqttServer(Action configure);
+ IMqttServer CreateMqttServer(IEnumerable adapters, IMqttNetLogger logger);
}
}
\ No newline at end of file
diff --git a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
index 16c90944..bea60397 100644
--- a/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
+++ b/MQTTnet.Core/Server/MqttClientPendingMessagesQueue.cs
@@ -3,10 +3,10 @@ using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Diagnostics;
using MQTTnet.Core.Exceptions;
using MQTTnet.Core.Packets;
using MQTTnet.Core.Protocol;
-using Microsoft.Extensions.Logging;
namespace MQTTnet.Core.Server
{
@@ -15,16 +15,16 @@ namespace MQTTnet.Core.Server
private readonly BlockingCollection _pendingPublishPackets = new BlockingCollection();
private readonly MqttServerOptions _options;
private readonly MqttClientSession _session;
- private readonly ILogger _logger;
+ private readonly IMqttNetLogger _logger;
- public MqttClientPendingMessagesQueue(MqttServerOptions options, MqttClientSession session, ILogger logger)
+ public MqttClientPendingMessagesQueue(MqttServerOptions options, MqttClientSession session, IMqttNetLogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_session = session ?? throw new ArgumentNullException(nameof(session));
_options = options ?? throw new ArgumentNullException(nameof(options));
}
- public void Start(IMqttCommunicationAdapter adapter, CancellationToken cancellationToken)
+ public void Start(IMqttChannelAdapter adapter, CancellationToken cancellationToken)
{
if (adapter == null) throw new ArgumentNullException(nameof(adapter));
@@ -41,10 +41,10 @@ namespace MQTTnet.Core.Server
if (publishPacket == null) throw new ArgumentNullException(nameof(publishPacket));
_pendingPublishPackets.Add(publishPacket);
- _logger.LogTrace("Enqueued packet (ClientId: {0}).", _session.ClientId);
+ _logger.Trace("Enqueued packet (ClientId: {0}).", _session.ClientId);
}
- private async Task SendPendingPublishPacketsAsync(IMqttCommunicationAdapter adapter, CancellationToken cancellationToken)
+ private async Task SendPendingPublishPacketsAsync(IMqttChannelAdapter adapter, CancellationToken cancellationToken)
{
try
{
@@ -58,11 +58,11 @@ namespace MQTTnet.Core.Server
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while sending enqueued packet (ClientId: {0}).", _session.ClientId);
+ _logger.Error(exception, "Unhandled exception while sending enqueued packet (ClientId: {0}).", _session.ClientId);
}
}
- private async Task SendPendingPublishPacketAsync(IMqttCommunicationAdapter adapter, CancellationToken cancellationToken)
+ private async Task SendPendingPublishPacketAsync(IMqttChannelAdapter adapter, CancellationToken cancellationToken)
{
MqttPublishPacket packet = null;
try
@@ -70,24 +70,24 @@ namespace MQTTnet.Core.Server
packet = _pendingPublishPackets.Take(cancellationToken);
await adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, packet).ConfigureAwait(false);
- _logger.LogTrace("Enqueued packet sent (ClientId: {0}).", _session.ClientId);
+ _logger.Trace("Enqueued packet sent (ClientId: {0}).", _session.ClientId);
}
catch (Exception exception)
{
if (exception is MqttCommunicationTimedOutException)
{
- _logger.LogWarning(new EventId(), exception, "Sending publish packet failed due to timeout (ClientId: {0}).", _session.ClientId);
+ _logger.Warning(exception, "Sending publish packet failed due to timeout (ClientId: {0}).", _session.ClientId);
}
else if (exception is MqttCommunicationException)
{
- _logger.LogWarning(new EventId(), exception, "Sending publish packet failed due to communication exception (ClientId: {0}).", _session.ClientId);
+ _logger.Warning(exception, "Sending publish packet failed due to communication exception (ClientId: {0}).", _session.ClientId);
}
else if (exception is OperationCanceledException)
{
}
else
{
- _logger.LogError(new EventId(), exception, "Sending publish packet failed (ClientId: {0}).", _session.ClientId);
+ _logger.Error(exception, "Sending publish packet failed (ClientId: {0}).", _session.ClientId);
}
if (packet != null && packet.QualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
diff --git a/MQTTnet.Core/Server/MqttClientSession.cs b/MQTTnet.Core/Server/MqttClientSession.cs
index ad1416ed..3646c405 100644
--- a/MQTTnet.Core/Server/MqttClientSession.cs
+++ b/MQTTnet.Core/Server/MqttClientSession.cs
@@ -3,13 +3,12 @@ using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Diagnostics;
using MQTTnet.Core.Exceptions;
using MQTTnet.Core.Internal;
using MQTTnet.Core.Packets;
using MQTTnet.Core.Protocol;
using MQTTnet.Core.Serializer;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
namespace MQTTnet.Core.Server
{
@@ -21,28 +20,27 @@ namespace MQTTnet.Core.Server
private readonly MqttClientSessionsManager _sessionsManager;
private readonly MqttClientPendingMessagesQueue _pendingMessagesQueue;
private readonly MqttServerOptions _options;
- private readonly ILogger _logger;
+ private readonly IMqttNetLogger _logger;
- private IMqttCommunicationAdapter _adapter;
+ private IMqttChannelAdapter _adapter;
private CancellationTokenSource _cancellationTokenSource;
private MqttApplicationMessage _willMessage;
public MqttClientSession(
string clientId,
- IOptions options,
+ MqttServerOptions options,
MqttClientSessionsManager sessionsManager,
- MqttClientSubscriptionsManager subscriptionsManager,
- ILogger logger,
- ILogger messageQueueLogger)
+ IMqttNetLogger logger)
{
_sessionsManager = sessionsManager ?? throw new ArgumentNullException(nameof(sessionsManager));
- _subscriptionsManager = subscriptionsManager ?? throw new ArgumentNullException(nameof(subscriptionsManager));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
ClientId = clientId;
- _options = options.Value;
- _pendingMessagesQueue = new MqttClientPendingMessagesQueue(_options, this, messageQueueLogger);
+ _options = options;
+
+ _subscriptionsManager = new MqttClientSubscriptionsManager(_options);
+ _pendingMessagesQueue = new MqttClientPendingMessagesQueue(_options, this, _logger);
}
public string ClientId { get; }
@@ -51,7 +49,7 @@ namespace MQTTnet.Core.Server
public bool IsConnected => _adapter != null;
- public async Task RunAsync(MqttApplicationMessage willMessage, IMqttCommunicationAdapter adapter)
+ public async Task RunAsync(MqttApplicationMessage willMessage, IMqttChannelAdapter adapter)
{
if (adapter == null) throw new ArgumentNullException(nameof(adapter));
@@ -71,11 +69,11 @@ namespace MQTTnet.Core.Server
}
catch (MqttCommunicationException exception)
{
- _logger.LogWarning(new EventId(), exception, "Client '{0}': Communication exception while processing client packets.", ClientId);
+ _logger.Warning(exception, "Client '{0}': Communication exception while processing client packets.", ClientId);
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Client '{0}': Unhandled exception while processing client packets.", ClientId);
+ _logger.Error(exception, "Client '{0}': Unhandled exception while processing client packets.", ClientId);
}
}
@@ -93,7 +91,7 @@ namespace MQTTnet.Core.Server
_adapter = null;
}
- _logger.LogInformation("Client '{0}': Session stopped.", ClientId);
+ _logger.Info("Client '{0}': Session stopped.", ClientId);
}
finally
{
@@ -120,7 +118,7 @@ namespace MQTTnet.Core.Server
_pendingMessagesQueue.Enqueue(publishPacket);
}
- private async Task ReceivePacketsAsync(IMqttCommunicationAdapter adapter, CancellationToken cancellationToken)
+ private async Task ReceivePacketsAsync(IMqttChannelAdapter adapter, CancellationToken cancellationToken)
{
try
{
@@ -135,17 +133,17 @@ namespace MQTTnet.Core.Server
}
catch (MqttCommunicationException exception)
{
- _logger.LogWarning(new EventId(), exception, "Client '{0}': Communication exception while processing client packets.", ClientId);
+ _logger.Warning(exception, "Client '{0}': Communication exception while processing client packets.", ClientId);
await StopAsync();
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Client '{0}': Unhandled exception while processing client packets.", ClientId);
+ _logger.Error(exception, "Client '{0}': Unhandled exception while processing client packets.", ClientId);
await StopAsync();
}
}
- private Task ProcessReceivedPacketAsync(IMqttCommunicationAdapter adapter, MqttBasePacket packet, CancellationToken cancellationToken)
+ private Task ProcessReceivedPacketAsync(IMqttChannelAdapter adapter, MqttBasePacket packet, CancellationToken cancellationToken)
{
if (packet is MqttPingReqPacket)
{
@@ -188,11 +186,11 @@ namespace MQTTnet.Core.Server
return StopAsync();
}
- _logger.LogWarning("Client '{0}': Received not supported packet ({1}). Closing connection.", ClientId, packet);
+ _logger.Warning("Client '{0}': Received not supported packet ({1}). Closing connection.", ClientId, packet);
return StopAsync();
}
- private async Task HandleIncomingSubscribePacketAsync(IMqttCommunicationAdapter adapter, MqttSubscribePacket subscribePacket, CancellationToken cancellationToken)
+ private async Task HandleIncomingSubscribePacketAsync(IMqttChannelAdapter adapter, MqttSubscribePacket subscribePacket, CancellationToken cancellationToken)
{
var subscribeResult = _subscriptionsManager.Subscribe(subscribePacket, ClientId);
@@ -215,7 +213,7 @@ namespace MQTTnet.Core.Server
}
}
- private async Task HandleIncomingPublishPacketAsync(IMqttCommunicationAdapter adapter, MqttPublishPacket publishPacket, CancellationToken cancellationToken)
+ private async Task HandleIncomingPublishPacketAsync(IMqttChannelAdapter adapter, MqttPublishPacket publishPacket, CancellationToken cancellationToken)
{
var applicationMessage = publishPacket.ToApplicationMessage();
@@ -255,7 +253,7 @@ namespace MQTTnet.Core.Server
}
}
- private Task HandleIncomingPubRelPacketAsync(IMqttCommunicationAdapter adapter, MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken)
+ private Task HandleIncomingPubRelPacketAsync(IMqttChannelAdapter adapter, MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken)
{
lock (_unacknowledgedPublishPackets)
{
diff --git a/MQTTnet.Core/Server/MqttClientSessionsManager.cs b/MQTTnet.Core/Server/MqttClientSessionsManager.cs
index 80722ab7..63235220 100644
--- a/MQTTnet.Core/Server/MqttClientSessionsManager.cs
+++ b/MQTTnet.Core/Server/MqttClientSessionsManager.cs
@@ -4,13 +4,12 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
+using MQTTnet.Core.Diagnostics;
using MQTTnet.Core.Exceptions;
using MQTTnet.Core.Internal;
using MQTTnet.Core.Packets;
using MQTTnet.Core.Protocol;
using MQTTnet.Core.Serializer;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
namespace MQTTnet.Core.Server
{
@@ -20,27 +19,21 @@ namespace MQTTnet.Core.Server
private readonly SemaphoreSlim _sessionsSemaphore = new SemaphoreSlim(1, 1);
private readonly MqttServerOptions _options;
- private readonly ILogger _logger;
- private readonly IMqttClientSesssionFactory _clientSesssionFactory;
- private readonly IMqttClientRetainedMessageManager _clientRetainedMessageManager;
+ private readonly MqttRetainedMessagesManager _retainedMessagesManager;
+ private readonly IMqttNetLogger _logger;
- public MqttClientSessionsManager(
- IOptions options,
- ILogger logger,
- IMqttClientSesssionFactory clientSesssionFactory,
- IMqttClientRetainedMessageManager clientRetainedMessageManager)
+ public MqttClientSessionsManager(MqttServerOptions options, MqttRetainedMessagesManager retainedMessagesManager, IMqttNetLogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _options = options.Value ?? throw new ArgumentNullException(nameof(options));
- _clientSesssionFactory = clientSesssionFactory ?? throw new ArgumentNullException(nameof(clientSesssionFactory));
- _clientRetainedMessageManager = clientRetainedMessageManager ?? throw new ArgumentNullException(nameof(clientRetainedMessageManager));
+ _options = options ?? throw new ArgumentNullException(nameof(options));
+ _retainedMessagesManager = retainedMessagesManager ?? throw new ArgumentNullException(nameof(retainedMessagesManager));
}
public event EventHandler ClientConnected;
public event EventHandler ClientDisconnected;
public event EventHandler ApplicationMessageReceived;
- public async Task RunClientSessionAsync(IMqttCommunicationAdapter clientAdapter, CancellationToken cancellationToken)
+ public async Task RunClientSessionAsync(IMqttChannelAdapter clientAdapter, CancellationToken cancellationToken)
{
var clientId = string.Empty;
try
@@ -80,14 +73,11 @@ namespace MQTTnet.Core.Server
ProtocolVersion = clientAdapter.PacketSerializer.ProtocolVersion
}));
- using (_logger.BeginScope(clientId))
- {
- await clientSession.Session.RunAsync(connectPacket.WillMessage, clientAdapter).ConfigureAwait(false);
- }
+ await clientSession.Session.RunAsync(connectPacket.WillMessage, clientAdapter).ConfigureAwait(false);
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, exception.Message);
+ _logger.Error(exception, exception.Message);
}
finally
{
@@ -157,7 +147,7 @@ namespace MQTTnet.Core.Server
if (applicationMessage.Retain)
{
- await _clientRetainedMessageManager.HandleMessageAsync(senderClientSession?.ClientId, applicationMessage).ConfigureAwait(false);
+ await _retainedMessagesManager.HandleMessageAsync(senderClientSession?.ClientId, applicationMessage).ConfigureAwait(false);
}
var eventArgs = new MqttApplicationMessageReceivedEventArgs(senderClientSession?.ClientId, applicationMessage);
@@ -165,7 +155,7 @@ namespace MQTTnet.Core.Server
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Error while processing application message");
+ _logger.Error(exception, "Error while processing application message");
}
lock (_sessions)
@@ -179,7 +169,7 @@ namespace MQTTnet.Core.Server
public Task> GetRetainedMessagesAsync(MqttSubscribePacket subscribePacket)
{
- return _clientRetainedMessageManager.GetSubscribedMessagesAsync(subscribePacket);
+ return _retainedMessagesManager.GetSubscribedMessagesAsync(subscribePacket);
}
private MqttConnectReturnCode ValidateConnection(MqttConnectPacket connectPacket)
@@ -206,11 +196,11 @@ namespace MQTTnet.Core.Server
await clientSession.StopAsync();
clientSession = null;
- _logger.LogTrace("Stopped existing session of client '{0}'.", connectPacket.ClientId);
+ _logger.Trace("Stopped existing session of client '{0}'.", connectPacket.ClientId);
}
else
{
- _logger.LogTrace("Reusing existing session of client '{0}'.", connectPacket.ClientId);
+ _logger.Trace("Reusing existing session of client '{0}'.", connectPacket.ClientId);
}
}
@@ -219,10 +209,10 @@ namespace MQTTnet.Core.Server
{
isExistingSession = false;
- clientSession = _clientSesssionFactory.CreateClientSession(connectPacket.ClientId, this);
+ clientSession = new MqttClientSession(connectPacket.ClientId, _options, this, _logger);
_sessions[connectPacket.ClientId] = clientSession;
- _logger.LogTrace("Created a new session for client '{0}'.", connectPacket.ClientId);
+ _logger.Trace("Created a new session for client '{0}'.", connectPacket.ClientId);
}
return new GetOrCreateClientSessionResult { IsExistingSession = isExistingSession, Session = clientSession };
diff --git a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs
index 5af3a2de..8801c012 100644
--- a/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs
+++ b/MQTTnet.Core/Server/MqttClientSubscriptionsManager.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using Microsoft.Extensions.Options;
using MQTTnet.Core.Packets;
using MQTTnet.Core.Protocol;
@@ -11,9 +10,9 @@ namespace MQTTnet.Core.Server
private readonly Dictionary _subscriptions = new Dictionary();
private readonly MqttServerOptions _options;
- public MqttClientSubscriptionsManager(IOptions options)
+ public MqttClientSubscriptionsManager(MqttServerOptions options)
{
- _options = options?.Value ?? throw new ArgumentNullException(nameof(options));
+ _options = options ?? throw new ArgumentNullException(nameof(options));
}
public MqttClientSubscribeResult Subscribe(MqttSubscribePacket subscribePacket, string clientId)
diff --git a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs b/MQTTnet.Core/Server/MqttRetainedMessagesManager.cs
similarity index 80%
rename from MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
rename to MQTTnet.Core/Server/MqttRetainedMessagesManager.cs
index 5fe8522c..cf667236 100644
--- a/MQTTnet.Core/Server/MqttClientRetainedMessagesManager.cs
+++ b/MQTTnet.Core/Server/MqttRetainedMessagesManager.cs
@@ -4,22 +4,21 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Packets;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
+using MQTTnet.Core.Diagnostics;
namespace MQTTnet.Core.Server
{
- public sealed class MqttClientRetainedMessagesManager : IMqttClientRetainedMessageManager
+ public sealed class MqttRetainedMessagesManager
{
private readonly Dictionary _retainedMessages = new Dictionary();
private readonly SemaphoreSlim _gate = new SemaphoreSlim(1, 1);
- private readonly ILogger _logger;
+ private readonly IMqttNetLogger _logger;
private readonly MqttServerOptions _options;
- public MqttClientRetainedMessagesManager(IOptions options, ILogger logger)
+ public MqttRetainedMessagesManager(MqttServerOptions options, IMqttNetLogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _options = options.Value ?? throw new ArgumentNullException(nameof(options));
+ _options = options ?? throw new ArgumentNullException(nameof(options));
}
public async Task LoadMessagesAsync()
@@ -42,7 +41,7 @@ namespace MQTTnet.Core.Server
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while loading retained messages.");
+ _logger.Error(exception, "Unhandled exception while loading retained messages.");
}
finally
{
@@ -61,7 +60,7 @@ namespace MQTTnet.Core.Server
}
catch (Exception exception)
{
- _logger.LogError(new EventId(), exception, "Unhandled exception while handling retained messages.");
+ _logger.Error(exception, "Unhandled exception while handling retained messages.");
}
finally
{
@@ -110,7 +109,7 @@ namespace MQTTnet.Core.Server
if (applicationMessage.Payload?.Any() == false)
{
saveIsRequired = _retainedMessages.Remove(applicationMessage.Topic);
- _logger.LogInformation("Client '{0}' cleared retained message for topic '{1}'.", clientId, applicationMessage.Topic);
+ _logger.Info("Client '{0}' cleared retained message for topic '{1}'.", clientId, applicationMessage.Topic);
}
else
{
@@ -129,12 +128,12 @@ namespace MQTTnet.Core.Server
}
}
- _logger.LogInformation("Client '{0}' set retained message for topic '{1}'.", clientId, applicationMessage.Topic);
+ _logger.Info("Client '{0}' set retained message for topic '{1}'.", clientId, applicationMessage.Topic);
}
if (!saveIsRequired)
{
- _logger.LogTrace("Skipped saving retained messages because no changes were detected.");
+ _logger.Trace("Skipped saving retained messages because no changes were detected.");
}
if (saveIsRequired && _options.Storage != null)
diff --git a/MQTTnet.Core/Server/MqttServer.cs b/MQTTnet.Core/Server/MqttServer.cs
index c671907e..f9349284 100644
--- a/MQTTnet.Core/Server/MqttServer.cs
+++ b/MQTTnet.Core/Server/MqttServer.cs
@@ -3,33 +3,24 @@ using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Core.Adapter;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
using System.Linq;
+using MQTTnet.Core.Diagnostics;
namespace MQTTnet.Core.Server
{
public class MqttServer : IMqttServer
{
- private readonly IMqttClientRetainedMessageManager _clientRetainedMessageManager;
- private readonly ILogger _logger;
- private readonly MqttClientSessionsManager _clientSessionsManager;
private readonly ICollection _adapters;
- private readonly MqttServerOptions _options;
+ private readonly IMqttNetLogger _logger;
+ private MqttClientSessionsManager _clientSessionsManager;
+ private MqttRetainedMessagesManager _retainedMessagesManager;
private CancellationTokenSource _cancellationTokenSource;
+ private MqttServerOptions _options;
- public MqttServer(
- IOptions options,
- IEnumerable adapters,
- ILogger logger,
- MqttClientSessionsManager clientSessionsManager,
- IMqttClientRetainedMessageManager clientRetainedMessageManager)
+ public MqttServer(IEnumerable adapters, IMqttNetLogger logger)
{
- _options = options.Value ?? throw new ArgumentNullException(nameof(options));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _clientSessionsManager = clientSessionsManager ?? throw new ArgumentNullException(nameof(clientSessionsManager));
- _clientRetainedMessageManager = clientRetainedMessageManager ?? throw new ArgumentNullException(nameof(clientRetainedMessageManager));
if (adapters == null)
{
@@ -37,15 +28,6 @@ namespace MQTTnet.Core.Server
}
_adapters = adapters.ToList();
-
- _clientSessionsManager.ApplicationMessageReceived += (s, e) => ApplicationMessageReceived?.Invoke(s, e);
- _clientSessionsManager.ClientConnected += OnClientConnected;
- _clientSessionsManager.ClientDisconnected += OnClientDisconnected;
- }
-
- public Task