Migrate retained messages to the event based approach.

This commit is contained in:
Christian
2021-11-01 11:20:46 +01:00
parent 9ab85b3592
commit 22ccdf10c6
57 changed files with 451 additions and 666 deletions
@@ -110,7 +110,7 @@ namespace MQTTnet.Tests.Client
await Task.Delay(500);
Assert.AreEqual(0, (await server.GetClientStatusAsync()).Count);
Assert.AreEqual(0, (await server.GetClientsAsync()).Count);
}
}
@@ -27,7 +27,7 @@ namespace MQTTnet.Tests.Client
var client = await testEnvironment.ConnectLowLevelClient();
var i = 0;
server.InterceptingClientPublishAsync += c =>
server.InterceptingPublishAsync += c =>
{
i++;
return Task.CompletedTask;
@@ -766,8 +766,8 @@ namespace MQTTnet.Tests.Client
await Task.Delay(500);
var clientStatus = await testEnvironment.Server.GetClientStatusAsync();
var sessionStatus = await testEnvironment.Server.GetSessionStatusAsync();
var clientStatus = await testEnvironment.Server.GetClientsAsync();
var sessionStatus = await testEnvironment.Server.GetSessionsAsync();
for (var i = 0; i < 98; i++)
{
@@ -1,17 +1,14 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Client;
using MQTTnet.Formatter;
using MQTTnet.Tests.Mockups;
using System.Threading;
using System.Threading.Tasks;
namespace MQTTnet.Tests.MQTTv5
{
[TestClass]
public class Server_Tests : BaseTestClass
public sealed class Server_Tests : BaseTestClass
{
public TestContext TestContext { get; set; }
[TestMethod]
public async Task Will_Message_Send()
{
@@ -46,7 +43,7 @@ namespace MQTTnet.Tests.MQTTv5
[TestMethod]
public async Task Validate_IsSessionPresent()
{
using (var testEnvironment = new TestEnvironment(TestContext))
using (var testEnvironment = CreateTestEnvironment())
{
// Create server with persistent sessions enabled
@@ -84,7 +81,6 @@ namespace MQTTnet.Tests.MQTTv5
.WithClientId(ClientId)
.Build();
var result = await client2.ConnectAsync(options).ConfigureAwait(false);
await client2.DisconnectAsync();
@@ -181,7 +181,7 @@ namespace MQTTnet.Tests.Mockups
Server = Factory.CreateMqttServer(options, ServerLogger);
Server.ValidatingClientConnectionAsync += e =>
Server.ValidatingConnectionAsync += e =>
{
if (TestContext != null)
{
@@ -1,22 +0,0 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using MQTTnet.Server;
namespace MQTTnet.Tests.Mockups
{
public class TestServerStorage : IMqttServerStorage
{
public IList<MqttApplicationMessage> Messages = new List<MqttApplicationMessage>();
public Task SaveRetainedMessagesAsync(IList<MqttApplicationMessage> messages)
{
Messages = messages;
return Task.CompletedTask;
}
public Task<IList<MqttApplicationMessage>> LoadRetainedMessagesAsync()
{
return Task.FromResult(Messages);
}
}
}
@@ -34,7 +34,7 @@ namespace MQTTnet.Tests.Server
var disconnectedMre = new ManualResetEventSlim();
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
if (string.IsNullOrEmpty(e.ClientId))
{
@@ -18,7 +18,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttServerClientConnectedEventArgs eventArgs = null;
ClientConnectedEventArgs eventArgs = null;
server.ClientConnectedAsync += e =>
{
eventArgs = e;
@@ -45,7 +45,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttServerClientDisconnectedEventArgs eventArgs = null;
ClientDisconnectedEventArgs eventArgs = null;
server.ClientDisconnectedAsync += e =>
{
eventArgs = e;
@@ -72,7 +72,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttServerClientSubscribedTopicEventArgs eventArgs = null;
ClientSubscribedTopicEventArgs eventArgs = null;
server.ClientSubscribedTopicAsync += e =>
{
eventArgs = e;
@@ -99,7 +99,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttServerClientUnsubscribedTopicEventArgs eventArgs = null;
ClientUnsubscribedTopicEventArgs eventArgs = null;
server.ClientUnsubscribedTopicAsync += e =>
{
eventArgs = e;
@@ -125,8 +125,8 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
InterceptingMqttClientPublishEventArgs eventArgs = null;
server.InterceptingClientPublishAsync += e =>
InterceptingPublishEventArgs eventArgs = null;
server.InterceptingPublishAsync += e =>
{
eventArgs = e;
return Task.CompletedTask;
+22 -17
View File
@@ -512,7 +512,7 @@ namespace MQTTnet.Tests.Server
await Task.Delay(1000);
var retainedMessages = await server.GetRetainedApplicationMessagesAsync();
var retainedMessages = await server.GetRetainedMessagesAsync();
Assert.AreEqual(ClientCount, retainedMessages.Count);
@@ -530,7 +530,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.InterceptingClientPublishAsync += e =>
server.InterceptingPublishAsync += e =>
{
e.ApplicationMessage = new MqttApplicationMessage {Topic = "new_topic"};
@@ -557,19 +557,24 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task Persist_Retained_Message()
{
var serverStorage = new TestServerStorage();
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithStorage(serverStorage));
List<MqttApplicationMessage> savedRetainedMessages = null;
var s = await testEnvironment.StartServer();
s.RetainedMessageChangedAsync += e =>
{
savedRetainedMessages = e.StoredRetainedMessages;
return Task.CompletedTask;
};
var c1 = await testEnvironment.ConnectClient();
await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build());
await Task.Delay(500);
Assert.AreEqual(1, serverStorage.Messages.Count);
Assert.AreEqual(1, savedRetainedMessages?.Count);
}
}
@@ -617,7 +622,7 @@ namespace MQTTnet.Tests.Server
using (var testEnvironment = CreateTestEnvironment())
{
var server = await testEnvironment.StartServer();
server.InterceptingClientPublishAsync += e =>
server.InterceptingPublishAsync += e =>
{
e.ApplicationMessage.Payload = Encoding.ASCII.GetBytes("extended");
return Task.CompletedTask;
@@ -698,7 +703,7 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
e.ReasonCode = MqttConnectReasonCode.NotAuthorized;
return Task.CompletedTask;
@@ -711,7 +716,7 @@ namespace MQTTnet.Tests.Server
Dictionary<string, bool> _connected;
void ConnectionValidationHandler(ValidatingMqttClientConnectionEventArgs eventArgs)
void ConnectionValidationHandler(ValidatingConnectionEventArgs eventArgs)
{
if (_connected.ContainsKey(eventArgs.ClientId))
{
@@ -734,7 +739,7 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
ConnectionValidationHandler(e);
return Task.CompletedTask;
@@ -923,12 +928,12 @@ namespace MQTTnet.Tests.Server
var clientOptions = new MqttClientOptionsBuilder();
var c1 = await testEnvironment.ConnectClient(clientOptions);
await Task.Delay(500);
Assert.AreEqual(1, (await server.GetClientStatusAsync()).Count);
Assert.AreEqual(1, (await server.GetClientsAsync()).Count);
await c1.DisconnectAsync();
await Task.Delay(500);
Assert.AreEqual(0, (await server.GetClientStatusAsync()).Count);
Assert.AreEqual(0, (await server.GetClientsAsync()).Count);
}
}
@@ -965,7 +970,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
server.InterceptingSubscriptionAsync += e =>
{
// This should lead to no subscriptions for "n" at all. So also no sending of retained messages.
if (e.TopicFilter.Topic == "n")
@@ -1021,7 +1026,7 @@ namespace MQTTnet.Tests.Server
await client1.DisconnectAsync();
await Task.Delay(500);
var clientStatus = await server.GetClientStatusAsync();
var clientStatus = await server.GetClientsAsync();
Assert.AreEqual(0, clientStatus.Count);
var client2 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("b"));
@@ -1032,8 +1037,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
clientStatus = await server.GetClientStatusAsync();
var sessionStatus = await server.GetSessionStatusAsync();
clientStatus = await server.GetClientsAsync();
var sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(0, clientStatus.Count);
Assert.AreEqual(2, sessionStatus.Count);
@@ -2,6 +2,7 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Diagnostics;
using MQTTnet.Packets;
using MQTTnet.Protocol;
using MQTTnet.Server;
@@ -12,19 +13,37 @@ namespace MQTTnet.Tests.Server
[TestClass]
public sealed class MqttSubscriptionsManager_Tests : BaseTestClass
{
MqttClientSubscriptionsManager _subscriptionsManager;
[TestInitialize]
public void TestInitialize()
{
var logger = new TestLogger();
var options = new MqttServerOptions();
var retainedMessagesManager = new MqttRetainedMessagesManager(new MqttServerEventContainer(), logger);
var eventContainer = new MqttServerEventContainer();
var session = new MqttSession(
"",
new ConcurrentDictionary<object, object>(),
options,
eventContainer,
retainedMessagesManager,
new MqttClientSessionsManager(options, retainedMessagesManager, eventContainer, logger));
_subscriptionsManager = new MqttClientSubscriptionsManager(session, new MqttServerOptions(), new MqttServerEventContainer(),
new MqttRetainedMessagesManager(new MqttServerEventContainer(), new MqttNetNullLogger()));
}
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeSingleSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "");
var result = _subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "");
Assert.IsTrue(result.IsSubscribed);
Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
}
@@ -32,16 +51,12 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeDifferentQoSSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilter { Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
sp.TopicFilters.Add(new MqttTopicFilter {Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce});
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");
var result = _subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");
Assert.IsTrue(result.IsSubscribed);
Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
}
@@ -49,17 +64,13 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeTwoTimesSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilter { Topic = "#", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
sp.TopicFilters.Add(new MqttTopicFilter { Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
sp.TopicFilters.Add(new MqttTopicFilter {Topic = "#", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce});
sp.TopicFilters.Add(new MqttTopicFilter {Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce});
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");
var result = _subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");
Assert.IsTrue(result.IsSubscribed);
Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtLeastOnce);
}
@@ -67,53 +78,29 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeSingleNoSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
Assert.IsFalse(sm.CheckSubscriptions("A/B/X", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
Assert.IsFalse(_subscriptionsManager.CheckSubscriptions("A/B/X", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
}
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeAndUnsubscribeSingle()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
Assert.IsTrue(sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
Assert.IsTrue(_subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
var up = new MqttUnsubscribePacket();
up.TopicFilters.Add("A/B/C");
await sm.Unsubscribe(up, CancellationToken.None);
await _subscriptionsManager.Unsubscribe(up, CancellationToken.None);
Assert.IsFalse(sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
}
MqttClientSession CreateSession()
{
var logger = new TestLogger();
var options = new MqttServerOptions();
var retainedMessagesManager = new MqttRetainedMessagesManager();
var eventContainer = new MqttServerEventContainer();
return new MqttClientSession(
"",
new ConcurrentDictionary<object, object>(),
options,
eventContainer,
retainedMessagesManager,
new MqttClientSessionsManager(options, retainedMessagesManager, eventContainer, logger));
Assert.IsFalse(_subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
}
}
}
}
@@ -61,7 +61,7 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
if (e.Username != "UserName1")
{
@@ -19,7 +19,7 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
e.ReasonCode = MqttConnectReasonCode.ServerMoved;
e.ServerReference = "new_server";
@@ -20,7 +20,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
// Don't validate anything. Just set some session items.
e.SessionItems["can_subscribe_x"] = true;
@@ -29,7 +29,7 @@ namespace MQTTnet.Tests.Server
return Task.CompletedTask;
};
server.InterceptingClientSubscriptionAsync += e =>
server.InterceptingSubscriptionAsync += e =>
{
if (e.TopicFilter.Topic == "x")
{
@@ -42,7 +42,7 @@ namespace MQTTnet.Tests.Server
return Task.CompletedTask;
};
server.InterceptingClientPublishAsync += e =>
server.InterceptingPublishAsync += e =>
{
e.ApplicationMessage.Payload =
Encoding.UTF8.GetBytes(
@@ -80,7 +80,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
// Don't validate anything. Just set some session items.
e.SessionItems["can_subscribe_x"] = true;
@@ -91,7 +91,7 @@ namespace MQTTnet.Tests.Server
await testEnvironment.ConnectClient();
var sessionStatus = await testEnvironment.Server.GetSessionStatusAsync();
var sessionStatus = await testEnvironment.Server.GetSessionsAsync();
var session = sessionStatus.First();
Assert.AreEqual(true, session.Items["can_subscribe_x"]);
@@ -128,7 +128,7 @@ namespace MQTTnet.Tests.Server
var client = await testEnvironment.ConnectClient();
// Arrange session status tracking.
var status = await server.GetSessionStatusAsync();
var status = await server.GetSessionsAsync();
var clientStatus = status[0];
var deletedEventFired = false;
@@ -158,7 +158,7 @@ namespace MQTTnet.Tests.Server
var messageReceivedHandler = testEnvironment.CreateApplicationMessageHandler(client);
// Arrange session status tracking.
var status = await server.GetSessionStatusAsync();
var status = await server.GetSessionsAsync();
var clientStatus = status[0];
// Act: Inject the application message.
+12 -12
View File
@@ -23,8 +23,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
var clientStatus = await server.GetClientStatusAsync();
var sessionStatus = await server.GetSessionStatusAsync();
var clientStatus = await server.GetClientsAsync();
var sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(2, clientStatus.Count);
Assert.AreEqual(2, sessionStatus.Count);
@@ -37,8 +37,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
clientStatus = await server.GetClientStatusAsync();
sessionStatus = await server.GetSessionStatusAsync();
clientStatus = await server.GetClientsAsync();
sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(0, clientStatus.Count);
Assert.AreEqual(0, sessionStatus.Count);
@@ -56,7 +56,7 @@ namespace MQTTnet.Tests.Server
await Task.Delay(1000);
var clientStatus = await server.GetClientStatusAsync();
var clientStatus = await server.GetClientsAsync();
Assert.AreEqual(1, clientStatus.Count);
Assert.IsTrue(clientStatus.Any(s => s.ClientId == c1.Options.ClientId));
@@ -67,7 +67,7 @@ namespace MQTTnet.Tests.Server
Assert.IsFalse(c1.IsConnected);
clientStatus = await server.GetClientStatusAsync();
clientStatus = await server.GetClientsAsync();
Assert.AreEqual(0, clientStatus.Count);
}
@@ -87,8 +87,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
var clientStatus = await server.GetClientStatusAsync();
var sessionStatus = await server.GetSessionStatusAsync();
var clientStatus = await server.GetClientsAsync();
var sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(1, clientStatus.Count);
Assert.AreEqual(2, sessionStatus.Count);
@@ -97,8 +97,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
clientStatus = await server.GetClientStatusAsync();
sessionStatus = await server.GetSessionStatusAsync();
clientStatus = await server.GetClientsAsync();
sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(0, clientStatus.Count);
Assert.AreEqual(2, sessionStatus.Count);
@@ -119,7 +119,7 @@ namespace MQTTnet.Tests.Server
await c1.PublishAsync("a");
await Task.Delay(50);
var clientStatus = await server.GetClientStatusAsync();
var clientStatus = await server.GetClientsAsync();
Assert.AreEqual(i, clientStatus.First().SentApplicationMessagesCount);
Assert.AreEqual(0, clientStatus.First().ReceivedApplicationMessagesCount);
}
@@ -143,7 +143,7 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
var clientStatus = await server.GetClientStatusAsync();
var clientStatus = await server.GetClientsAsync();
Assert.AreEqual(i, clientStatus.First().SentApplicationMessagesCount, "SAMC invalid!");
@@ -20,7 +20,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
server.InterceptingSubscriptionAsync += e =>
{
// Set the topic to "a" regards what the client wants to subscribe.
e.TopicFilter.Topic = "a";
@@ -290,7 +290,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
server.InterceptingSubscriptionAsync += e =>
{
if (e.TopicFilter.Topic == "not_allowed_topic")
{
-33
View File
@@ -134,39 +134,6 @@ namespace MQTTnet.TestApp.NetCore
}
}
public class RetainedMessageHandler : IMqttServerStorage
{
const string Filename = "C:\\MQTT\\RetainedMessages.json";
public Task SaveRetainedMessagesAsync(IList<MqttApplicationMessage> messages)
{
var directory = Path.GetDirectoryName(Filename);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
File.WriteAllText(Filename, JsonConvert.SerializeObject(messages));
return Task.FromResult(0);
}
public Task<IList<MqttApplicationMessage>> LoadRetainedMessagesAsync()
{
IList<MqttApplicationMessage> retainedMessages;
if (File.Exists(Filename))
{
var json = File.ReadAllText(Filename);
retainedMessages = JsonConvert.DeserializeObject<List<MqttApplicationMessage>>(json);
}
else
{
retainedMessages = new List<MqttApplicationMessage>();
}
return Task.FromResult(retainedMessages);
}
}
public class WikiCode
{
public void Code()
+47 -8
View File
@@ -1,10 +1,14 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using MQTTnet.Diagnostics;
using MQTTnet.Extensions.ManagedClient;
using MQTTnet.Implementations;
using MQTTnet.Protocol;
using MQTTnet.Server;
using Newtonsoft.Json;
namespace MQTTnet.TestApp.NetCore
{
@@ -36,10 +40,7 @@ namespace MQTTnet.TestApp.NetCore
{
try
{
var options = new MqttServerOptions
{
Storage = new RetainedMessageHandler()
};
var options = new MqttServerOptions();
// Extend the timestamp for all messages from clients.
// Protect several topics from being subscribed from every client.
@@ -52,7 +53,45 @@ namespace MQTTnet.TestApp.NetCore
var mqttServer = new MqttFactory().CreateMqttServer(options);
mqttServer.InterceptingClientPublishAsync += e =>
const string Filename = "C:\\MQTT\\RetainedMessages.json";
mqttServer.RetainedMessageChangedAsync += e =>
{
var directory = Path.GetDirectoryName(Filename);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
File.WriteAllText(Filename, JsonConvert.SerializeObject(e.StoredRetainedMessages));
return Task.FromResult(0);
};
mqttServer.RetainedMessagesClearedAsync += e =>
{
File.Delete(Filename);
return Task.FromResult(0);
};
mqttServer.LoadingRetainedMessageAsync += e =>
{
List<MqttApplicationMessage> retainedMessages;
if (File.Exists(Filename))
{
var json = File.ReadAllText(Filename);
retainedMessages = JsonConvert.DeserializeObject<List<MqttApplicationMessage>>(json);
}
else
{
retainedMessages = new List<MqttApplicationMessage>();
}
e.StoredRetainedMessages = retainedMessages;
return Task.FromResult(0);
};
mqttServer.InterceptingPublishAsync += e =>
{
if (MqttTopicFilterComparer.Compare(e.ApplicationMessage.Topic, "/myTopic/WithTimestamp/#") == MqttTopicFilterCompareResult.IsMatch)
{
@@ -70,7 +109,7 @@ namespace MQTTnet.TestApp.NetCore
return PlatformAbstractionLayer.CompletedTask;
};
mqttServer.ValidatingClientConnectionAsync += e =>
mqttServer.ValidatingConnectionAsync += e =>
{
if (e.ClientId == "SpecialClient")
{
@@ -83,7 +122,7 @@ namespace MQTTnet.TestApp.NetCore
return PlatformAbstractionLayer.CompletedTask;
};
mqttServer.InterceptingClientSubscriptionAsync += e =>
mqttServer.InterceptingSubscriptionAsync += e =>
{
if (e.TopicFilter.Topic.StartsWith("admin/foo/bar") && e.ClientId != "theAdmin")
{
@@ -99,7 +138,7 @@ namespace MQTTnet.TestApp.NetCore
return PlatformAbstractionLayer.CompletedTask;
};
mqttServer.InterceptingClientPublishAsync += e =>
mqttServer.InterceptingPublishAsync += e =>
{
MqttNetConsoleLogger.PrintToConsole(
$"'{e.ClientId}' reported '{e.ApplicationMessage.Topic}' > '{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}'",