mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-16 01:03:01 +08:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b477ddbe60 | ||
|
|
d74d83453f | ||
|
|
99e70fdbbb |
@@ -33,8 +33,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.Extensions.TopicTem
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MQTTnet.Server", "Source\MQTTnet.Server\MQTTnet.Server.csproj", "{C876EFFD-C5AD-4E26-BD9F-4C48252C02BC}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MQTTnet.Server", "Source\MQTTnet.Server\MQTTnet.Server.csproj", "{C876EFFD-C5AD-4E26-BD9F-4C48252C02BC}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MQTTnet.PowerShell", "Source\MQTTnet.PowerShell\MQTTnet.PowerShell.csproj", "{37B129C5-0231-4EB5-AF13-77959068911C}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -81,10 +79,6 @@ Global
|
|||||||
{C876EFFD-C5AD-4E26-BD9F-4C48252C02BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{C876EFFD-C5AD-4E26-BD9F-4C48252C02BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{C876EFFD-C5AD-4E26-BD9F-4C48252C02BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{C876EFFD-C5AD-4E26-BD9F-4C48252C02BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{C876EFFD-C5AD-4E26-BD9F-4C48252C02BC}.Release|Any CPU.Build.0 = Release|Any CPU
|
{C876EFFD-C5AD-4E26-BD9F-4C48252C02BC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{37B129C5-0231-4EB5-AF13-77959068911C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{37B129C5-0231-4EB5-AF13-77959068911C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{37B129C5-0231-4EB5-AF13-77959068911C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{37B129C5-0231-4EB5-AF13-77959068911C}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||||
// ReSharper disable UnusedMember.Local
|
// ReSharper disable UnusedMember.Local
|
||||||
|
|
||||||
using MQTTnet.Extensions.TopicTemplate;
|
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using MQTTnet.Samples.Helpers;
|
using MQTTnet.Samples.Helpers;
|
||||||
@@ -16,8 +15,6 @@ namespace MQTTnet.Samples.Client;
|
|||||||
|
|
||||||
public static class Client_Subscribe_Samples
|
public static class Client_Subscribe_Samples
|
||||||
{
|
{
|
||||||
static readonly MqttTopicTemplate sampleTemplate = new("mqttnet/samples/topic/{id}");
|
|
||||||
|
|
||||||
public static async Task Handle_Received_Application_Message()
|
public static async Task Handle_Received_Application_Message()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -42,7 +39,7 @@ public static class Client_Subscribe_Samples
|
|||||||
|
|
||||||
await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
|
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);
|
await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);
|
||||||
|
|
||||||
@@ -55,7 +52,7 @@ public static class Client_Subscribe_Samples
|
|||||||
public static async Task Send_Responses()
|
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();
|
var mqttFactory = new MqttClientFactory();
|
||||||
@@ -80,7 +77,7 @@ public static class Client_Subscribe_Samples
|
|||||||
|
|
||||||
await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
|
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);
|
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.
|
// 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.
|
// It is also possible to all of these topics using a dedicated call of _SubscribeAsync_ per topic.
|
||||||
var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder()
|
var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder()
|
||||||
.WithTopicTemplate(sampleTemplate.WithParameter("id", "1"))
|
.WithTopicFilter(t => t.WithTopic("topic/1").WithAtLeastOnceQoS())
|
||||||
.WithTopicTemplate(sampleTemplate.WithParameter("id", "2"), noLocal: true)
|
.WithTopicFilter(t => t.WithTopic("topic/2").WithAtMostOnceQoS())
|
||||||
.WithTopicTemplate(sampleTemplate.WithParameter("id", "3"), retainHandling: MqttRetainHandling.SendAtSubscribe)
|
.WithTopicFilter(t => t.WithTopic("topic/3").WithNoLocal())
|
||||||
|
.WithTopicFilter(t => t.WithRetainHandling(MqttRetainHandling.SendAtSubscribe))
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);
|
var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);
|
||||||
@@ -132,7 +130,9 @@ public static class Client_Subscribe_Samples
|
|||||||
|
|
||||||
await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
|
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);
|
var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|
||||||
namespace MQTTnet.AspNetCore;
|
namespace MQTTnet.AspNetCore;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace MQTTnet.AspNetCore;
|
namespace MQTTnet.AspNetCore;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
|
|||||||
@@ -2,13 +2,10 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Connections;
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.AspNetCore.Http.Connections.Features;
|
using Microsoft.AspNetCore.Http.Connections.Features;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Connections;
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.AspNetCore.Connections.Features;
|
using Microsoft.AspNetCore.Connections.Features;
|
||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
namespace MQTTnet.AspNetCore;
|
namespace MQTTnet.AspNetCore;
|
||||||
|
|||||||
@@ -2,10 +2,8 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.WebSockets;
|
using System.Net.WebSockets;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
|
|||||||
@@ -2,13 +2,10 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MQTTnet.AspNetCore;
|
namespace MQTTnet.AspNetCore;
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,9 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Connections;
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|||||||
@@ -1,3 +1 @@
|
|||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
|
|
||||||
[assembly: DoNotParallelize]
|
[assembly: DoNotParallelize]
|
||||||
@@ -2,9 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using BenchmarkDotNet.Jobs;
|
using BenchmarkDotNet.Jobs;
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Threading;
|
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using BenchmarkDotNet.Jobs;
|
using BenchmarkDotNet.Jobs;
|
||||||
using System;
|
|
||||||
|
|
||||||
|
|
||||||
namespace MQTTnet.Benchmarks;
|
namespace MQTTnet.Benchmarks;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using BenchmarkDotNet.Jobs;
|
using BenchmarkDotNet.Jobs;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using BenchmarkDotNet.Jobs;
|
using BenchmarkDotNet.Jobs;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using BenchmarkDotNet.Running;
|
using BenchmarkDotNet.Running;
|
||||||
|
|
||||||
namespace MQTTnet.Benchmarks;
|
namespace MQTTnet.Benchmarks;
|
||||||
|
|||||||
@@ -4,9 +4,7 @@ using MQTTnet.AspNetCore;
|
|||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.IO;
|
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MQTTnet.Benchmarks;
|
namespace MQTTnet.Benchmarks;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using BenchmarkDotNet.Jobs;
|
using BenchmarkDotNet.Jobs;
|
||||||
using MQTTnet.Tests.Mockups;
|
using MQTTnet.Tests.Mockups;
|
||||||
using MQTTnet.Tests.Server;
|
|
||||||
|
|
||||||
namespace MQTTnet.Benchmarks;
|
namespace MQTTnet.Benchmarks;
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,7 @@
|
|||||||
|
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
using System;
|
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
using MQTTnet.Channel;
|
using MQTTnet.Channel;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using BenchmarkDotNet.Jobs;
|
using BenchmarkDotNet.Jobs;
|
||||||
using MQTTnet.Tests.Mockups;
|
using MQTTnet.Tests.Mockups;
|
||||||
using MQTTnet.Tests.Server;
|
|
||||||
|
|
||||||
namespace MQTTnet.Benchmarks;
|
namespace MQTTnet.Benchmarks;
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using BenchmarkDotNet.Jobs;
|
using BenchmarkDotNet.Jobs;
|
||||||
using MQTTnet.AspNetCore;
|
using MQTTnet.AspNetCore;
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace MQTTnet.Benchmarks;
|
namespace MQTTnet.Benchmarks;
|
||||||
|
|
||||||
public class TopicGenerator
|
public class TopicGenerator
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace MQTTnet.Extensions.Rpc;
|
namespace MQTTnet.Extensions.Rpc;
|
||||||
|
|
||||||
public sealed class DefaultMqttRpcClientTopicGenerationStrategy : IMqttRpcClientTopicGenerationStrategy
|
public sealed class DefaultMqttRpcClientTopicGenerationStrategy : IMqttRpcClientTopicGenerationStrategy
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
namespace MQTTnet.Extensions.Rpc;
|
namespace MQTTnet.Extensions.Rpc;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace MQTTnet.Extensions.Rpc;
|
namespace MQTTnet.Extensions.Rpc;
|
||||||
|
|
||||||
public static class MqttFactoryExtensions
|
public static class MqttFactoryExtensions
|
||||||
|
|||||||
@@ -2,12 +2,8 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
|
|||||||
@@ -2,10 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
namespace MQTTnet.Extensions.Rpc;
|
namespace MQTTnet.Extensions.Rpc;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace MQTTnet.Extensions.Rpc;
|
namespace MQTTnet.Extensions.Rpc;
|
||||||
|
|
||||||
public sealed class MqttRpcClientOptionsBuilder
|
public sealed class MqttRpcClientOptionsBuilder
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
namespace MQTTnet.Extensions.Rpc;
|
namespace MQTTnet.Extensions.Rpc;
|
||||||
|
|||||||
@@ -2,11 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
namespace MQTTnet.Extensions.TopicTemplate;
|
namespace MQTTnet.Extensions.TopicTemplate;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
|
|||||||
@@ -1,120 +0,0 @@
|
|||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsCommunications.Connect, "MqttSession")]
|
|
||||||
[OutputType(typeof(MqttClientConnectResult))]
|
|
||||||
public class ConnectMqttSessionCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter]
|
|
||||||
public SwitchParameter CleanSession { get; set; } = true;
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public string? ClientId { get; set; } = Guid.NewGuid().ToString();
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true, ParameterSetName = "Tcp")]
|
|
||||||
[Parameter(Mandatory = true, ParameterSetName = "TcpWithTls")]
|
|
||||||
public new string? Host { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public string? Password { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "Tcp")]
|
|
||||||
[Parameter(ParameterSetName = "TcpWithTls")]
|
|
||||||
public int Port { get; set; } = 1883;
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public string? Username { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "TcpWithTls")]
|
|
||||||
public SwitchParameter UseTls { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "TcpWithTls")]
|
|
||||||
public SwitchParameter AllowUntrustedCertificates { get; set; }
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true, ParameterSetName = "WebSocket")]
|
|
||||||
public string? WebSocketUri { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public int KeepAlivePeriod { get; set; } = 15;
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public int Timeout { get; set; } = 10;
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public string? WillTopic { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public string? WillPayload { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public int WillQoS { get; set; } = 0;
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public SwitchParameter WillRetain { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
var clientOptionsBuilder = new MqttClientOptionsBuilder();
|
|
||||||
|
|
||||||
// Configure transport
|
|
||||||
if (ParameterSetName == "WebSocket")
|
|
||||||
{
|
|
||||||
clientOptionsBuilder.WithWebSocketServer(o => o.WithUri(WebSocketUri!));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
clientOptionsBuilder.WithTcpServer(Host!, Port);
|
|
||||||
|
|
||||||
if (UseTls)
|
|
||||||
{
|
|
||||||
clientOptionsBuilder.WithTlsOptions(o =>
|
|
||||||
{
|
|
||||||
if (AllowUntrustedCertificates)
|
|
||||||
{
|
|
||||||
o.WithCertificateValidationHandler(_ => true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure authentication
|
|
||||||
if (Username != null)
|
|
||||||
{
|
|
||||||
clientOptionsBuilder.WithCredentials(Username, Password);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure session
|
|
||||||
clientOptionsBuilder.WithCleanSession(CleanSession);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(ClientId))
|
|
||||||
{
|
|
||||||
clientOptionsBuilder.WithClientId(ClientId);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure keep alive
|
|
||||||
clientOptionsBuilder.WithKeepAlivePeriod(TimeSpan.FromSeconds(KeepAlivePeriod));
|
|
||||||
clientOptionsBuilder.WithTimeout(TimeSpan.FromSeconds(Timeout));
|
|
||||||
|
|
||||||
// Configure Will message
|
|
||||||
if (!string.IsNullOrEmpty(WillTopic))
|
|
||||||
{
|
|
||||||
clientOptionsBuilder.WithWillTopic(WillTopic);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(WillPayload))
|
|
||||||
{
|
|
||||||
clientOptionsBuilder.WithWillPayload(System.Text.Encoding.UTF8.GetBytes(WillPayload));
|
|
||||||
}
|
|
||||||
|
|
||||||
clientOptionsBuilder.WithWillQualityOfServiceLevel((Protocol.MqttQualityOfServiceLevel)WillQoS);
|
|
||||||
clientOptionsBuilder.WithWillRetain(WillRetain);
|
|
||||||
}
|
|
||||||
|
|
||||||
var response = Session.GetClient().ConnectAsync(clientOptionsBuilder.Build()).GetAwaiter().GetResult();
|
|
||||||
|
|
||||||
WriteObject(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsCommunications.Disconnect, "MqttSession")]
|
|
||||||
public class DisconnectMqttSessionCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter]
|
|
||||||
public MqttClientDisconnectOptionsReason Reason { get; set; } = MqttClientDisconnectOptionsReason.NormalDisconnection;
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public string? ReasonString { get; set; }
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public uint SessionExpiryInterval { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
if (Session.GetClient().IsConnected)
|
|
||||||
{
|
|
||||||
var options = new MqttClientDisconnectOptionsBuilder().WithSessionExpiryInterval(SessionExpiryInterval).WithReason(Reason).WithReasonString(ReasonString).Build();
|
|
||||||
|
|
||||||
Session.GetClient().DisconnectAsync(options).GetAwaiter().GetResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
WriteObject("Disconnected.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
// 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 System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsCommon.Get, "MqttSessionStatus")]
|
|
||||||
[OutputType(typeof(MqttClientConnectionStatus))]
|
|
||||||
public class GetMqttSessionStatusCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
var client = Session.GetClient();
|
|
||||||
var status = new
|
|
||||||
{
|
|
||||||
IsConnected = client.IsConnected,
|
|
||||||
Options = client.Options
|
|
||||||
};
|
|
||||||
|
|
||||||
WriteObject(status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsCommon.New, "MqttSession")]
|
|
||||||
[OutputType(typeof(PsMqttSession))]
|
|
||||||
public class NewMqttSessionCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
WriteObject(new PsMqttSession());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
using System.Collections;
|
|
||||||
using System.Management.Automation;
|
|
||||||
using System.Text;
|
|
||||||
using MQTTnet.Protocol;
|
|
||||||
using MQTTnet.Packets;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsData.Publish, "MqttMessage")]
|
|
||||||
public class PublishMqttMessageCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(Mandatory = true)]
|
|
||||||
public string? Payload { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public int QoS { get; set; } = 0;
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public SwitchParameter Retain { get; set; }
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true)]
|
|
||||||
public required string Topic { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public string? ContentType { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public string? ResponseTopic { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public ushort TopicAlias { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public uint MessageExpiryInterval { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public Hashtable? UserProperties { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
var msgBuilder = new MqttApplicationMessageBuilder()
|
|
||||||
.WithTopic(Topic)
|
|
||||||
.WithPayload(Encoding.UTF8.GetBytes(Payload ?? string.Empty))
|
|
||||||
.WithQualityOfServiceLevel((MqttQualityOfServiceLevel)QoS)
|
|
||||||
.WithRetainFlag(Retain)
|
|
||||||
.WithContentType(ContentType)
|
|
||||||
.WithResponseTopic(ResponseTopic)
|
|
||||||
.WithTopicAlias(TopicAlias)
|
|
||||||
.WithMessageExpiryInterval(MessageExpiryInterval);
|
|
||||||
|
|
||||||
// Add user properties if provided
|
|
||||||
if (UserProperties != null && UserProperties.Count > 0)
|
|
||||||
{
|
|
||||||
foreach (var key in UserProperties.Keys)
|
|
||||||
{
|
|
||||||
var value = UserProperties[key]?.ToString() ?? string.Empty;
|
|
||||||
msgBuilder.WithUserProperty(key.ToString(), value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var msg = msgBuilder.Build();
|
|
||||||
var response = Session.GetClient().PublishAsync(msg).GetAwaiter().GetResult();
|
|
||||||
|
|
||||||
WriteObject(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
// 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 System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsCommunications.Receive, "MqttMessage")]
|
|
||||||
[OutputType(typeof(PsMqttMessage))]
|
|
||||||
public class ReceiveMqttMessageCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
[ValidateRange(0, int.MaxValue)]
|
|
||||||
public int TimeoutSeconds { get; set; } = 0;
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
var tcs = new TaskCompletionSource<PsMqttMessage>();
|
|
||||||
EventHandler<PsMqttMessage>? handler = null;
|
|
||||||
CancellationTokenSource? cts = null;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
handler = (s, e) =>
|
|
||||||
{
|
|
||||||
if (!tcs.Task.IsCompleted)
|
|
||||||
{
|
|
||||||
tcs.TrySetResult(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Session.MessageReceived += handler;
|
|
||||||
|
|
||||||
// Optionaler Timeout
|
|
||||||
if (TimeoutSeconds > 0)
|
|
||||||
{
|
|
||||||
cts = new CancellationTokenSource();
|
|
||||||
cts.CancelAfter(TimeSpan.FromSeconds(TimeoutSeconds));
|
|
||||||
cts.Token.Register(() =>
|
|
||||||
{
|
|
||||||
if (!tcs.Task.IsCompleted)
|
|
||||||
{
|
|
||||||
tcs.TrySetCanceled();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
WriteVerbose("Waiting for next MQTT message...");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var message = tcs.Task.GetAwaiter().GetResult();
|
|
||||||
WriteObject(message);
|
|
||||||
}
|
|
||||||
catch (TaskCanceledException)
|
|
||||||
{
|
|
||||||
WriteWarning($"Timeout after {TimeoutSeconds} seconds — no message received.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (handler != null)
|
|
||||||
{
|
|
||||||
Session.MessageReceived -= handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
cts?.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
using System.Management.Automation;
|
|
||||||
using System.Management.Automation.Runspaces;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsLifecycle.Register, "MqttMessageHandler")]
|
|
||||||
public class RegisterMqttMessageHandlerCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true)]
|
|
||||||
public ScriptBlock? Action { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
// Capture the ScriptBlock and current default runspace (available during cmdlet execution)
|
|
||||||
var scriptBlock = Action ?? throw new ArgumentNullException(nameof(Action));
|
|
||||||
var capturedRunspace = Runspace.DefaultRunspace ?? throw new InvalidOperationException("No default runspace available during cmdlet execution.");
|
|
||||||
var capturedHost = Host;
|
|
||||||
|
|
||||||
EventHandler<PsMqttMessage> handler = (sender, e) =>
|
|
||||||
{
|
|
||||||
// Run asynchronously to avoid blocking the event thread
|
|
||||||
Task.Run(() =>
|
|
||||||
{
|
|
||||||
// Temporarily set the default runspace for this thread
|
|
||||||
var originalRunspace = Runspace.DefaultRunspace;
|
|
||||||
Runspace.DefaultRunspace = capturedRunspace;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Invoke the ScriptBlock directly with arguments (returns Collection<PSObject>)
|
|
||||||
var results = scriptBlock.Invoke(e.Topic, e.Payload, e); // Pass topic, payload, and full message
|
|
||||||
|
|
||||||
// Handle output manually (e.g., write to host/console)
|
|
||||||
foreach (var result in results)
|
|
||||||
{
|
|
||||||
capturedHost.UI.WriteLine(result?.ToString() ?? string.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// Handle errors by writing to host error stream
|
|
||||||
capturedHost.UI.WriteErrorLine($"MQTT handler error: {ex.Message}");
|
|
||||||
// Optionally: capturedHost.UI.WriteVerboseLine(ex.StackTrace); for more details
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Restore the original default runspace for this thread
|
|
||||||
Runspace.DefaultRunspace = originalRunspace;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
Session.MessageReceived += handler;
|
|
||||||
WriteObject($"Handler registered for MQTT messages on session.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsCommon.Remove, "MqttSession")]
|
|
||||||
public class RemoveMqttSessionCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
Session.Dispose();
|
|
||||||
WriteObject("Session removed.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
// 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 System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsCommon.Show, "MqttExamples")]
|
|
||||||
public class ShowMqttExamplesCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
var examples = @"
|
|
||||||
MQTTnet PowerShell Module - Quick Examples
|
|
||||||
==========================================
|
|
||||||
|
|
||||||
1. Basic Connection and Publish:
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -Host 'broker.hivemq.com'
|
|
||||||
Publish-MqttMessage -Session $session -Topic 'test/topic' -Payload 'Hello'
|
|
||||||
Disconnect-MqttSession -Session $session
|
|
||||||
Remove-MqttSession -Session $session
|
|
||||||
|
|
||||||
2. Subscribe and Receive Messages:
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -Host 'broker.hivemq.com'
|
|
||||||
Subscribe-MqttTopic -Session $session -Topic 'test/demo'
|
|
||||||
$msg = Receive-MqttMessage -Session $session -TimeoutSeconds 30
|
|
||||||
Write-Host ""Received: $($msg.Payload)""
|
|
||||||
|
|
||||||
3. WebSocket Connection:
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -WebSocketUri 'ws://broker.hivemq.com:8000/mqtt'
|
|
||||||
Publish-MqttMessage -Session $session -Topic 'test/ws' -Payload 'Hello WS'
|
|
||||||
|
|
||||||
4. TLS/SSL Connection:
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -Host 'broker.hivemq.com' -Port 8883 `
|
|
||||||
-UseTls -AllowUntrustedCertificates
|
|
||||||
|
|
||||||
5. Async Message Handler:
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -Host 'broker.hivemq.com'
|
|
||||||
Subscribe-MqttTopic -Session $session -Topic 'test/#'
|
|
||||||
Register-MqttMessageHandler -Session $session -Action {
|
|
||||||
param($topic, $payload, $message)
|
|
||||||
Write-Host ""Message on $topic : $payload""
|
|
||||||
}
|
|
||||||
|
|
||||||
6. Last Will and Testament:
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -Host 'broker.hivemq.com' `
|
|
||||||
-WillTopic 'status/client' -WillPayload 'Offline' -WillQoS 1 -WillRetain
|
|
||||||
|
|
||||||
7. Publish with User Properties:
|
|
||||||
$props = @{ 'source' = 'PowerShell'; 'version' = '1.0' }
|
|
||||||
Publish-MqttMessage -Session $session -Topic 'test/props' `
|
|
||||||
-Payload 'Data' -UserProperties $props
|
|
||||||
|
|
||||||
8. High QoS Publishing:
|
|
||||||
Publish-MqttMessage -Session $session -Topic 'critical/data' `
|
|
||||||
-Payload 'Important' -QoS 2
|
|
||||||
|
|
||||||
9. Test Connection:
|
|
||||||
$isAlive = Test-MqttConnection -Session $session
|
|
||||||
Write-Host ""Connection alive: $isAlive""
|
|
||||||
|
|
||||||
10. Get Session Status:
|
|
||||||
$status = Get-MqttSessionStatus -Session $session
|
|
||||||
Write-Host ""Connected: $($status.IsConnected)""
|
|
||||||
|
|
||||||
For more details, see: Source/MQTTnet.PowerShell/README.md
|
|
||||||
";
|
|
||||||
|
|
||||||
WriteObject(examples);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
// 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 System.Management.Automation;
|
|
||||||
using MQTTnet.Protocol;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet("Subscribe", "MqttTopic")]
|
|
||||||
[OutputType(typeof(MqttClientSubscribeResult))]
|
|
||||||
public class SubscribeMqttTopicCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter]
|
|
||||||
public bool NoLocal { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public int QoS { get; set; } = 0;
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public bool RetainAsPublished { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public MqttRetainHandling RetainHandling { get; set; } = MqttRetainHandling.SendAtSubscribe;
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public uint SubscriptionIdentifier { get; set; }
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true)]
|
|
||||||
public required string Topic { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
var topicFilter = new MqttTopicFilterBuilder().WithTopic(Topic)
|
|
||||||
.WithQualityOfServiceLevel((MqttQualityOfServiceLevel)QoS)
|
|
||||||
.WithNoLocal(NoLocal)
|
|
||||||
.WithRetainAsPublished(RetainAsPublished)
|
|
||||||
.WithRetainHandling(RetainHandling)
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
var options = new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topicFilter);
|
|
||||||
|
|
||||||
if (SubscriptionIdentifier > 0)
|
|
||||||
{
|
|
||||||
options.WithSubscriptionIdentifier(SubscriptionIdentifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
var response = Session.GetClient().SubscribeAsync(options.Build()).GetAwaiter().GetResult();
|
|
||||||
|
|
||||||
WriteObject(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
// 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 System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsDiagnostic.Test, "MqttConnection")]
|
|
||||||
[OutputType(typeof(bool))]
|
|
||||||
public class TestMqttConnectionCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public int TimeoutSeconds { get; set; } = 5;
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var client = Session.GetClient();
|
|
||||||
|
|
||||||
if (!client.IsConnected)
|
|
||||||
{
|
|
||||||
WriteObject(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(TimeoutSeconds));
|
|
||||||
client.PingAsync(cts.Token).GetAwaiter().GetResult();
|
|
||||||
|
|
||||||
WriteObject(true);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
WriteObject(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
// 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 System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet(VerbsLifecycle.Unregister, "MqttMessageHandler")]
|
|
||||||
public class UnregisterMqttMessageHandlerCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
// Clear all event handlers
|
|
||||||
Session.ClearMessageHandlers();
|
|
||||||
WriteObject($"All message handlers cleared for MQTT session.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell.Cmdlets;
|
|
||||||
|
|
||||||
[Cmdlet("Unsubscribe", "MqttTopic")]
|
|
||||||
[OutputType(typeof(MqttClientUnsubscribeResult))]
|
|
||||||
public class UnsubscribeMqttTopicCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(Mandatory = true, ValueFromPipeline = true)]
|
|
||||||
public required PsMqttSession Session { get; set; }
|
|
||||||
|
|
||||||
[Parameter(Mandatory = true)]
|
|
||||||
public required string Topic { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
var options = new MqttClientUnsubscribeOptionsBuilder().WithTopicFilter(Topic).Build();
|
|
||||||
|
|
||||||
var response = Session.GetClient().UnsubscribeAsync(options).GetAwaiter().GetResult();
|
|
||||||
|
|
||||||
WriteObject(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,197 +0,0 @@
|
|||||||
# PowerShell Module Extension - Implementation Summary
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This implementation extends the PowerShell support for the MQTTnet library as requested in issue #2215, implementing the proposal described in the ticket comments and exposing additional features of the library as PowerShell cmdlets.
|
|
||||||
|
|
||||||
## Changes Implemented
|
|
||||||
|
|
||||||
### 1. Enhanced RegisterMqttMessageHandler (Primary Requirement from #2215)
|
|
||||||
**File**: `Source/MQTTnet.PowerShell/Cmdlets/RegisterMqttMessageHandlerCmdlet.cs`
|
|
||||||
|
|
||||||
Implemented the proposal from the issue comment by @ArakniD:
|
|
||||||
- Proper ScriptBlock execution in the correct runspace
|
|
||||||
- Asynchronous message handling using Task.Run to avoid blocking
|
|
||||||
- Passes three parameters to the handler: topic (string), payload (string), and full message object
|
|
||||||
- Proper error handling with try-catch and error output to host
|
|
||||||
- Captures the runspace during cmdlet execution and restores it during handler execution
|
|
||||||
|
|
||||||
**Usage Example:**
|
|
||||||
```powershell
|
|
||||||
Register-MqttMessageHandler -Session $session -Action {
|
|
||||||
param($topic, $payload, $message)
|
|
||||||
Write-Host "Received on $topic: $payload"
|
|
||||||
# Can access $message.QoS, $message.Retain, etc.
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Enhanced Connection Options
|
|
||||||
**File**: `Source/MQTTnet.PowerShell/Cmdlets/ConnectMqttSessionCmdlet.cs`
|
|
||||||
|
|
||||||
Extended Connect-MqttSession with:
|
|
||||||
- **WebSocket Support**: New `-WebSocketUri` parameter for WebSocket connections
|
|
||||||
- **TLS/SSL Support**: New `-UseTls` and `-AllowUntrustedCertificates` parameters
|
|
||||||
- **Last Will and Testament**: Parameters for `-WillTopic`, `-WillPayload`, `-WillQoS`, `-WillRetain`
|
|
||||||
- **Connection Tuning**: Parameters for `-KeepAlivePeriod` and `-Timeout`
|
|
||||||
- **Parameter Sets**: Organized into TCP, TcpWithTls, and WebSocket parameter sets
|
|
||||||
|
|
||||||
**Usage Examples:**
|
|
||||||
```powershell
|
|
||||||
# TCP with TLS
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.com" -Port 8883 -UseTls
|
|
||||||
|
|
||||||
# WebSocket
|
|
||||||
Connect-MqttSession -Session $session -WebSocketUri "ws://broker.com:8000/mqtt"
|
|
||||||
|
|
||||||
# With Last Will
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.com" `
|
|
||||||
-WillTopic "status" -WillPayload "Offline" -WillRetain
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Enhanced Publishing
|
|
||||||
**File**: `Source/MQTTnet.PowerShell/Cmdlets/PublishMqttMessageCmdlet.cs`
|
|
||||||
|
|
||||||
Added support for:
|
|
||||||
- **User Properties**: New `-UserProperties` parameter accepting a Hashtable
|
|
||||||
- MQTT 5 features already supported: ContentType, ResponseTopic, TopicAlias, MessageExpiryInterval
|
|
||||||
|
|
||||||
**Usage Example:**
|
|
||||||
```powershell
|
|
||||||
$props = @{ "source" = "PowerShell"; "version" = "1.0" }
|
|
||||||
Publish-MqttMessage -Session $session -Topic "data" -Payload "test" -UserProperties $props
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. New Utility Cmdlets
|
|
||||||
|
|
||||||
#### Get-MqttSessionStatus
|
|
||||||
**File**: `Source/MQTTnet.PowerShell/Cmdlets/GetMqttSessionStatusCmdlet.cs`
|
|
||||||
|
|
||||||
Returns connection status information.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$status = Get-MqttSessionStatus -Session $session
|
|
||||||
Write-Host "Connected: $($status.IsConnected)"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Test-MqttConnection
|
|
||||||
**File**: `Source/MQTTnet.PowerShell/Cmdlets/TestMqttConnectionCmdlet.cs`
|
|
||||||
|
|
||||||
Pings the broker to verify connectivity.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$isAlive = Test-MqttConnection -Session $session -TimeoutSeconds 5
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Unregister-MqttMessageHandler
|
|
||||||
**File**: `Source/MQTTnet.PowerShell/Cmdlets/UnregisterMqttMessageHandlerCmdlet.cs`
|
|
||||||
|
|
||||||
Clears all registered message handlers.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Unregister-MqttMessageHandler -Session $session
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Show-MqttExamples
|
|
||||||
**File**: `Source/MQTTnet.PowerShell/Cmdlets/ShowMqttExamplesCmdlet.cs`
|
|
||||||
|
|
||||||
Displays quick reference examples for common MQTT tasks.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Show-MqttExamples
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5. Enhanced PsMqttSession Class
|
|
||||||
**File**: `Source/MQTTnet.PowerShell/PsMqttSession.cs`
|
|
||||||
|
|
||||||
Added:
|
|
||||||
- `ClearMessageHandlers()` method to remove all event handlers
|
|
||||||
- Improved event handling infrastructure
|
|
||||||
|
|
||||||
### 6. Documentation
|
|
||||||
**Files**:
|
|
||||||
- `Source/MQTTnet.PowerShell/README.md` (new)
|
|
||||||
- `Source/MQTTnet.PowerShell/Test.ps1` (updated)
|
|
||||||
- `Source/MQTTnet.PowerShell/SmokeTest.ps1` (new)
|
|
||||||
|
|
||||||
Created comprehensive documentation including:
|
|
||||||
- Quick start guide
|
|
||||||
- Detailed cmdlet documentation
|
|
||||||
- Parameter descriptions
|
|
||||||
- Usage examples for all features
|
|
||||||
- Advanced scenarios (request-response, error handling)
|
|
||||||
- Tips and best practices
|
|
||||||
- Smoke tests for validation
|
|
||||||
|
|
||||||
## Complete Cmdlet List (13 Total)
|
|
||||||
|
|
||||||
1. **New-MqttSession** - Create MQTT session
|
|
||||||
2. **Connect-MqttSession** - Connect with TCP/WebSocket/TLS support
|
|
||||||
3. **Disconnect-MqttSession** - Clean disconnect
|
|
||||||
4. **Remove-MqttSession** - Cleanup resources
|
|
||||||
5. **Get-MqttSessionStatus** - Check connection status
|
|
||||||
6. **Test-MqttConnection** - Ping broker
|
|
||||||
7. **Publish-MqttMessage** - Publish with advanced features
|
|
||||||
8. **Subscribe-MqttTopic** - Subscribe to topics
|
|
||||||
9. **Unsubscribe-MqttTopic** - Unsubscribe from topics
|
|
||||||
10. **Receive-MqttMessage** - Synchronous message receive
|
|
||||||
11. **Register-MqttMessageHandler** - Async message handling ⭐ (Primary requirement)
|
|
||||||
12. **Unregister-MqttMessageHandler** - Clear handlers
|
|
||||||
13. **Show-MqttExamples** - Quick reference examples
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
### Build Status
|
|
||||||
✅ PowerShell module builds successfully
|
|
||||||
✅ No compilation errors or warnings
|
|
||||||
✅ Code passes CodeQL security analysis (0 alerts)
|
|
||||||
|
|
||||||
### Smoke Tests
|
|
||||||
✅ All 13 cmdlets load correctly
|
|
||||||
✅ Session creation and disposal works
|
|
||||||
✅ Show-MqttExamples returns help text
|
|
||||||
✅ No runtime errors during basic operations
|
|
||||||
|
|
||||||
### Test Files
|
|
||||||
- `SmokeTest.ps1`: Quick validation of module loading and basic operations
|
|
||||||
- `Test.ps1`: Comprehensive examples demonstrating all features
|
|
||||||
|
|
||||||
## Features Not Implemented (Out of Scope)
|
|
||||||
|
|
||||||
The following were considered but determined to be out of scope for this task:
|
|
||||||
- MQTT broker/server cmdlets (only client features were requested)
|
|
||||||
- Managed MQTT client wrapper (existing client is sufficient)
|
|
||||||
- RPC extension support (specialized use case)
|
|
||||||
- File-based certificate handling cmdlets (can be done with existing .NET capabilities)
|
|
||||||
|
|
||||||
## Compatibility
|
|
||||||
|
|
||||||
- Requires .NET 8.0 or later
|
|
||||||
- Requires PowerShell 7.0 or later
|
|
||||||
- Works on Windows, Linux, and macOS
|
|
||||||
- Compatible with MQTT 3.1.1 and MQTT 5.0 protocols
|
|
||||||
|
|
||||||
## Breaking Changes
|
|
||||||
|
|
||||||
None. This is a new feature addition that doesn't modify existing code outside the PowerShell module.
|
|
||||||
|
|
||||||
## Migration Guide
|
|
||||||
|
|
||||||
For users who were using the initial implementation from PR #2215:
|
|
||||||
- The RegisterMqttMessageHandler now actually works! Update your scripts to use the handler.
|
|
||||||
- Connect-MqttSession now requires explicit parameter sets (-Host for TCP, -WebSocketUri for WebSocket)
|
|
||||||
- No other breaking changes
|
|
||||||
|
|
||||||
## Future Enhancements
|
|
||||||
|
|
||||||
Potential future improvements that could be added:
|
|
||||||
1. Pipeline support for batch publishing
|
|
||||||
2. Managed client wrapper for automatic reconnection
|
|
||||||
3. Certificate-based authentication helpers
|
|
||||||
4. MQTT broker cmdlets for running local brokers
|
|
||||||
5. Performance counters and statistics cmdlets
|
|
||||||
6. Async/await support for better PowerShell integration
|
|
||||||
|
|
||||||
## References
|
|
||||||
|
|
||||||
- Issue #2215: https://github.com/dotnet/MQTTnet/pull/2215
|
|
||||||
- Proposal comment by @ArakniD: https://github.com/dotnet/MQTTnet/pull/2215#issuecomment-3594492551
|
|
||||||
- MQTTnet Documentation: https://github.com/dotnet/MQTTnet
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<AssemblyName>MQTTnet.PowerShell</AssemblyName>
|
|
||||||
<LangVersion>default</LangVersion>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="PowerShellStandard.Library" Version="5.1.1">
|
|
||||||
<PrivateAssets>All</PrivateAssets>
|
|
||||||
</PackageReference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\MQTTnet\MQTTnet.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
// 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 System.Management.Automation;
|
|
||||||
using MQTTnet.Packets;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell;
|
|
||||||
|
|
||||||
public class PsMqttPublishResult
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PsMqttConnectResult
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PsMqttMessage
|
|
||||||
{
|
|
||||||
public required string? ContentType { get; init; }
|
|
||||||
public required string Payload { get; init; }
|
|
||||||
public int QoS { get; init; }
|
|
||||||
public required byte[] RawPayload { get; init; }
|
|
||||||
public string? ResponseTopic { get; init; }
|
|
||||||
public bool Retain { get; init; }
|
|
||||||
public required string Topic { get; init; }
|
|
||||||
public required List<MqttUserProperty>? UserProperties { get; init; }
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
// 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 System.Buffers;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MQTTnet.PowerShell;
|
|
||||||
|
|
||||||
public sealed class PsMqttSession : IDisposable
|
|
||||||
{
|
|
||||||
readonly IMqttClient _client;
|
|
||||||
|
|
||||||
public PsMqttSession()
|
|
||||||
{
|
|
||||||
var factory = new MqttClientFactory();
|
|
||||||
_client = factory.CreateMqttClient();
|
|
||||||
|
|
||||||
_client.ApplicationMessageReceivedAsync += e =>
|
|
||||||
{
|
|
||||||
MessageReceived?.Invoke(
|
|
||||||
this,
|
|
||||||
new PsMqttMessage
|
|
||||||
{
|
|
||||||
Topic = e.ApplicationMessage.Topic,
|
|
||||||
Payload = Encoding.UTF8.GetString(e.ApplicationMessage.Payload),
|
|
||||||
RawPayload = e.ApplicationMessage.Payload.ToArray(),
|
|
||||||
UserProperties = e.ApplicationMessage.UserProperties,
|
|
||||||
QoS = (int)e.ApplicationMessage.QualityOfServiceLevel,
|
|
||||||
ContentType = e.ApplicationMessage.ContentType,
|
|
||||||
Retain = e.ApplicationMessage.Retain,
|
|
||||||
ResponseTopic = e.ApplicationMessage.ResponseTopic
|
|
||||||
});
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public event EventHandler<PsMqttMessage>? MessageReceived;
|
|
||||||
|
|
||||||
public void ClearMessageHandlers()
|
|
||||||
{
|
|
||||||
// Remove all event subscribers
|
|
||||||
if (MessageReceived != null)
|
|
||||||
{
|
|
||||||
foreach (var handler in MessageReceived.GetInvocationList())
|
|
||||||
{
|
|
||||||
MessageReceived -= (EventHandler<PsMqttMessage>)handler;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
_client.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IMqttClient GetClient()
|
|
||||||
{
|
|
||||||
return _client;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,396 +0,0 @@
|
|||||||
# MQTTnet PowerShell Module
|
|
||||||
|
|
||||||
A PowerShell module for MQTTnet that provides cmdlets for MQTT communication in PowerShell.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- **Full MQTT Protocol Support**: Connect, subscribe, publish, and manage MQTT connections
|
|
||||||
- **TCP and WebSocket Transports**: Support for both TCP and WebSocket connections
|
|
||||||
- **TLS/SSL Support**: Secure connections with TLS encryption
|
|
||||||
- **Async Message Handling**: Register PowerShell ScriptBlocks as message handlers
|
|
||||||
- **Advanced MQTT Features**:
|
|
||||||
- Quality of Service (QoS) levels 0, 1, and 2
|
|
||||||
- Retained messages
|
|
||||||
- Last Will and Testament (LWT)
|
|
||||||
- User properties
|
|
||||||
- Message expiry intervals
|
|
||||||
- Response topics
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
1. Build the MQTTnet.PowerShell project:
|
|
||||||
```powershell
|
|
||||||
dotnet build Source/MQTTnet.PowerShell/MQTTnet.PowerShell.csproj
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Import the module:
|
|
||||||
```powershell
|
|
||||||
Import-Module ./Source/MQTTnet.PowerShell/bin/Debug/net8.0/MQTTnet.PowerShell.dll
|
|
||||||
```
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
### Basic Connection and Publish
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# Create a new MQTT session
|
|
||||||
$session = New-MqttSession
|
|
||||||
|
|
||||||
# Connect to a broker
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com" -Port 1883
|
|
||||||
|
|
||||||
# Publish a message
|
|
||||||
Publish-MqttMessage -Session $session -Topic "test/topic" -Payload "Hello MQTT!"
|
|
||||||
|
|
||||||
# Disconnect and cleanup
|
|
||||||
Disconnect-MqttSession -Session $session
|
|
||||||
Remove-MqttSession -Session $session
|
|
||||||
```
|
|
||||||
|
|
||||||
### Subscribe and Receive Messages
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com"
|
|
||||||
|
|
||||||
# Subscribe to a topic
|
|
||||||
Subscribe-MqttTopic -Session $session -Topic "test/demo"
|
|
||||||
|
|
||||||
# Wait for a message (with timeout)
|
|
||||||
$message = Receive-MqttMessage -Session $session -TimeoutSeconds 30
|
|
||||||
Write-Host "Received: $($message.Payload)"
|
|
||||||
|
|
||||||
Disconnect-MqttSession -Session $session
|
|
||||||
Remove-MqttSession -Session $session
|
|
||||||
```
|
|
||||||
|
|
||||||
### Async Message Handler
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com"
|
|
||||||
|
|
||||||
Subscribe-MqttTopic -Session $session -Topic "test/#"
|
|
||||||
|
|
||||||
# Register a message handler
|
|
||||||
Register-MqttMessageHandler -Session $session -Action {
|
|
||||||
param($topic, $payload, $message)
|
|
||||||
Write-Host "Message on $topic : $payload"
|
|
||||||
Write-Host "QoS: $($message.QoS), Retain: $($message.Retain)"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Messages will be handled asynchronously
|
|
||||||
Start-Sleep -Seconds 60
|
|
||||||
|
|
||||||
Disconnect-MqttSession -Session $session
|
|
||||||
Remove-MqttSession -Session $session
|
|
||||||
```
|
|
||||||
|
|
||||||
## Available Cmdlets
|
|
||||||
|
|
||||||
### Help and Examples
|
|
||||||
|
|
||||||
#### Show-MqttExamples
|
|
||||||
Displays quick examples for common MQTT tasks.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Show-MqttExamples
|
|
||||||
```
|
|
||||||
|
|
||||||
### Session Management
|
|
||||||
|
|
||||||
#### New-MqttSession
|
|
||||||
Creates a new MQTT session.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$session = New-MqttSession
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Connect-MqttSession
|
|
||||||
Connects to an MQTT broker with various options.
|
|
||||||
|
|
||||||
**TCP Connection:**
|
|
||||||
```powershell
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com" -Port 1883
|
|
||||||
```
|
|
||||||
|
|
||||||
**TCP with TLS:**
|
|
||||||
```powershell
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com" -Port 8883 `
|
|
||||||
-UseTls -AllowUntrustedCertificates
|
|
||||||
```
|
|
||||||
|
|
||||||
**WebSocket Connection:**
|
|
||||||
```powershell
|
|
||||||
Connect-MqttSession -Session $session -WebSocketUri "ws://broker.hivemq.com:8000/mqtt"
|
|
||||||
```
|
|
||||||
|
|
||||||
**With Authentication:**
|
|
||||||
```powershell
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com" `
|
|
||||||
-Username "user" -Password "pass"
|
|
||||||
```
|
|
||||||
|
|
||||||
**With Last Will and Testament:**
|
|
||||||
```powershell
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com" `
|
|
||||||
-WillTopic "status/client" -WillPayload "Offline" -WillQoS 1 -WillRetain
|
|
||||||
```
|
|
||||||
|
|
||||||
**Parameters:**
|
|
||||||
- `Session`: The MQTT session (mandatory)
|
|
||||||
- `Host`: Broker hostname (for TCP)
|
|
||||||
- `Port`: Broker port (default: 1883)
|
|
||||||
- `WebSocketUri`: WebSocket URI (for WebSocket connections)
|
|
||||||
- `Username`: Username for authentication
|
|
||||||
- `Password`: Password for authentication
|
|
||||||
- `ClientId`: Client identifier (auto-generated if not specified)
|
|
||||||
- `CleanSession`: Use clean session (default: true)
|
|
||||||
- `UseTls`: Enable TLS encryption
|
|
||||||
- `AllowUntrustedCertificates`: Allow untrusted certificates
|
|
||||||
- `KeepAlivePeriod`: Keep-alive period in seconds (default: 15)
|
|
||||||
- `Timeout`: Connection timeout in seconds (default: 10)
|
|
||||||
- `WillTopic`: Last Will topic
|
|
||||||
- `WillPayload`: Last Will payload
|
|
||||||
- `WillQoS`: Last Will QoS level (0-2)
|
|
||||||
- `WillRetain`: Retain Last Will message
|
|
||||||
|
|
||||||
#### Get-MqttSessionStatus
|
|
||||||
Gets the current status of the MQTT session.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$status = Get-MqttSessionStatus -Session $session
|
|
||||||
Write-Host "Connected: $($status.IsConnected)"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Disconnect-MqttSession
|
|
||||||
Disconnects from the MQTT broker.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Disconnect-MqttSession -Session $session
|
|
||||||
```
|
|
||||||
|
|
||||||
**Parameters:**
|
|
||||||
- `Session`: The MQTT session (mandatory)
|
|
||||||
- `Reason`: Disconnect reason code
|
|
||||||
- `ReasonString`: Human-readable reason
|
|
||||||
- `SessionExpiryInterval`: Session expiry interval
|
|
||||||
|
|
||||||
#### Remove-MqttSession
|
|
||||||
Disposes the MQTT session and releases resources.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Remove-MqttSession -Session $session
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Test-MqttConnection
|
|
||||||
Tests if the MQTT connection is alive by sending a PING packet.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$isAlive = Test-MqttConnection -Session $session -TimeoutSeconds 5
|
|
||||||
Write-Host "Connection is alive: $isAlive"
|
|
||||||
```
|
|
||||||
|
|
||||||
**Parameters:**
|
|
||||||
- `Session`: The MQTT session (mandatory)
|
|
||||||
- `TimeoutSeconds`: Timeout for the ping operation (default: 5)
|
|
||||||
|
|
||||||
### Publishing
|
|
||||||
|
|
||||||
#### Publish-MqttMessage
|
|
||||||
Publishes a message to a topic.
|
|
||||||
|
|
||||||
**Basic:**
|
|
||||||
```powershell
|
|
||||||
Publish-MqttMessage -Session $session -Topic "test/topic" -Payload "Hello"
|
|
||||||
```
|
|
||||||
|
|
||||||
**With QoS and Retain:**
|
|
||||||
```powershell
|
|
||||||
Publish-MqttMessage -Session $session -Topic "test/topic" -Payload "Hello" `
|
|
||||||
-QoS 1 -Retain
|
|
||||||
```
|
|
||||||
|
|
||||||
**With User Properties:**
|
|
||||||
```powershell
|
|
||||||
$props = @{
|
|
||||||
"source" = "PowerShell"
|
|
||||||
"version" = "1.0"
|
|
||||||
}
|
|
||||||
Publish-MqttMessage -Session $session -Topic "test/topic" -Payload "Hello" `
|
|
||||||
-UserProperties $props
|
|
||||||
```
|
|
||||||
|
|
||||||
**Parameters:**
|
|
||||||
- `Session`: The MQTT session (mandatory)
|
|
||||||
- `Topic`: Topic to publish to (mandatory)
|
|
||||||
- `Payload`: Message payload (mandatory)
|
|
||||||
- `QoS`: Quality of Service level (0-2, default: 0)
|
|
||||||
- `Retain`: Retain flag
|
|
||||||
- `ContentType`: Content type of the payload
|
|
||||||
- `ResponseTopic`: Response topic for request/response pattern
|
|
||||||
- `UserProperties`: Hashtable of user properties
|
|
||||||
- `TopicAlias`: Topic alias
|
|
||||||
- `MessageExpiryInterval`: Message expiry interval in seconds
|
|
||||||
|
|
||||||
### Subscribing
|
|
||||||
|
|
||||||
#### Subscribe-MqttTopic
|
|
||||||
Subscribes to a topic.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Subscribe-MqttTopic -Session $session -Topic "test/demo" -QoS 1
|
|
||||||
```
|
|
||||||
|
|
||||||
**Parameters:**
|
|
||||||
- `Session`: The MQTT session (mandatory)
|
|
||||||
- `Topic`: Topic filter to subscribe to (mandatory)
|
|
||||||
- `QoS`: Quality of Service level (0-2, default: 0)
|
|
||||||
- `NoLocal`: No local flag
|
|
||||||
- `RetainAsPublished`: Retain as published flag
|
|
||||||
- `RetainHandling`: Retain handling option
|
|
||||||
- `SubscriptionIdentifier`: Subscription identifier
|
|
||||||
|
|
||||||
#### Unsubscribe-MqttTopic
|
|
||||||
Unsubscribes from a topic.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Unsubscribe-MqttTopic -Session $session -Topic "test/demo"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Message Handling
|
|
||||||
|
|
||||||
#### Receive-MqttMessage
|
|
||||||
Waits for and receives a single message.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# Wait indefinitely
|
|
||||||
$message = Receive-MqttMessage -Session $session
|
|
||||||
|
|
||||||
# Wait with timeout
|
|
||||||
$message = Receive-MqttMessage -Session $session -TimeoutSeconds 30
|
|
||||||
```
|
|
||||||
|
|
||||||
**Parameters:**
|
|
||||||
- `Session`: The MQTT session (mandatory)
|
|
||||||
- `TimeoutSeconds`: Timeout in seconds (0 = no timeout)
|
|
||||||
|
|
||||||
#### Register-MqttMessageHandler
|
|
||||||
Registers an asynchronous message handler using a PowerShell ScriptBlock.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Register-MqttMessageHandler -Session $session -Action {
|
|
||||||
param($topic, $payload, $message)
|
|
||||||
|
|
||||||
Write-Host "Topic: $topic"
|
|
||||||
Write-Host "Payload: $payload"
|
|
||||||
Write-Host "QoS: $($message.QoS)"
|
|
||||||
|
|
||||||
# Access full message properties
|
|
||||||
if ($message.UserProperties) {
|
|
||||||
foreach ($prop in $message.UserProperties) {
|
|
||||||
Write-Host "Property: $($prop.Name) = $($prop.Value)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The ScriptBlock receives three parameters:
|
|
||||||
1. `$topic`: The message topic (string)
|
|
||||||
2. `$payload`: The message payload as UTF-8 string
|
|
||||||
3. `$message`: The full message object with properties:
|
|
||||||
- `Topic`: Message topic
|
|
||||||
- `Payload`: Payload as string
|
|
||||||
- `RawPayload`: Payload as byte array
|
|
||||||
- `QoS`: Quality of Service level
|
|
||||||
- `Retain`: Retain flag
|
|
||||||
- `ContentType`: Content type
|
|
||||||
- `ResponseTopic`: Response topic
|
|
||||||
- `UserProperties`: List of user properties
|
|
||||||
|
|
||||||
**Parameters:**
|
|
||||||
- `Session`: The MQTT session (mandatory)
|
|
||||||
- `Action`: ScriptBlock to execute for each message (mandatory)
|
|
||||||
|
|
||||||
#### Unregister-MqttMessageHandler
|
|
||||||
Removes all registered message handlers.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Unregister-MqttMessageHandler -Session $session
|
|
||||||
```
|
|
||||||
|
|
||||||
## Advanced Examples
|
|
||||||
|
|
||||||
### Request-Response Pattern
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$session = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com"
|
|
||||||
|
|
||||||
# Responder
|
|
||||||
Subscribe-MqttTopic -Session $session -Topic "request/topic"
|
|
||||||
Register-MqttMessageHandler -Session $session -Action {
|
|
||||||
param($topic, $payload, $message)
|
|
||||||
if ($message.ResponseTopic) {
|
|
||||||
$response = "Response to: $payload"
|
|
||||||
Publish-MqttMessage -Session $session -Topic $message.ResponseTopic `
|
|
||||||
-Payload $response
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Requestor (in another session)
|
|
||||||
$responseSession = New-MqttSession
|
|
||||||
Connect-MqttSession -Session $responseSession -Host "broker.hivemq.com"
|
|
||||||
Subscribe-MqttTopic -Session $responseSession -Topic "response/topic"
|
|
||||||
Publish-MqttMessage -Session $responseSession -Topic "request/topic" `
|
|
||||||
-Payload "Request data" -ResponseTopic "response/topic"
|
|
||||||
|
|
||||||
# Wait for response
|
|
||||||
$response = Receive-MqttMessage -Session $responseSession -TimeoutSeconds 10
|
|
||||||
```
|
|
||||||
|
|
||||||
### High QoS Publishing
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# Publish with QoS 2 (exactly once delivery)
|
|
||||||
$result = Publish-MqttMessage -Session $session -Topic "critical/data" `
|
|
||||||
-Payload "Important data" -QoS 2
|
|
||||||
|
|
||||||
Write-Host "Publish result: $($result.ReasonCode)"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Error Handling in Message Handler
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Register-MqttMessageHandler -Session $session -Action {
|
|
||||||
param($topic, $payload, $message)
|
|
||||||
try {
|
|
||||||
# Process message
|
|
||||||
$data = ConvertFrom-Json $payload
|
|
||||||
# Do something with data
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "Error processing message: $_" -ForegroundColor Red
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Tips and Best Practices
|
|
||||||
|
|
||||||
1. **Always disconnect cleanly**: Use `Disconnect-MqttSession` before `Remove-MqttSession`
|
|
||||||
2. **Use appropriate QoS levels**: QoS 0 for best performance, QoS 1 for reliability, QoS 2 for critical data
|
|
||||||
3. **Handle errors in message handlers**: Wrap handler code in try-catch blocks
|
|
||||||
4. **Use meaningful client IDs**: Set custom client IDs for debugging
|
|
||||||
5. **Secure connections**: Use TLS for production environments
|
|
||||||
6. **Topic design**: Use hierarchical topic structures like `device/sensor/temperature`
|
|
||||||
7. **Clean session**: Use `-CleanSession:$false` to maintain subscriptions across reconnects
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
- .NET 8.0 or later
|
|
||||||
- PowerShell 7.0 or later
|
|
||||||
- MQTTnet library
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This project is licensed under the MIT License - see the LICENSE file in the repository root for details.
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# Quick smoke test for MQTTnet PowerShell Module
|
|
||||||
Import-Module ./bin/Debug/net8.0/MQTTnet.PowerShell.dll -WarningAction SilentlyContinue
|
|
||||||
|
|
||||||
Write-Host "Testing module load..." -ForegroundColor Yellow
|
|
||||||
$commands = Get-Command -Module MQTTnet.PowerShell
|
|
||||||
Write-Host "Found $($commands.Count) cmdlets:" -ForegroundColor Green
|
|
||||||
$commands | ForEach-Object { Write-Host " - $($_.Name)" -ForegroundColor Cyan }
|
|
||||||
|
|
||||||
Write-Host "`nTesting session creation..." -ForegroundColor Yellow
|
|
||||||
$session = New-MqttSession
|
|
||||||
Write-Host "Session created successfully!" -ForegroundColor Green
|
|
||||||
|
|
||||||
Write-Host "`nTesting Show-MqttExamples..." -ForegroundColor Yellow
|
|
||||||
$examples = Show-MqttExamples
|
|
||||||
if ($examples) {
|
|
||||||
Write-Host "Examples retrieved successfully!" -ForegroundColor Green
|
|
||||||
} else {
|
|
||||||
Write-Host "Failed to retrieve examples!" -ForegroundColor Red
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "`nTesting session cleanup..." -ForegroundColor Yellow
|
|
||||||
Remove-MqttSession -Session $session
|
|
||||||
Write-Host "Session removed successfully!" -ForegroundColor Green
|
|
||||||
|
|
||||||
Write-Host "`n✓ All smoke tests passed!" -ForegroundColor Green
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
# MQTTnet PowerShell Module Test Script
|
|
||||||
# This script demonstrates the usage of the MQTTnet PowerShell module
|
|
||||||
|
|
||||||
Import-Module ./bin/Debug/net8.0/MQTTnet.PowerShell.dll
|
|
||||||
|
|
||||||
Write-Host "=== MQTTnet PowerShell Module Test ===" -ForegroundColor Cyan
|
|
||||||
|
|
||||||
# Example 1: Basic TCP connection
|
|
||||||
Write-Host "`n1. Testing basic TCP connection..." -ForegroundColor Yellow
|
|
||||||
$session = New-MqttSession
|
|
||||||
|
|
||||||
try {
|
|
||||||
Connect-MqttSession -Session $session -Host "broker.hivemq.com" -Port 1883
|
|
||||||
Write-Host "Connected successfully!" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Get session status
|
|
||||||
Write-Host "`n2. Getting session status..." -ForegroundColor Yellow
|
|
||||||
$status = Get-MqttSessionStatus -Session $session
|
|
||||||
Write-Host "IsConnected: $($status.IsConnected)" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Example 2: Publish a simple message
|
|
||||||
Write-Host "`n3. Publishing a simple message..." -ForegroundColor Yellow
|
|
||||||
Publish-MqttMessage -Session $session -Topic "test/powershell" -Payload "Hello from PowerShell!"
|
|
||||||
Write-Host "Message published!" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Example 3: Publish with user properties
|
|
||||||
Write-Host "`n4. Publishing with user properties..." -ForegroundColor Yellow
|
|
||||||
$properties = @{
|
|
||||||
"source" = "PowerShell"
|
|
||||||
"version" = "1.0"
|
|
||||||
}
|
|
||||||
Publish-MqttMessage -Session $session -Topic "test/powershell/advanced" -Payload "Advanced message" -UserProperties $properties -QoS 1
|
|
||||||
Write-Host "Message with properties published!" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Example 4: Subscribe and receive messages
|
|
||||||
Write-Host "`n5. Subscribing to topics..." -ForegroundColor Yellow
|
|
||||||
Subscribe-MqttTopic -Session $session -Topic "test/demo"
|
|
||||||
Write-Host "Subscribed to test/demo" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Example 5: Register a message handler
|
|
||||||
Write-Host "`n6. Registering message handler..." -ForegroundColor Yellow
|
|
||||||
Register-MqttMessageHandler -Session $session -Action {
|
|
||||||
param($topic, $payload, $message)
|
|
||||||
Write-Host "Received message on topic: $topic" -ForegroundColor Cyan
|
|
||||||
Write-Host "Payload: $payload" -ForegroundColor White
|
|
||||||
Write-Host "QoS: $($message.QoS)" -ForegroundColor White
|
|
||||||
}
|
|
||||||
Write-Host "Handler registered!" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Publish a test message that the handler will receive
|
|
||||||
Write-Host "`n7. Publishing test message for handler..." -ForegroundColor Yellow
|
|
||||||
Publish-MqttMessage -Session $session -Topic "test/demo" -Payload "Test message for handler"
|
|
||||||
Start-Sleep -Seconds 2
|
|
||||||
|
|
||||||
# Example 6: Unsubscribe
|
|
||||||
Write-Host "`n8. Unsubscribing from topic..." -ForegroundColor Yellow
|
|
||||||
Unsubscribe-MqttTopic -Session $session -Topic "test/demo"
|
|
||||||
Write-Host "Unsubscribed!" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Example 7: Clean disconnect
|
|
||||||
Write-Host "`n9. Disconnecting..." -ForegroundColor Yellow
|
|
||||||
Disconnect-MqttSession -Session $session
|
|
||||||
Write-Host "Disconnected!" -ForegroundColor Green
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "Error: $_" -ForegroundColor Red
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
# Cleanup
|
|
||||||
Remove-MqttSession -Session $session
|
|
||||||
Write-Host "`nSession cleaned up!" -ForegroundColor Green
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "`n=== WebSocket Connection Example ===" -ForegroundColor Cyan
|
|
||||||
|
|
||||||
# Example 8: WebSocket connection
|
|
||||||
Write-Host "`nTesting WebSocket connection..." -ForegroundColor Yellow
|
|
||||||
$wsSession = New-MqttSession
|
|
||||||
|
|
||||||
try {
|
|
||||||
Connect-MqttSession -Session $wsSession -WebSocketUri "ws://broker.hivemq.com:8000/mqtt"
|
|
||||||
Write-Host "Connected via WebSocket!" -ForegroundColor Green
|
|
||||||
|
|
||||||
Publish-MqttMessage -Session $wsSession -Topic "test/websocket" -Payload "Hello via WebSocket!"
|
|
||||||
Write-Host "Message published via WebSocket!" -ForegroundColor Green
|
|
||||||
|
|
||||||
Disconnect-MqttSession -Session $wsSession
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "WebSocket Error: $_" -ForegroundColor Red
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
Remove-MqttSession -Session $wsSession
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "`n=== Connection with Will Message Example ===" -ForegroundColor Cyan
|
|
||||||
|
|
||||||
# Example 9: Connection with Last Will Testament
|
|
||||||
Write-Host "`nTesting connection with Will message..." -ForegroundColor Yellow
|
|
||||||
$willSession = New-MqttSession
|
|
||||||
|
|
||||||
try {
|
|
||||||
Connect-MqttSession -Session $willSession -Host "broker.hivemq.com" `
|
|
||||||
-WillTopic "test/will" -WillPayload "Client disconnected unexpectedly" -WillQoS 1 -WillRetain
|
|
||||||
Write-Host "Connected with Will message configured!" -ForegroundColor Green
|
|
||||||
|
|
||||||
Disconnect-MqttSession -Session $willSession
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "Will Error: $_" -ForegroundColor Red
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
Remove-MqttSession -Session $willSession
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "`n=== All tests completed ===" -ForegroundColor Cyan
|
|
||||||
|
|
||||||
@@ -2,9 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
|
|
||||||
namespace MQTTnet.TestApp;
|
namespace MQTTnet.TestApp;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
|
|
||||||
namespace MQTTnet.TestApp;
|
namespace MQTTnet.TestApp;
|
||||||
|
|||||||
@@ -2,10 +2,8 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Linq;
|
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
|
|
||||||
namespace MQTTnet.TestApp;
|
namespace MQTTnet.TestApp;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,9 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MQTTnet.TestApp;
|
namespace MQTTnet.TestApp;
|
||||||
|
|
||||||
public static class Program
|
public static class Program
|
||||||
|
|||||||
@@ -2,10 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Security.Authentication;
|
using System.Security.Authentication;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using MQTTnet.Extensions.TopicTemplate;
|
using MQTTnet.Extensions.TopicTemplate;
|
||||||
|
|
||||||
namespace MQTTnet.TestApp;
|
namespace MQTTnet.TestApp;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Connections;
|
using Microsoft.AspNetCore.Connections;
|
||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
using MQTTnet.AspNetCore;
|
using MQTTnet.AspNetCore;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.ASP.Mockups;
|
namespace MQTTnet.Tests.ASP.Mockups;
|
||||||
|
|||||||
@@ -2,12 +2,8 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Connections;
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.AspNetCore;
|
using MQTTnet.AspNetCore;
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.AspNetCore;
|
using MQTTnet.AspNetCore;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
|
|||||||
@@ -1,3 +1 @@
|
|||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
|
|
||||||
[assembly: DoNotParallelize]
|
[assembly: DoNotParallelize]
|
||||||
@@ -2,9 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Tests.Mockups;
|
using MQTTnet.Tests.Mockups;
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,8 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.LowLevelClient;
|
using MQTTnet.LowLevelClient;
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
|
|||||||
@@ -2,11 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
|
|||||||
@@ -2,17 +2,11 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System.Linq;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Clients;
|
namespace MQTTnet.Tests.Clients;
|
||||||
|
|
||||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Diagnostics;
|
namespace MQTTnet.Tests.Diagnostics;
|
||||||
|
|||||||
@@ -2,11 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Diagnostics;
|
namespace MQTTnet.Tests.Diagnostics;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Exceptions;
|
namespace MQTTnet.Tests.Exceptions;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Extensions.TopicTemplate;
|
using MQTTnet.Extensions.TopicTemplate;
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Extensions.Rpc;
|
using MQTTnet.Extensions.Rpc;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Factory;
|
namespace MQTTnet.Tests.Factory;
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.IO;
|
|
||||||
using System.Threading;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
using MQTTnet.Diagnostics.Logger;
|
using MQTTnet.Diagnostics.Logger;
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
|
|||||||
@@ -2,9 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
|
|||||||
@@ -2,9 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
using System;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using MQTTnet.Tests.Mockups;
|
using MQTTnet.Tests.Mockups;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Helpers;
|
namespace MQTTnet.Tests.Helpers;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Helpers;
|
namespace MQTTnet.Tests.Helpers;
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Internal;
|
namespace MQTTnet.Tests.Internal;
|
||||||
|
|||||||
@@ -2,11 +2,7 @@
|
|||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Internal;
|
namespace MQTTnet.Tests.Internal;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user