From 560e80455ff40dbf4b4724dd58f1b4edb2398625 Mon Sep 17 00:00:00 2001 From: Christian <6939810+chkr1011@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:32:28 +0200 Subject: [PATCH] Update samples (#1768) --- .../Server_Retained_Messages_Samples.cs | 66 ++++++++++++++++++- .../Implementations/MqttWebSocketChannel.cs | 3 +- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/Samples/Server/Server_Retained_Messages_Samples.cs b/Samples/Server/Server_Retained_Messages_Samples.cs index e392460f..631dd996 100644 --- a/Samples/Server/Server_Retained_Messages_Samples.cs +++ b/Samples/Server/Server_Retained_Messages_Samples.cs @@ -7,6 +7,8 @@ // ReSharper disable InconsistentNaming using System.Text.Json; +using MQTTnet.Packets; +using MQTTnet.Protocol; namespace MQTTnet.Samples.Server; @@ -32,7 +34,10 @@ public static class Server_Retained_Messages_Samples { try { - eventArgs.LoadedRetainedMessages = await JsonSerializer.DeserializeAsync>(File.OpenRead(storePath)); + var models = await JsonSerializer.DeserializeAsync>(File.OpenRead(storePath)) ?? new List(); + var retainedMessages = models.Select(m => m.ToApplicationMessage()).ToList(); + + eventArgs.LoadedRetainedMessages = retainedMessages; Console.WriteLine("Retained messages loaded."); } catch (FileNotFoundException) @@ -56,7 +61,9 @@ public static class Server_Retained_Messages_Samples // used to write all retained messages to dedicated files etc. Then all files must be loaded and a full list // of retained messages must be provided in the loaded event. - var buffer = JsonSerializer.SerializeToUtf8Bytes(eventArgs.StoredRetainedMessages); + var models = eventArgs.StoredRetainedMessages.Select(MqttRetainedMessageModel.Create); + + var buffer = JsonSerializer.SerializeToUtf8Bytes(models); await File.WriteAllBytesAsync(storePath, buffer); Console.WriteLine("Retained messages saved."); } @@ -79,4 +86,59 @@ public static class Server_Retained_Messages_Samples Console.ReadLine(); } } + + sealed class MqttRetainedMessageModel + { + public string? ContentType { get; set; } + public byte[]? CorrelationData { get; set; } + public byte[]? Payload { get; set; } + public MqttPayloadFormatIndicator PayloadFormatIndicator { get; set; } + public MqttQualityOfServiceLevel QualityOfServiceLevel { get; set; } + public string? ResponseTopic { get; set; } + public string? Topic { get; set; } + public List? UserProperties { get; set; } + + public static MqttRetainedMessageModel Create(MqttApplicationMessage message) + { + if (message == null) + { + throw new ArgumentNullException(nameof(message)); + } + + return new MqttRetainedMessageModel + { + Topic = message.Topic, + + // Create a copy of the buffer from the payload segment because + // it cannot be serialized and deserialized with the JSON serializer. + Payload = message.PayloadSegment.ToArray(), + UserProperties = message.UserProperties, + ResponseTopic = message.ResponseTopic, + CorrelationData = message.CorrelationData, + ContentType = message.ContentType, + PayloadFormatIndicator = message.PayloadFormatIndicator, + QualityOfServiceLevel = message.QualityOfServiceLevel + + // Other properties like "Retain" are not if interest in the storage. + // That's why a custom model makes sense. + }; + } + + public MqttApplicationMessage ToApplicationMessage() + { + return new MqttApplicationMessage + { + Topic = Topic, + PayloadSegment = new ArraySegment(Payload ?? Array.Empty()), + PayloadFormatIndicator = PayloadFormatIndicator, + ResponseTopic = ResponseTopic, + CorrelationData = CorrelationData, + ContentType = ContentType, + UserProperties = UserProperties, + QualityOfServiceLevel = QualityOfServiceLevel, + Dup = false, + Retain = true + }; + } + } } \ No newline at end of file diff --git a/Source/MQTTnet/Implementations/MqttWebSocketChannel.cs b/Source/MQTTnet/Implementations/MqttWebSocketChannel.cs index e83b6566..fd4027a9 100644 --- a/Source/MQTTnet/Implementations/MqttWebSocketChannel.cs +++ b/Source/MQTTnet/Implementations/MqttWebSocketChannel.cs @@ -227,11 +227,12 @@ namespace MQTTnet.Implementations { clientWebSocket.Options.UseDefaultCredentials = _options.UseDefaultCredentials; } -#endif + if (_options.KeepAliveInterval != WebSocket.DefaultKeepAliveInterval) { clientWebSocket.Options.KeepAliveInterval = _options.KeepAliveInterval; } +#endif #endif if (_options.Credentials != null) {