From 99e70fdbbb083c002a727e226073cec84f71445b Mon Sep 17 00:00:00 2001 From: Christian <6939810+chkr1011@users.noreply.github.com> Date: Tue, 21 Oct 2025 12:33:20 +0200 Subject: [PATCH] Update samples (#2216) Separate the topic template samples from the other samples --- Samples/Client/Client_Subscribe_Samples.cs | 20 ++--- .../Client_Subscribe_TopicTemplate_Samples.cs | 75 +++++++++++++++++++ 2 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 Samples/Client/Client_Subscribe_TopicTemplate_Samples.cs diff --git a/Samples/Client/Client_Subscribe_Samples.cs b/Samples/Client/Client_Subscribe_Samples.cs index 6f1f4adc..38cf67fc 100644 --- a/Samples/Client/Client_Subscribe_Samples.cs +++ b/Samples/Client/Client_Subscribe_Samples.cs @@ -7,7 +7,6 @@ // ReSharper disable InconsistentNaming // ReSharper disable UnusedMember.Local -using MQTTnet.Extensions.TopicTemplate; using MQTTnet.Packets; using MQTTnet.Protocol; using MQTTnet.Samples.Helpers; @@ -16,8 +15,6 @@ namespace MQTTnet.Samples.Client; public static class Client_Subscribe_Samples { - static readonly MqttTopicTemplate sampleTemplate = new("mqttnet/samples/topic/{id}"); - public static async Task Handle_Received_Application_Message() { /* @@ -42,7 +39,7 @@ public static class Client_Subscribe_Samples await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); - var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder().WithTopicTemplate(sampleTemplate.WithParameter("id", "2")).Build(); + var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder().WithTopicFilter("mqttnet/samples/topic/2").Build(); await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None); @@ -55,7 +52,7 @@ public static class Client_Subscribe_Samples public static async Task Send_Responses() { /* - * This sample subscribes to a topic and sends a response to the broker. This requires at least QoS level 1 to work! + * This sample subscribes to a topic and sends a detailed response to the client. This requires at least QoS level 1 to work! */ var mqttFactory = new MqttClientFactory(); @@ -80,7 +77,7 @@ public static class Client_Subscribe_Samples await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); - var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder().WithTopicTemplate(sampleTemplate.WithParameter("id", "1")).Build(); + var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder().WithTopicFilter("topic/test").Build(); var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None); @@ -106,9 +103,10 @@ public static class Client_Subscribe_Samples // Create the subscribe options including several topics with different options. // It is also possible to all of these topics using a dedicated call of _SubscribeAsync_ per topic. var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder() - .WithTopicTemplate(sampleTemplate.WithParameter("id", "1")) - .WithTopicTemplate(sampleTemplate.WithParameter("id", "2"), noLocal: true) - .WithTopicTemplate(sampleTemplate.WithParameter("id", "3"), retainHandling: MqttRetainHandling.SendAtSubscribe) + .WithTopicFilter(t => t.WithTopic("topic/1").WithAtLeastOnceQoS()) + .WithTopicFilter(t => t.WithTopic("topic/2").WithAtMostOnceQoS()) + .WithTopicFilter(t => t.WithTopic("topic/3").WithNoLocal()) + .WithTopicFilter(t => t.WithRetainHandling(MqttRetainHandling.SendAtSubscribe)) .Build(); var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None); @@ -132,7 +130,9 @@ public static class Client_Subscribe_Samples await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); - var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder().WithTopicTemplate(sampleTemplate.WithParameter("id", "1")).Build(); + var topicFilter = mqttFactory.CreateTopicFilterBuilder().WithTopic("mqttnet/samples/topic/2").WithAtLeastOnceQoS(); + + var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder().WithTopicFilter(topicFilter).Build(); var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None); diff --git a/Samples/Client/Client_Subscribe_TopicTemplate_Samples.cs b/Samples/Client/Client_Subscribe_TopicTemplate_Samples.cs new file mode 100644 index 00000000..9c2d8331 --- /dev/null +++ b/Samples/Client/Client_Subscribe_TopicTemplate_Samples.cs @@ -0,0 +1,75 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using MQTTnet.Extensions.TopicTemplate; +using MQTTnet.Protocol; +using MQTTnet.Samples.Helpers; + +// ReSharper disable UnusedType.Global +// ReSharper disable UnusedMember.Global +// ReSharper disable InconsistentNaming +// ReSharper disable UnusedMember.Local + +namespace MQTTnet.Samples.Client; + +public static class Client_Subscribe_TopicTemplate_Samples +{ + static readonly MqttTopicTemplate SampleTemplate = new("mqttnet/samples/topic/{id}"); + + public static async Task Subscribe_Multiple_Topics_With_Template() + { + /* + * This sample subscribes to several topics in a single request. + * + * This sample requires the nuget 'MQTTnet.Extensions.TopicTemplate'. + */ + + var mqttFactory = new MqttClientFactory(); + + using var mqttClient = mqttFactory.CreateMqttClient(); + var mqttClientOptions = new MqttClientOptionsBuilder().WithTcpServer("broker.hivemq.com").Build(); + + await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); + + // Create the subscribe options including several topics with different options. + // It is also possible to all of these topics using a dedicated call of _SubscribeAsync_ per topic. + var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder() + .WithTopicTemplate(SampleTemplate.WithParameter("id", "1")) + .WithTopicTemplate(SampleTemplate.WithParameter("id", "2"), noLocal: true) + .WithTopicTemplate(SampleTemplate.WithParameter("id", "3"), retainHandling: MqttRetainHandling.SendAtSubscribe) + .Build(); + + var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None); + + Console.WriteLine("MQTT client subscribed to topics."); + + // The response contains additional data sent by the server after subscribing. + response.DumpToConsole(); + } + + public static async Task Subscribe_Topic_With_Template() + { + /* + * This sample subscribes to a topic. + * + * This sample requires the nuget 'MQTTnet.Extensions.TopicTemplate'. + */ + + var mqttFactory = new MqttClientFactory(); + + using var mqttClient = mqttFactory.CreateMqttClient(); + var mqttClientOptions = new MqttClientOptionsBuilder().WithTcpServer("broker.hivemq.com").Build(); + + await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); + + var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder().WithTopicTemplate(SampleTemplate.WithParameter("id", "1")).Build(); + + var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None); + + Console.WriteLine("MQTT client subscribed to topic."); + + // The response contains additional data sent by the server after subscribing. + response.DumpToConsole(); + } +} \ No newline at end of file