mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-15 00:15:15 +08:00
Add more function mappings for MQTTnet Server.
This commit is contained in:
@@ -10,7 +10,7 @@ namespace MQTTnet.AspNetCore
|
|||||||
{
|
{
|
||||||
public class MqttConnectionHandler : ConnectionHandler, IMqttServerAdapter
|
public class MqttConnectionHandler : ConnectionHandler, IMqttServerAdapter
|
||||||
{
|
{
|
||||||
public event EventHandler<MqttServerAdapterClientAcceptedEventArgs> ClientAccepted;
|
public Action<MqttServerAdapterClientAcceptedEventArgs> ClientAcceptedHandler { get; set; }
|
||||||
|
|
||||||
public override async Task OnConnectedAsync(ConnectionContext connection)
|
public override async Task OnConnectedAsync(ConnectionContext connection)
|
||||||
{
|
{
|
||||||
@@ -24,9 +24,9 @@ namespace MQTTnet.AspNetCore
|
|||||||
using (var adapter = new MqttConnectionContext(new MqttPacketFormatterAdapter(), connection))
|
using (var adapter = new MqttConnectionContext(new MqttPacketFormatterAdapter(), connection))
|
||||||
{
|
{
|
||||||
var args = new MqttServerAdapterClientAcceptedEventArgs(adapter);
|
var args = new MqttServerAdapterClientAcceptedEventArgs(adapter);
|
||||||
ClientAccepted?.Invoke(this, args);
|
ClientAcceptedHandler?.Invoke(args);
|
||||||
|
|
||||||
await args.SessionTask;
|
await args.SessionTask.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace MQTTnet.AspNetCore
|
|||||||
{
|
{
|
||||||
public class MqttWebSocketServerAdapter : IMqttServerAdapter
|
public class MqttWebSocketServerAdapter : IMqttServerAdapter
|
||||||
{
|
{
|
||||||
public event EventHandler<MqttServerAdapterClientAcceptedEventArgs> ClientAccepted;
|
public Action<MqttServerAdapterClientAcceptedEventArgs> ClientAcceptedHandler { get; set; }
|
||||||
|
|
||||||
public Task StartAsync(IMqttServerOptions options)
|
public Task StartAsync(IMqttServerOptions options)
|
||||||
{
|
{
|
||||||
@@ -30,7 +30,7 @@ namespace MQTTnet.AspNetCore
|
|||||||
var clientAdapter = new MqttChannelAdapter(new MqttWebSocketChannel(webSocket, endpoint), new MqttPacketFormatterAdapter(), new MqttNetLogger().CreateChildLogger(nameof(MqttWebSocketServerAdapter)));
|
var clientAdapter = new MqttChannelAdapter(new MqttWebSocketChannel(webSocket, endpoint), new MqttPacketFormatterAdapter(), new MqttNetLogger().CreateChildLogger(nameof(MqttWebSocketServerAdapter)));
|
||||||
|
|
||||||
var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);
|
var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);
|
||||||
ClientAccepted?.Invoke(this, eventArgs);
|
ClientAcceptedHandler?.Invoke(eventArgs);
|
||||||
|
|
||||||
if (eventArgs.SessionTask != null)
|
if (eventArgs.SessionTask != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,13 +14,8 @@ namespace MQTTnet.Extensions.ManagedClient
|
|||||||
IManagedMqttClientOptions Options { get; }
|
IManagedMqttClientOptions Options { get; }
|
||||||
|
|
||||||
IMqttClientConnectedHandler ConnectedHandler { get; set; }
|
IMqttClientConnectedHandler ConnectedHandler { get; set; }
|
||||||
[Obsolete("Use ConnectedHandler instead.")]
|
|
||||||
event EventHandler<MqttClientConnectedEventArgs> Connected;
|
|
||||||
|
|
||||||
IMqttClientDisconnectedHandler DisconnectedHandler { get; set; }
|
IMqttClientDisconnectedHandler DisconnectedHandler { get; set; }
|
||||||
[Obsolete("Use DisconnectedHandler instead.")]
|
|
||||||
event EventHandler<MqttClientDisconnectedEventArgs> Disconnected;
|
|
||||||
|
|
||||||
event EventHandler<ApplicationMessageProcessedEventArgs> ApplicationMessageProcessed;
|
event EventHandler<ApplicationMessageProcessedEventArgs> ApplicationMessageProcessed;
|
||||||
event EventHandler<ApplicationMessageSkippedEventArgs> ApplicationMessageSkipped;
|
event EventHandler<ApplicationMessageSkippedEventArgs> ApplicationMessageSkipped;
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ using MQTTnet.Exceptions;
|
|||||||
using MQTTnet.Internal;
|
using MQTTnet.Internal;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
using MqttClientConnectedEventArgs = MQTTnet.Client.Connecting.MqttClientConnectedEventArgs;
|
|
||||||
using MqttClientDisconnectedEventArgs = MQTTnet.Client.Disconnecting.MqttClientDisconnectedEventArgs;
|
|
||||||
|
|
||||||
namespace MQTTnet.Extensions.ManagedClient
|
namespace MQTTnet.Extensions.ManagedClient
|
||||||
{
|
{
|
||||||
@@ -36,14 +34,9 @@ namespace MQTTnet.Extensions.ManagedClient
|
|||||||
|
|
||||||
public ManagedMqttClient(IMqttClient mqttClient, IMqttNetChildLogger logger)
|
public ManagedMqttClient(IMqttClient mqttClient, IMqttNetChildLogger logger)
|
||||||
{
|
{
|
||||||
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
|
||||||
|
|
||||||
_mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
|
_mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
|
||||||
|
|
||||||
_mqttClient.UseConnectedHandler(OnConnected);
|
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
||||||
_mqttClient.UseDisconnectedHandler(OnDisconnected);
|
|
||||||
_mqttClient.UseReceivedApplicationMessageHandler(OnApplicationMessageReceived);
|
|
||||||
|
|
||||||
_logger = logger.CreateChildLogger(nameof(ManagedMqttClient));
|
_logger = logger.CreateChildLogger(nameof(ManagedMqttClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,20 +45,24 @@ namespace MQTTnet.Extensions.ManagedClient
|
|||||||
public int PendingApplicationMessagesCount => _messageQueue.Count;
|
public int PendingApplicationMessagesCount => _messageQueue.Count;
|
||||||
public IManagedMqttClientOptions Options { get; private set; }
|
public IManagedMqttClientOptions Options { get; private set; }
|
||||||
|
|
||||||
public IMqttClientConnectedHandler ConnectedHandler { get; set; }
|
public IMqttClientConnectedHandler ConnectedHandler
|
||||||
public event EventHandler<MqttClientConnectedEventArgs> Connected;
|
|
||||||
|
|
||||||
public IMqttClientDisconnectedHandler DisconnectedHandler { get; set; }
|
|
||||||
public event EventHandler<MqttClientDisconnectedEventArgs> Disconnected;
|
|
||||||
|
|
||||||
|
|
||||||
public IMqttApplicationMessageHandler ReceivedApplicationMessageHandler
|
|
||||||
{
|
{
|
||||||
get => _mqttClient.ReceivedApplicationMessageHandler;
|
get => _mqttClient.ConnectedHandler;
|
||||||
set => _mqttClient.ReceivedApplicationMessageHandler = value;
|
set => _mqttClient.ConnectedHandler = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IMqttClientDisconnectedHandler DisconnectedHandler
|
||||||
|
{
|
||||||
|
get => _mqttClient.DisconnectedHandler;
|
||||||
|
set => _mqttClient.DisconnectedHandler = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IMqttApplicationMessageHandler ApplicationMessageReceivedHandler
|
||||||
|
{
|
||||||
|
get => _mqttClient.ApplicationMessageReceivedHandler;
|
||||||
|
set => _mqttClient.ApplicationMessageReceivedHandler = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler<MqttApplicationMessageReceivedEventArgs> ApplicationMessageReceived;
|
|
||||||
public event EventHandler<ApplicationMessageProcessedEventArgs> ApplicationMessageProcessed;
|
public event EventHandler<ApplicationMessageProcessedEventArgs> ApplicationMessageProcessed;
|
||||||
public event EventHandler<ApplicationMessageSkippedEventArgs> ApplicationMessageSkipped;
|
public event EventHandler<ApplicationMessageSkippedEventArgs> ApplicationMessageSkipped;
|
||||||
|
|
||||||
@@ -420,25 +417,7 @@ namespace MQTTnet.Extensions.ManagedClient
|
|||||||
return ReconnectionResult.NotConnected;
|
return ReconnectionResult.NotConnected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task OnApplicationMessageReceived(MqttApplicationMessageHandlerContext context)
|
|
||||||
{
|
|
||||||
ApplicationMessageReceived?.Invoke(this, new MqttApplicationMessageReceivedEventArgs(context.SenderClientId, context.ApplicationMessage));
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task OnDisconnected(MqttClientDisconnectedEventArgs eventArgs)
|
|
||||||
{
|
|
||||||
Disconnected?.Invoke(this, eventArgs);
|
|
||||||
return DisconnectedHandler?.HandleDisconnectedAsync(eventArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task OnConnected(MqttClientConnectedEventArgs eventArgs)
|
|
||||||
{
|
|
||||||
Connected?.Invoke(this, eventArgs);
|
|
||||||
return ConnectedHandler?.HandleConnectedAsync(eventArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void StartPublishing()
|
private void StartPublishing()
|
||||||
{
|
{
|
||||||
if (_publishingCancellationToken != null)
|
if (_publishingCancellationToken != null)
|
||||||
|
|||||||
@@ -60,28 +60,28 @@ namespace MQTTnet.Extensions.ManagedClient
|
|||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IManagedMqttClient UseReceivedApplicationMessageHandler(this IManagedMqttClient client, Func<MqttApplicationMessageHandlerContext, Task> handler)
|
public static IManagedMqttClient UseApplicationMessageReceivedHandler(this IManagedMqttClient client, Func<MqttApplicationMessageReceivedEventArgs, Task> handler)
|
||||||
{
|
{
|
||||||
if (handler == null)
|
if (handler == null)
|
||||||
{
|
{
|
||||||
client.ReceivedApplicationMessageHandler = null;
|
client.ApplicationMessageReceivedHandler = null;
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
client.ReceivedApplicationMessageHandler = new MqttApplicationMessageHandlerDelegate(handler);
|
client.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(handler);
|
||||||
|
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IManagedMqttClient UseReceivedApplicationMessageHandler(this IManagedMqttClient client, Action<MqttApplicationMessageHandlerContext> handler)
|
public static IManagedMqttClient UseApplicationMessageReceivedHandler(this IManagedMqttClient client, Action<MqttApplicationMessageReceivedEventArgs> handler)
|
||||||
{
|
{
|
||||||
if (handler == null)
|
if (handler == null)
|
||||||
{
|
{
|
||||||
client.ReceivedApplicationMessageHandler = null;
|
client.ApplicationMessageReceivedHandler = null;
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
client.ReceivedApplicationMessageHandler = new MqttApplicationMessageHandlerDelegate(handler);
|
client.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(handler);
|
||||||
|
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Text;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ namespace MQTTnet.Extensions.Rpc
|
|||||||
{
|
{
|
||||||
_mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
|
_mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
|
||||||
|
|
||||||
_mqttClient.ApplicationMessageReceived += OnApplicationMessageReceived;
|
_mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(HandleReceivedApplicationMessageAsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<byte[]> ExecuteAsync(TimeSpan timeout, string methodName, string payload, MqttQualityOfServiceLevel qualityOfServiceLevel)
|
public Task<byte[]> ExecuteAsync(TimeSpan timeout, string methodName, string payload, MqttQualityOfServiceLevel qualityOfServiceLevel)
|
||||||
@@ -102,19 +103,21 @@ namespace MQTTnet.Extensions.Rpc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs eventArgs)
|
private Task HandleReceivedApplicationMessageAsync(MqttApplicationMessageReceivedEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
if (!_waitingCalls.TryRemove(eventArgs.ApplicationMessage.Topic, out var tcs))
|
if (!_waitingCalls.TryRemove(eventArgs.ApplicationMessage.Topic, out var tcs))
|
||||||
{
|
{
|
||||||
return;
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tcs.Task.IsCompleted || tcs.Task.IsCanceled)
|
if (tcs.Task.IsCompleted || tcs.Task.IsCanceled)
|
||||||
{
|
{
|
||||||
return;
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tcs.TrySetResult(eventArgs.ApplicationMessage.Payload);
|
tcs.TrySetResult(eventArgs.ApplicationMessage.Payload);
|
||||||
|
|
||||||
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using MQTTnet.Adapter;
|
||||||
|
using MQTTnet.Diagnostics;
|
||||||
|
using MQTTnet.Server.Logging;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server.Mqtt
|
||||||
|
{
|
||||||
|
public class CustomMqttFactory
|
||||||
|
{
|
||||||
|
private readonly MqttFactory _mqttFactory;
|
||||||
|
|
||||||
|
public CustomMqttFactory(ILogger<MqttServer> logger)
|
||||||
|
{
|
||||||
|
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
||||||
|
|
||||||
|
Logger = new MqttNetLoggerWrapper(logger);
|
||||||
|
|
||||||
|
_mqttFactory = new MqttFactory(Logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IMqttNetLogger Logger { get; }
|
||||||
|
|
||||||
|
public IMqttServer CreateMqttServer(List<IMqttServerAdapter> adapters)
|
||||||
|
{
|
||||||
|
if (adapters == null) throw new ArgumentNullException(nameof(adapters));
|
||||||
|
|
||||||
|
return _mqttFactory.CreateMqttServer(adapters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
public class MqttApplicationMessageInterceptor : IMqttServerApplicationMessageInterceptor
|
public class MqttApplicationMessageInterceptor : IMqttServerApplicationMessageInterceptor
|
||||||
{
|
{
|
||||||
private readonly PythonScriptHostService _pythonScriptHostService;
|
private readonly PythonScriptHostService _pythonScriptHostService;
|
||||||
private readonly ILogger<MqttApplicationMessageInterceptor> _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
public MqttApplicationMessageInterceptor(PythonScriptHostService pythonScriptHostService, ILogger<MqttApplicationMessageInterceptor> logger)
|
public MqttApplicationMessageInterceptor(PythonScriptHostService pythonScriptHostService, ILogger<MqttApplicationMessageInterceptor> logger)
|
||||||
{
|
{
|
||||||
@@ -31,7 +31,7 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
{ "qos", (int)context.ApplicationMessage.QualityOfServiceLevel },
|
{ "qos", (int)context.ApplicationMessage.QualityOfServiceLevel },
|
||||||
{ "retain", context.ApplicationMessage.Retain }
|
{ "retain", context.ApplicationMessage.Retain }
|
||||||
};
|
};
|
||||||
|
|
||||||
_pythonScriptHostService.InvokeOptionalFunction("on_intercept_application_message", pythonContext);
|
_pythonScriptHostService.InvokeOptionalFunction("on_intercept_application_message", pythonContext);
|
||||||
|
|
||||||
context.AcceptPublish = (bool)pythonContext.get("accept_publish", context.AcceptPublish);
|
context.AcceptPublish = (bool)pythonContext.get("accept_publish", context.AcceptPublish);
|
||||||
@@ -46,5 +46,21 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Create dump(object) method in wrapper (creates JSON and prints it).
|
||||||
|
public class PythonMqttApplicationMessageInterceptorContext
|
||||||
|
{
|
||||||
|
public bool accept_connection;
|
||||||
|
|
||||||
|
public bool accept_publish;
|
||||||
|
|
||||||
|
public string client_id;
|
||||||
|
|
||||||
|
public string topic;
|
||||||
|
|
||||||
|
public int qos;
|
||||||
|
|
||||||
|
public bool retain;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using IronPython.Runtime;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using MQTTnet.Server.Scripting;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server.Mqtt
|
||||||
|
{
|
||||||
|
public class MqttClientConnectedHandler : IMqttServerClientConnectedHandler
|
||||||
|
{
|
||||||
|
private readonly PythonScriptHostService _pythonScriptHostService;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
public MqttClientConnectedHandler(PythonScriptHostService pythonScriptHostService, ILogger<MqttClientConnectedHandler> logger)
|
||||||
|
{
|
||||||
|
_pythonScriptHostService = pythonScriptHostService ?? throw new ArgumentNullException(nameof(pythonScriptHostService));
|
||||||
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task HandleClientConnectedAsync(MqttServerClientConnectedEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pythonEventArgs = new PythonDictionary
|
||||||
|
{
|
||||||
|
{ "client_id", eventArgs.ClientId }
|
||||||
|
};
|
||||||
|
|
||||||
|
_pythonScriptHostService.InvokeOptionalFunction("on_client_connected", pythonEventArgs);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
_logger.LogError(exception, "Error while handling client connected event.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using IronPython.Runtime;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using MQTTnet.Server.Scripting;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server.Mqtt
|
||||||
|
{
|
||||||
|
public class MqttClientDisconnectedHandler : IMqttServerClientDisconnectedHandler
|
||||||
|
{
|
||||||
|
private readonly PythonScriptHostService _pythonScriptHostService;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
public MqttClientDisconnectedHandler(PythonScriptHostService pythonScriptHostService, ILogger<MqttClientDisconnectedHandler> logger)
|
||||||
|
{
|
||||||
|
_pythonScriptHostService = pythonScriptHostService ?? throw new ArgumentNullException(nameof(pythonScriptHostService));
|
||||||
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pythonEventArgs = new PythonDictionary
|
||||||
|
{
|
||||||
|
{ "client_id", eventArgs.ClientId },
|
||||||
|
{ "type", PythonConvert.Pythonfy(eventArgs.DisconnectType) }
|
||||||
|
};
|
||||||
|
|
||||||
|
_pythonScriptHostService.InvokeOptionalFunction("on_client_disconnected", pythonEventArgs);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
_logger.LogError(exception, "Error while handling client disconnected event.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using IronPython.Runtime;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using MQTTnet.Server.Scripting;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server.Mqtt
|
||||||
|
{
|
||||||
|
public class MqttClientSubscribedTopicHandler : IMqttServerClientSubscribedTopicHandler
|
||||||
|
{
|
||||||
|
private readonly PythonScriptHostService _pythonScriptHostService;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
public MqttClientSubscribedTopicHandler(PythonScriptHostService pythonScriptHostService, ILogger<MqttClientSubscribedTopicHandler> logger)
|
||||||
|
{
|
||||||
|
_pythonScriptHostService = pythonScriptHostService ?? throw new ArgumentNullException(nameof(pythonScriptHostService));
|
||||||
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task HandleClientSubscribedTopicAsync(MqttServerClientSubscribedTopicEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pythonEventArgs = new PythonDictionary
|
||||||
|
{
|
||||||
|
{ "client_id", eventArgs.ClientId },
|
||||||
|
{ "topic", eventArgs.TopicFilter.Topic },
|
||||||
|
{ "qos", (int)eventArgs.TopicFilter.QualityOfServiceLevel }
|
||||||
|
};
|
||||||
|
|
||||||
|
_pythonScriptHostService.InvokeOptionalFunction("on_client_subscribed_topic", pythonEventArgs);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
_logger.LogError(exception, "Error while handling client subscribed topic event.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using IronPython.Runtime;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using MQTTnet.Server.Scripting;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server.Mqtt
|
||||||
|
{
|
||||||
|
public class MqttClientUnsubscribedTopicHandler : IMqttServerClientUnsubscribedTopicHandler
|
||||||
|
{
|
||||||
|
private readonly PythonScriptHostService _pythonScriptHostService;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
public MqttClientUnsubscribedTopicHandler(PythonScriptHostService pythonScriptHostService, ILogger<MqttClientUnsubscribedTopicHandler> logger)
|
||||||
|
{
|
||||||
|
_pythonScriptHostService = pythonScriptHostService ?? throw new ArgumentNullException(nameof(pythonScriptHostService));
|
||||||
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task HandleClientUnsubscribedTopicAsync(MqttServerClientUnsubscribedTopicEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pythonEventArgs = new PythonDictionary
|
||||||
|
{
|
||||||
|
{ "client_id", eventArgs.ClientId },
|
||||||
|
{ "topic", eventArgs.TopicFilter }
|
||||||
|
};
|
||||||
|
|
||||||
|
_pythonScriptHostService.InvokeOptionalFunction("on_client_unsubscribed_topic", pythonEventArgs);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
_logger.LogError(exception, "Error while handling client unsubscribed topic event.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
public class MqttConnectionValidator : IMqttServerConnectionValidator
|
public class MqttConnectionValidator : IMqttServerConnectionValidator
|
||||||
{
|
{
|
||||||
private readonly PythonScriptHostService _pythonScriptHostService;
|
private readonly PythonScriptHostService _pythonScriptHostService;
|
||||||
private readonly ILogger<MqttConnectionValidator> _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
public MqttConnectionValidator(PythonScriptHostService pythonScriptHostService, ILogger<MqttConnectionValidator> logger)
|
public MqttConnectionValidator(PythonScriptHostService pythonScriptHostService, ILogger<MqttConnectionValidator> logger)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ using MQTTnet.Adapter;
|
|||||||
using MQTTnet.AspNetCore;
|
using MQTTnet.AspNetCore;
|
||||||
using MQTTnet.Implementations;
|
using MQTTnet.Implementations;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using MQTTnet.Server.Logging;
|
|
||||||
using MQTTnet.Server.Scripting;
|
using MQTTnet.Server.Scripting;
|
||||||
|
|
||||||
namespace MQTTnet.Server.Mqtt
|
namespace MQTTnet.Server.Mqtt
|
||||||
@@ -17,6 +16,10 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
{
|
{
|
||||||
private readonly ILogger<MqttServerService> _logger;
|
private readonly ILogger<MqttServerService> _logger;
|
||||||
|
|
||||||
|
private readonly MqttClientConnectedHandler _mqttClientConnectedHandler;
|
||||||
|
private readonly MqttClientDisconnectedHandler _mqttClientDisconnectedHandler;
|
||||||
|
private readonly MqttClientSubscribedTopicHandler _mqttClientSubscribedTopicHandler;
|
||||||
|
private readonly MqttClientUnsubscribedTopicHandler _mqttClientUnsubscribedTopicHandler;
|
||||||
private readonly MqttConnectionValidator _mqttConnectionValidator;
|
private readonly MqttConnectionValidator _mqttConnectionValidator;
|
||||||
private readonly MqttSubscriptionInterceptor _mqttSubscriptionInterceptor;
|
private readonly MqttSubscriptionInterceptor _mqttSubscriptionInterceptor;
|
||||||
private readonly MqttApplicationMessageInterceptor _mqttApplicationMessageInterceptor;
|
private readonly MqttApplicationMessageInterceptor _mqttApplicationMessageInterceptor;
|
||||||
@@ -25,15 +28,22 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
private readonly IMqttServer _mqttServer;
|
private readonly IMqttServer _mqttServer;
|
||||||
|
|
||||||
public MqttServerService(
|
public MqttServerService(
|
||||||
IMqttServerFactory mqttServerFactory,
|
CustomMqttFactory mqttFactory,
|
||||||
MqttWebSocketServerAdapter webSocketServerAdapter,
|
MqttWebSocketServerAdapter webSocketServerAdapter,
|
||||||
MqttNetLoggerWrapper mqttNetLogger,
|
MqttClientConnectedHandler mqttClientConnectedHandler,
|
||||||
|
MqttClientDisconnectedHandler mqttClientDisconnectedHandler,
|
||||||
|
MqttClientSubscribedTopicHandler mqttClientSubscribedTopicHandler,
|
||||||
|
MqttClientUnsubscribedTopicHandler mqttClientUnsubscribedTopicHandler,
|
||||||
MqttConnectionValidator mqttConnectionValidator,
|
MqttConnectionValidator mqttConnectionValidator,
|
||||||
MqttSubscriptionInterceptor mqttSubscriptionInterceptor,
|
MqttSubscriptionInterceptor mqttSubscriptionInterceptor,
|
||||||
MqttApplicationMessageInterceptor mqttApplicationMessageInterceptor,
|
MqttApplicationMessageInterceptor mqttApplicationMessageInterceptor,
|
||||||
PythonScriptHostService pythonScriptHostService,
|
PythonScriptHostService pythonScriptHostService,
|
||||||
ILogger<MqttServerService> logger)
|
ILogger<MqttServerService> logger)
|
||||||
{
|
{
|
||||||
|
_mqttClientConnectedHandler = mqttClientConnectedHandler ?? throw new ArgumentNullException(nameof(mqttClientConnectedHandler));
|
||||||
|
_mqttClientDisconnectedHandler = mqttClientDisconnectedHandler ?? throw new ArgumentNullException(nameof(mqttClientDisconnectedHandler));
|
||||||
|
_mqttClientSubscribedTopicHandler = mqttClientSubscribedTopicHandler ?? throw new ArgumentNullException(nameof(mqttClientSubscribedTopicHandler));
|
||||||
|
_mqttClientUnsubscribedTopicHandler = mqttClientUnsubscribedTopicHandler ?? throw new ArgumentNullException(nameof(mqttClientUnsubscribedTopicHandler));
|
||||||
_mqttConnectionValidator = mqttConnectionValidator ?? throw new ArgumentNullException(nameof(mqttConnectionValidator));
|
_mqttConnectionValidator = mqttConnectionValidator ?? throw new ArgumentNullException(nameof(mqttConnectionValidator));
|
||||||
_mqttSubscriptionInterceptor = mqttSubscriptionInterceptor ?? throw new ArgumentNullException(nameof(mqttSubscriptionInterceptor));
|
_mqttSubscriptionInterceptor = mqttSubscriptionInterceptor ?? throw new ArgumentNullException(nameof(mqttSubscriptionInterceptor));
|
||||||
_mqttApplicationMessageInterceptor = mqttApplicationMessageInterceptor ?? throw new ArgumentNullException(nameof(mqttApplicationMessageInterceptor));
|
_mqttApplicationMessageInterceptor = mqttApplicationMessageInterceptor ?? throw new ArgumentNullException(nameof(mqttApplicationMessageInterceptor));
|
||||||
@@ -42,11 +52,11 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
|
|
||||||
var adapters = new List<IMqttServerAdapter>
|
var adapters = new List<IMqttServerAdapter>
|
||||||
{
|
{
|
||||||
new MqttTcpServerAdapter(new MqttNetChildLoggerWrapper(null, mqttNetLogger)),
|
new MqttTcpServerAdapter(mqttFactory.Logger.CreateChildLogger(nameof(MqttTcpServerAdapter))),
|
||||||
webSocketServerAdapter
|
webSocketServerAdapter
|
||||||
};
|
};
|
||||||
|
|
||||||
_mqttServer = mqttServerFactory.CreateMqttServer(adapters);
|
_mqttServer = mqttFactory.CreateMqttServer(adapters);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Configure()
|
public void Configure()
|
||||||
@@ -61,6 +71,11 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
.WithSubscriptionInterceptor(_mqttSubscriptionInterceptor)
|
.WithSubscriptionInterceptor(_mqttSubscriptionInterceptor)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
_mqttServer.ClientConnectedHandler = _mqttClientConnectedHandler;
|
||||||
|
_mqttServer.ClientDisconnectedHandler = _mqttClientDisconnectedHandler;
|
||||||
|
_mqttServer.ClientSubscribedTopicHandler = _mqttClientSubscribedTopicHandler;
|
||||||
|
_mqttServer.ClientUnsubscribedTopicHandler = _mqttClientUnsubscribedTopicHandler;
|
||||||
|
|
||||||
_mqttServer.StartAsync(options).GetAwaiter().GetResult();
|
_mqttServer.StartAsync(options).GetAwaiter().GetResult();
|
||||||
|
|
||||||
_logger.LogInformation("MQTT server started.");
|
_logger.LogInformation("MQTT server started.");
|
||||||
@@ -68,34 +83,48 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
|
|
||||||
private void Publish(PythonDictionary parameters)
|
private void Publish(PythonDictionary parameters)
|
||||||
{
|
{
|
||||||
var applicationMessageBuilder = new MqttApplicationMessageBuilder()
|
try
|
||||||
.WithTopic((string)parameters.get("topic", null))
|
|
||||||
.WithRetainFlag((bool)parameters.get("retain", false))
|
|
||||||
.WithQualityOfServiceLevel((MqttQualityOfServiceLevel)(int)parameters.get("qos", 0));
|
|
||||||
|
|
||||||
var payload = parameters.get("payload", null);
|
|
||||||
var binaryPayload = new byte[0];
|
|
||||||
|
|
||||||
if (payload is string stringPayload)
|
|
||||||
{
|
{
|
||||||
binaryPayload = Encoding.UTF8.GetBytes(stringPayload);
|
var applicationMessageBuilder = new MqttApplicationMessageBuilder()
|
||||||
|
.WithTopic((string)parameters.get("topic", null))
|
||||||
|
.WithRetainFlag((bool)parameters.get("retain", false))
|
||||||
|
.WithQualityOfServiceLevel((MqttQualityOfServiceLevel)(int)parameters.get("qos", 0));
|
||||||
|
|
||||||
|
var payload = parameters.get("payload", null);
|
||||||
|
byte[] binaryPayload;
|
||||||
|
|
||||||
|
if (payload == null)
|
||||||
|
{
|
||||||
|
binaryPayload = new byte[0];
|
||||||
|
}
|
||||||
|
else if (payload is string stringPayload)
|
||||||
|
{
|
||||||
|
binaryPayload = Encoding.UTF8.GetBytes(stringPayload);
|
||||||
|
}
|
||||||
|
else if (payload is ByteArray byteArray)
|
||||||
|
{
|
||||||
|
binaryPayload = byteArray.ToArray();
|
||||||
|
}
|
||||||
|
else if (payload is IEnumerable<int> intArray)
|
||||||
|
{
|
||||||
|
binaryPayload = intArray.Select(Convert.ToByte).ToArray();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new NotSupportedException("Payload type not supported.");
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationMessageBuilder = applicationMessageBuilder
|
||||||
|
.WithPayload(binaryPayload);
|
||||||
|
|
||||||
|
var applicationMessage = applicationMessageBuilder.Build();
|
||||||
|
|
||||||
|
_mqttServer.PublishAsync(applicationMessage).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
else if (payload is ByteArray byteArray)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
binaryPayload = byteArray.ToArray();
|
_logger.LogError(exception, "Error while publishing application message from server.");
|
||||||
}
|
}
|
||||||
else if (payload is IEnumerable<int> intArray)
|
|
||||||
{
|
|
||||||
binaryPayload = intArray.Select(Convert.ToByte).ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
applicationMessageBuilder = applicationMessageBuilder
|
|
||||||
.WithPayload(binaryPayload);
|
|
||||||
|
|
||||||
var applicationMessage = applicationMessageBuilder.Build();
|
|
||||||
|
|
||||||
_mqttServer.PublishAsync(applicationMessage).GetAwaiter().GetResult();
|
|
||||||
_logger.LogInformation($"Published topic '{applicationMessage.Topic}' from server.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace MQTTnet.Server.Mqtt
|
|||||||
public class MqttSubscriptionInterceptor : IMqttServerSubscriptionInterceptor
|
public class MqttSubscriptionInterceptor : IMqttServerSubscriptionInterceptor
|
||||||
{
|
{
|
||||||
private readonly PythonScriptHostService _pythonScriptHostService;
|
private readonly PythonScriptHostService _pythonScriptHostService;
|
||||||
private readonly ILogger<MqttSubscriptionInterceptor> _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
public MqttSubscriptionInterceptor(PythonScriptHostService pythonScriptHostService, ILogger<MqttSubscriptionInterceptor> logger)
|
public MqttSubscriptionInterceptor(PythonScriptHostService pythonScriptHostService, ILogger<MqttSubscriptionInterceptor> logger)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -48,8 +48,11 @@ namespace MQTTnet.Server
|
|||||||
|
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
Console.WriteLine(@"
|
Console.WriteLine(@"
|
||||||
Version: 1.0.0-alpha1
|
Version: 1.0.0-alpha1
|
||||||
License: MIT (read LICENSE file)
|
License: MIT (read LICENSE file)
|
||||||
|
Sponsoring: https://opencollective.com/mqttnet
|
||||||
|
Support: https://github.com/chkr1011/MQTTnet/issues
|
||||||
|
Docs: https://github.com/chkr1011/MQTTnet/wiki/MQTTnetServer
|
||||||
");
|
");
|
||||||
|
|
||||||
Console.BackgroundColor = ConsoleColor.White;
|
Console.BackgroundColor = ConsoleColor.White;
|
||||||
|
|||||||
@@ -36,12 +36,12 @@ namespace MQTTnet.Server.Scripting
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegisterProxyObject(string name, object action)
|
public void RegisterProxyObject(string name, object @object)
|
||||||
{
|
{
|
||||||
if (name == null) throw new ArgumentNullException(nameof(name));
|
if (name == null) throw new ArgumentNullException(nameof(name));
|
||||||
if (action == null) throw new ArgumentNullException(nameof(action));
|
if (@object == null) throw new ArgumentNullException(nameof(@object));
|
||||||
|
|
||||||
_proxyObjects.Add(name, action);
|
_proxyObjects.Add(name, @object);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InvokeOptionalFunction(string name, object parameters)
|
public void InvokeOptionalFunction(string name, object parameters)
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ def on_intercept_application_message(context):
|
|||||||
This function is invoked for every processed application message. It also allows modifying
|
This function is invoked for every processed application message. It also allows modifying
|
||||||
the message or cancel processing at all.
|
the message or cancel processing at all.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
client_id = context["client_id"]
|
client_id = context["client_id"]
|
||||||
|
|
||||||
if client_id != None:
|
if client_id != None:
|
||||||
@@ -72,3 +73,35 @@ def on_intercept_application_message(context):
|
|||||||
mqtt_net_server.publish(application_message)
|
mqtt_net_server.publish(application_message)
|
||||||
|
|
||||||
print("Client '{client_id}' published topic '{topic}'.".format(client_id=context["client_id"], topic=context["topic"]))
|
print("Client '{client_id}' published topic '{topic}'.".format(client_id=context["client_id"], topic=context["topic"]))
|
||||||
|
|
||||||
|
|
||||||
|
def on_client_connected(event_args):
|
||||||
|
"""
|
||||||
|
This function is called whenever a client has passed the validation is connected.
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("Client '{client_id}' is now connected.".format(client_id=event_args["client_id"]))
|
||||||
|
|
||||||
|
|
||||||
|
def on_client_disconnected(event_args):
|
||||||
|
"""
|
||||||
|
This function is called whenever a client has disconnected.
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("Client '{client_id}' is now disconnected (type = {type}).".format(client_id=event_args["client_id"], type=event_args["type"]))
|
||||||
|
|
||||||
|
|
||||||
|
def on_client_subscribed_topic(event_args):
|
||||||
|
"""
|
||||||
|
This function is called whenever a client has subscribed to a topic (when allowed).
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("Client '{client_id}' has subscribed to '{topic}'.".format(client_id=event_args["client_id"], topic=event_args["topic"]))
|
||||||
|
|
||||||
|
|
||||||
|
def on_client_unsubscribed_topic(event_args):
|
||||||
|
"""
|
||||||
|
This function is called whenever a client has unsubscribed from a topic.
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("Client '{client_id}' has unsubscribed from '{topic}'.".format(client_id=event_args["client_id"], topic=event_args["topic"]))
|
||||||
@@ -50,20 +50,24 @@ namespace MQTTnet.Server
|
|||||||
|
|
||||||
public void ConfigureServices(IServiceCollection services)
|
public void ConfigureServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddSingleton<MqttNetLoggerWrapper>();
|
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
|
||||||
|
|
||||||
services.AddSingleton<PythonIOStream>();
|
services.AddSingleton<PythonIOStream>();
|
||||||
services.AddSingleton<PythonScriptHostService>();
|
services.AddSingleton<PythonScriptHostService>();
|
||||||
services.AddSingleton<DataSharingService>();
|
services.AddSingleton<DataSharingService>();
|
||||||
|
|
||||||
|
services.AddSingleton<MqttNetLoggerWrapper>();
|
||||||
services.AddSingleton<MqttWebSocketServerAdapter>();
|
services.AddSingleton<MqttWebSocketServerAdapter>();
|
||||||
services.AddSingleton<IMqttServerFactory, MqttFactory>();
|
services.AddSingleton<CustomMqttFactory>();
|
||||||
services.AddSingleton<MqttServerService>();
|
services.AddSingleton<MqttServerService>();
|
||||||
|
|
||||||
|
services.AddSingleton<MqttClientConnectedHandler>();
|
||||||
|
services.AddSingleton<MqttClientDisconnectedHandler>();
|
||||||
|
services.AddSingleton<MqttClientSubscribedTopicHandler>();
|
||||||
|
services.AddSingleton<MqttClientUnsubscribedTopicHandler>();
|
||||||
services.AddSingleton<MqttConnectionValidator>();
|
services.AddSingleton<MqttConnectionValidator>();
|
||||||
services.AddSingleton<MqttSubscriptionInterceptor>();
|
services.AddSingleton<MqttSubscriptionInterceptor>();
|
||||||
services.AddSingleton<MqttApplicationMessageInterceptor>();
|
services.AddSingleton<MqttApplicationMessageInterceptor>();
|
||||||
|
|
||||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@ namespace MQTTnet.Adapter
|
|||||||
{
|
{
|
||||||
public interface IMqttServerAdapter : IDisposable
|
public interface IMqttServerAdapter : IDisposable
|
||||||
{
|
{
|
||||||
event EventHandler<MqttServerAdapterClientAcceptedEventArgs> ClientAccepted;
|
Action<MqttServerAdapterClientAcceptedEventArgs> ClientAcceptedHandler { get; set; }
|
||||||
|
|
||||||
Task StartAsync(IMqttServerOptions options);
|
Task StartAsync(IMqttServerOptions options);
|
||||||
Task StopAsync();
|
Task StopAsync();
|
||||||
|
|||||||
@@ -15,13 +15,9 @@ namespace MQTTnet.Client
|
|||||||
IMqttClientOptions Options { get; }
|
IMqttClientOptions Options { get; }
|
||||||
|
|
||||||
IMqttClientConnectedHandler ConnectedHandler { get; set; }
|
IMqttClientConnectedHandler ConnectedHandler { get; set; }
|
||||||
[Obsolete("Use ConnectedHandler instead.")]
|
|
||||||
event EventHandler<MqttClientConnectedEventArgs> Connected;
|
|
||||||
|
|
||||||
IMqttClientDisconnectedHandler DisconnectedHandler { get; set; }
|
IMqttClientDisconnectedHandler DisconnectedHandler { get; set; }
|
||||||
[Obsolete("Use DisconnectedHandler instead.")]
|
|
||||||
event EventHandler<MqttClientDisconnectedEventArgs> Disconnected;
|
|
||||||
|
|
||||||
Task<MqttClientAuthenticateResult> ConnectAsync(IMqttClientOptions options, CancellationToken cancellationToken);
|
Task<MqttClientAuthenticateResult> ConnectAsync(IMqttClientOptions options, CancellationToken cancellationToken);
|
||||||
Task DisconnectAsync(MqttClientDisconnectOptions options, CancellationToken cancellationToken);
|
Task DisconnectAsync(MqttClientDisconnectOptions options, CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
|||||||
@@ -46,15 +46,9 @@ namespace MQTTnet.Client
|
|||||||
|
|
||||||
public IMqttClientConnectedHandler ConnectedHandler { get; set; }
|
public IMqttClientConnectedHandler ConnectedHandler { get; set; }
|
||||||
|
|
||||||
public event EventHandler<MqttClientConnectedEventArgs> Connected;
|
|
||||||
|
|
||||||
public IMqttClientDisconnectedHandler DisconnectedHandler { get; set; }
|
public IMqttClientDisconnectedHandler DisconnectedHandler { get; set; }
|
||||||
|
|
||||||
public event EventHandler<MqttClientDisconnectedEventArgs> Disconnected;
|
public IMqttApplicationMessageHandler ApplicationMessageReceivedHandler { get; set; }
|
||||||
|
|
||||||
public IMqttApplicationMessageHandler ReceivedApplicationMessageHandler { get; set; }
|
|
||||||
|
|
||||||
public event EventHandler<MqttApplicationMessageReceivedEventArgs> ApplicationMessageReceived;
|
|
||||||
|
|
||||||
public bool IsConnected { get; private set; }
|
public bool IsConnected { get; private set; }
|
||||||
|
|
||||||
@@ -106,9 +100,6 @@ namespace MQTTnet.Client
|
|||||||
await connectedHandler.HandleConnectedAsync(new MqttClientConnectedEventArgs(authenticateResult)).ConfigureAwait(false);
|
await connectedHandler.HandleConnectedAsync(new MqttClientConnectedEventArgs(authenticateResult)).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Remove!
|
|
||||||
Connected?.Invoke(this, new MqttClientConnectedEventArgs(authenticateResult));
|
|
||||||
|
|
||||||
return authenticateResult;
|
return authenticateResult;
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
@@ -276,8 +267,6 @@ namespace MQTTnet.Client
|
|||||||
{
|
{
|
||||||
await disconnectedHandler.HandleDisconnectedAsync(new MqttClientDisconnectedEventArgs(clientWasConnected, exception)).ConfigureAwait(false);
|
await disconnectedHandler.HandleDisconnectedAsync(new MqttClientDisconnectedEventArgs(clientWasConnected, exception)).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Disconnected?.Invoke(this, new MqttClientDisconnectedEventArgs(clientWasConnected, exception));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -587,13 +576,11 @@ namespace MQTTnet.Client
|
|||||||
{
|
{
|
||||||
var applicationMessage = _adapter.PacketFormatterAdapter.DataConverter.CreateApplicationMessage(publishPacket);
|
var applicationMessage = _adapter.PacketFormatterAdapter.DataConverter.CreateApplicationMessage(publishPacket);
|
||||||
|
|
||||||
ApplicationMessageReceived?.Invoke(this, new MqttApplicationMessageReceivedEventArgs(Options.ClientId, applicationMessage));
|
var handler = ApplicationMessageReceivedHandler;
|
||||||
|
|
||||||
var handler = ReceivedApplicationMessageHandler;
|
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
{
|
{
|
||||||
return handler.HandleApplicationMessageAsync(
|
return handler.HandleApplicationMessageAsync(
|
||||||
new MqttApplicationMessageHandlerContext(Options.ClientId, applicationMessage));
|
new MqttApplicationMessageReceivedEventArgs(Options.ClientId, applicationMessage));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
|
|||||||
@@ -63,35 +63,35 @@ namespace MQTTnet.Client
|
|||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMqttClient UseReceivedApplicationMessageHandler(this IMqttClient client, Func<MqttApplicationMessageHandlerContext, Task> handler)
|
public static IMqttClient UseApplicationMessageReceivedHandler(this IMqttClient client, Func<MqttApplicationMessageReceivedEventArgs, Task> handler)
|
||||||
{
|
{
|
||||||
if (handler == null)
|
if (handler == null)
|
||||||
{
|
{
|
||||||
client.ReceivedApplicationMessageHandler = null;
|
client.ApplicationMessageReceivedHandler = null;
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
client.ReceivedApplicationMessageHandler = new MqttApplicationMessageHandlerDelegate(handler);
|
client.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(handler);
|
||||||
|
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMqttClient UseReceivedApplicationMessageHandler(this IMqttClient client, Action<MqttApplicationMessageHandlerContext> handler)
|
public static IMqttClient UseApplicationMessageReceivedHandler(this IMqttClient client, Action<MqttApplicationMessageReceivedEventArgs> handler)
|
||||||
{
|
{
|
||||||
if (handler == null)
|
if (handler == null)
|
||||||
{
|
{
|
||||||
client.ReceivedApplicationMessageHandler = null;
|
client.ApplicationMessageReceivedHandler = null;
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
client.ReceivedApplicationMessageHandler = new MqttApplicationMessageHandlerDelegate(handler);
|
client.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(handler);
|
||||||
|
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMqttClient UseReceivedApplicationMessageHandler(this IMqttClient client, IMqttApplicationMessageHandler handler)
|
public static IMqttClient UseApplicationMessageReceivedHandler(this IMqttClient client, IMqttApplicationMessageHandler handler)
|
||||||
{
|
{
|
||||||
client.ReceivedApplicationMessageHandler = handler;
|
client.ApplicationMessageReceivedHandler = handler;
|
||||||
|
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ namespace MQTTnet.Client.Receiving
|
|||||||
{
|
{
|
||||||
public interface IMqttApplicationMessageHandler
|
public interface IMqttApplicationMessageHandler
|
||||||
{
|
{
|
||||||
Task HandleApplicationMessageAsync(MqttApplicationMessageHandlerContext context);
|
Task HandleApplicationMessageAsync(MqttApplicationMessageReceivedEventArgs eventArgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
namespace MQTTnet.Client.Receiving
|
|
||||||
{
|
|
||||||
public class MqttApplicationMessageHandlerContext
|
|
||||||
{
|
|
||||||
public MqttApplicationMessageHandlerContext(string senderClientId, MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
SenderClientId = senderClientId;
|
|
||||||
ApplicationMessage = applicationMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SenderClientId { get; }
|
|
||||||
|
|
||||||
public MqttApplicationMessage ApplicationMessage { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,9 +5,9 @@ namespace MQTTnet.Client.Receiving
|
|||||||
{
|
{
|
||||||
public class MqttApplicationMessageHandlerDelegate : IMqttApplicationMessageHandler
|
public class MqttApplicationMessageHandlerDelegate : IMqttApplicationMessageHandler
|
||||||
{
|
{
|
||||||
private readonly Func<MqttApplicationMessageHandlerContext, Task> _handler;
|
private readonly Func<MqttApplicationMessageReceivedEventArgs, Task> _handler;
|
||||||
|
|
||||||
public MqttApplicationMessageHandlerDelegate(Action<MqttApplicationMessageHandlerContext> handler)
|
public MqttApplicationMessageHandlerDelegate(Action<MqttApplicationMessageReceivedEventArgs> handler)
|
||||||
{
|
{
|
||||||
if (handler == null) throw new ArgumentNullException(nameof(handler));
|
if (handler == null) throw new ArgumentNullException(nameof(handler));
|
||||||
|
|
||||||
@@ -18,12 +18,12 @@ namespace MQTTnet.Client.Receiving
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public MqttApplicationMessageHandlerDelegate(Func<MqttApplicationMessageHandlerContext, Task> handler)
|
public MqttApplicationMessageHandlerDelegate(Func<MqttApplicationMessageReceivedEventArgs, Task> handler)
|
||||||
{
|
{
|
||||||
_handler = handler ?? throw new ArgumentNullException(nameof(handler));
|
_handler = handler ?? throw new ArgumentNullException(nameof(handler));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task HandleApplicationMessageAsync(MqttApplicationMessageHandlerContext context)
|
public Task HandleApplicationMessageAsync(MqttApplicationMessageReceivedEventArgs context)
|
||||||
{
|
{
|
||||||
return _handler(context);
|
return _handler(context);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
using System;
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Client.Receiving;
|
|
||||||
|
|
||||||
namespace MQTTnet
|
namespace MQTTnet
|
||||||
{
|
{
|
||||||
public interface IApplicationMessageReceiver
|
public interface IApplicationMessageReceiver
|
||||||
{
|
{
|
||||||
IMqttApplicationMessageHandler ReceivedApplicationMessageHandler { get; set; }
|
IMqttApplicationMessageHandler ApplicationMessageReceivedHandler { get; set; }
|
||||||
|
|
||||||
[Obsolete("Use _ReceivedApplicationMessageHandler_ instead.")]
|
|
||||||
event EventHandler<MqttApplicationMessageReceivedEventArgs> ApplicationMessageReceived;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ namespace MQTTnet.Implementations
|
|||||||
_logger = logger.CreateChildLogger(nameof(MqttTcpServerAdapter));
|
_logger = logger.CreateChildLogger(nameof(MqttTcpServerAdapter));
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler<MqttServerAdapterClientAcceptedEventArgs> ClientAccepted;
|
public Action<MqttServerAdapterClientAcceptedEventArgs> ClientAcceptedHandler { get; set; }
|
||||||
|
|
||||||
public async Task StartAsync(IMqttServerOptions options)
|
public async Task StartAsync(IMqttServerOptions options)
|
||||||
{
|
{
|
||||||
@@ -73,7 +73,7 @@ namespace MQTTnet.Implementations
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(args.Socket, _options), new MqttPacketFormatterAdapter(), _logger);
|
var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(args.Socket, _options), new MqttPacketFormatterAdapter(), _logger);
|
||||||
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
|
ClientAcceptedHandler?.Invoke(new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace MQTTnet.Implementations
|
|||||||
_logger = logger.CreateChildLogger(nameof(MqttTcpServerAdapter));
|
_logger = logger.CreateChildLogger(nameof(MqttTcpServerAdapter));
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler<MqttServerAdapterClientAcceptedEventArgs> ClientAccepted;
|
public Action<MqttServerAdapterClientAcceptedEventArgs> ClientAcceptedHandler { get; set; }
|
||||||
|
|
||||||
public Task StartAsync(IMqttServerOptions options)
|
public Task StartAsync(IMqttServerOptions options)
|
||||||
{
|
{
|
||||||
@@ -87,9 +87,11 @@ namespace MQTTnet.Implementations
|
|||||||
options,
|
options,
|
||||||
tlsCertificate,
|
tlsCertificate,
|
||||||
_cancellationTokenSource.Token,
|
_cancellationTokenSource.Token,
|
||||||
_logger);
|
_logger)
|
||||||
|
{
|
||||||
|
ClientAcceptedHandler = OnClientAccepted
|
||||||
|
};
|
||||||
|
|
||||||
listenerV4.ClientAccepted += OnClientAccepted;
|
|
||||||
listenerV4.Start();
|
listenerV4.Start();
|
||||||
_listeners.Add(listenerV4);
|
_listeners.Add(listenerV4);
|
||||||
}
|
}
|
||||||
@@ -101,17 +103,19 @@ namespace MQTTnet.Implementations
|
|||||||
options,
|
options,
|
||||||
tlsCertificate,
|
tlsCertificate,
|
||||||
_cancellationTokenSource.Token,
|
_cancellationTokenSource.Token,
|
||||||
_logger);
|
_logger)
|
||||||
|
{
|
||||||
|
ClientAcceptedHandler = OnClientAccepted
|
||||||
|
};
|
||||||
|
|
||||||
listenerV6.ClientAccepted += OnClientAccepted;
|
|
||||||
listenerV6.Start();
|
listenerV6.Start();
|
||||||
_listeners.Add(listenerV6);
|
_listeners.Add(listenerV6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs e)
|
private void OnClientAccepted(MqttServerAdapterClientAcceptedEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
ClientAccepted?.Invoke(this, e);
|
ClientAcceptedHandler?.Invoke(eventArgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ namespace MQTTnet.Implementations
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler<MqttServerAdapterClientAcceptedEventArgs> ClientAccepted;
|
public Action<MqttServerAdapterClientAcceptedEventArgs> ClientAcceptedHandler;
|
||||||
|
|
||||||
public void Start()
|
public void Start()
|
||||||
{
|
{
|
||||||
@@ -88,7 +88,7 @@ namespace MQTTnet.Implementations
|
|||||||
_addressFamily == AddressFamily.InterNetwork ? "ipv4" : "ipv6");
|
_addressFamily == AddressFamily.InterNetwork ? "ipv4" : "ipv6");
|
||||||
|
|
||||||
var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketFormatterAdapter(), _logger);
|
var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketFormatterAdapter(), _logger);
|
||||||
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
|
ClientAcceptedHandler?.Invoke(new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
|
||||||
}
|
}
|
||||||
catch (ObjectDisposedException)
|
catch (ObjectDisposedException)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,16 +11,9 @@ namespace MQTTnet.Server
|
|||||||
event EventHandler Stopped;
|
event EventHandler Stopped;
|
||||||
|
|
||||||
IMqttServerClientConnectedHandler ClientConnectedHandler { get; set; }
|
IMqttServerClientConnectedHandler ClientConnectedHandler { get; set; }
|
||||||
[Obsolete("Use ClientConnectedHandler instead.")]
|
|
||||||
event EventHandler<MqttServerClientConnectedEventArgs> ClientConnected;
|
|
||||||
|
|
||||||
IMqttServerClientDisconnectedHandler ClientDisconnectedHandler { get; set; }
|
IMqttServerClientDisconnectedHandler ClientDisconnectedHandler { get; set; }
|
||||||
[Obsolete("Use ClientDisconnectedHandler instead.")]
|
IMqttServerClientSubscribedTopicHandler ClientSubscribedTopicHandler { get; set; }
|
||||||
event EventHandler<MqttServerClientDisconnectedEventArgs> ClientDisconnected;
|
IMqttServerClientUnsubscribedTopicHandler ClientUnsubscribedTopicHandler { get; set; }
|
||||||
|
|
||||||
event EventHandler<MqttClientSubscribedTopicEventArgs> ClientSubscribedTopic;
|
|
||||||
|
|
||||||
event EventHandler<MqttClientUnsubscribedTopicEventArgs> ClientUnsubscribedTopic;
|
|
||||||
|
|
||||||
IMqttServerOptions Options { get; }
|
IMqttServerOptions Options { get; }
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server
|
||||||
|
{
|
||||||
|
public interface IMqttServerClientSubscribedTopicHandler
|
||||||
|
{
|
||||||
|
Task HandleClientSubscribedTopicAsync(MqttServerClientSubscribedTopicEventArgs eventArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server
|
||||||
|
{
|
||||||
|
public interface IMqttServerClientUnsubscribedTopicHandler
|
||||||
|
{
|
||||||
|
Task HandleClientUnsubscribedTopicAsync(MqttServerClientUnsubscribedTopicEventArgs eventArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -196,7 +196,7 @@ namespace MQTTnet.Server
|
|||||||
applicationMessage = interceptorContext.ApplicationMessage;
|
applicationMessage = interceptorContext.ApplicationMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
_eventDispatcher.OnApplicationMessageReceived(sender?.ClientId, applicationMessage);
|
await _eventDispatcher.HandleApplicationMessageReceivedAsync(sender?.ClientId, applicationMessage).ConfigureAwait(false);
|
||||||
|
|
||||||
if (applicationMessage.Retain)
|
if (applicationMessage.Retain)
|
||||||
{
|
{
|
||||||
@@ -258,7 +258,7 @@ namespace MQTTnet.Server
|
|||||||
|
|
||||||
var connection = await CreateConnectionAsync(channelAdapter, connectPacket).ConfigureAwait(false);
|
var connection = await CreateConnectionAsync(channelAdapter, connectPacket).ConfigureAwait(false);
|
||||||
|
|
||||||
_eventDispatcher.OnClientConnected(clientId);
|
await _eventDispatcher.HandleClientConnectedAsync(clientId).ConfigureAwait(false);
|
||||||
|
|
||||||
disconnectType = await connection.RunAsync().ConfigureAwait(false);
|
disconnectType = await connection.RunAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@@ -288,7 +288,7 @@ namespace MQTTnet.Server
|
|||||||
|
|
||||||
await TryCleanupChannelAsync(channelAdapter).ConfigureAwait(false);
|
await TryCleanupChannelAsync(channelAdapter).ConfigureAwait(false);
|
||||||
|
|
||||||
_eventDispatcher.OnClientDisconnected(clientId, disconnectType);
|
await _eventDispatcher.HandleClientDisconnectedAsync(clientId, disconnectType).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ namespace MQTTnet.Server
|
|||||||
_subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
|
_subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
_eventDispatcher.OnClientSubscribedTopic(_clientId, topicFilter);
|
await _eventDispatcher.HandleClientSubscribedTopicAsync(_clientId, topicFilter).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,12 +85,12 @@ namespace MQTTnet.Server
|
|||||||
_subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
|
_subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
_eventDispatcher.OnClientSubscribedTopic(_clientId, topicFilter);
|
await _eventDispatcher.HandleClientSubscribedTopicAsync(_clientId, topicFilter).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<MqttUnsubAckPacket> UnsubscribeAsync(MqttUnsubscribePacket unsubscribePacket)
|
public async Task<MqttUnsubAckPacket> UnsubscribeAsync(MqttUnsubscribePacket unsubscribePacket)
|
||||||
{
|
{
|
||||||
if (unsubscribePacket == null) throw new ArgumentNullException(nameof(unsubscribePacket));
|
if (unsubscribePacket == null) throw new ArgumentNullException(nameof(unsubscribePacket));
|
||||||
|
|
||||||
@@ -111,12 +111,15 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
unsubAckPacket.ReasonCodes.Add(MqttUnsubscribeReasonCode.NoSubscriptionExisted);
|
unsubAckPacket.ReasonCodes.Add(MqttUnsubscribeReasonCode.NoSubscriptionExisted);
|
||||||
}
|
}
|
||||||
|
|
||||||
_eventDispatcher.OnClientUnsubscribedTopic(_clientId, topicFilter);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.FromResult(unsubAckPacket);
|
foreach (var topicFilter in unsubscribePacket.TopicFilters)
|
||||||
|
{
|
||||||
|
await _eventDispatcher.HandleClientUnsubscribedTopicAsync(_clientId, topicFilter).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return unsubAckPacket;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task UnsubscribeAsync(IEnumerable<string> topicFilters)
|
public Task UnsubscribeAsync(IEnumerable<string> topicFilters)
|
||||||
|
|||||||
@@ -28,40 +28,40 @@ namespace MQTTnet.Server
|
|||||||
|
|
||||||
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
||||||
_logger = logger.CreateChildLogger(nameof(MqttServer));
|
_logger = logger.CreateChildLogger(nameof(MqttServer));
|
||||||
|
|
||||||
_eventDispatcher.ClientConnected += (s, e) => ClientConnected?.Invoke(s, e);
|
|
||||||
_eventDispatcher.ClientDisconnected += (s, e) => ClientDisconnected?.Invoke(s, e);
|
|
||||||
_eventDispatcher.ClientSubscribedTopic += (s, e) => ClientSubscribedTopic?.Invoke(s, e);
|
|
||||||
_eventDispatcher.ClientUnsubscribedTopic += (s, e) => ClientUnsubscribedTopic?.Invoke(s, e);
|
|
||||||
_eventDispatcher.ApplicationMessageReceived += async (s, e) =>
|
|
||||||
{
|
|
||||||
// TODO: Migrate EventDispatcher to proper handlers and no events anymore.
|
|
||||||
ApplicationMessageReceived?.Invoke(s, e);
|
|
||||||
|
|
||||||
var handler = ReceivedApplicationMessageHandler;
|
|
||||||
if (handler != null)
|
|
||||||
{
|
|
||||||
await handler.HandleApplicationMessageAsync(
|
|
||||||
new MqttApplicationMessageHandlerContext(e.ClientId, e.ApplicationMessage)).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler Started;
|
public event EventHandler Started;
|
||||||
public event EventHandler Stopped;
|
public event EventHandler Stopped;
|
||||||
|
|
||||||
public IMqttServerClientConnectedHandler ClientConnectedHandler { get; set; }
|
public IMqttServerClientConnectedHandler ClientConnectedHandler
|
||||||
public event EventHandler<MqttServerClientConnectedEventArgs> ClientConnected;
|
{
|
||||||
|
get => _eventDispatcher.ClientConnectedHandler;
|
||||||
|
set => _eventDispatcher.ClientConnectedHandler = value;
|
||||||
|
}
|
||||||
|
|
||||||
public IMqttServerClientDisconnectedHandler ClientDisconnectedHandler { get; set; }
|
public IMqttServerClientDisconnectedHandler ClientDisconnectedHandler
|
||||||
public event EventHandler<MqttServerClientDisconnectedEventArgs> ClientDisconnected;
|
{
|
||||||
|
get => _eventDispatcher.ClientDisconnectedHandler;
|
||||||
|
set => _eventDispatcher.ClientDisconnectedHandler = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IMqttServerClientSubscribedTopicHandler ClientSubscribedTopicHandler
|
||||||
|
{
|
||||||
|
get => _eventDispatcher.ClientSubscribedTopicHandler;
|
||||||
|
set => _eventDispatcher.ClientSubscribedTopicHandler = value;
|
||||||
|
}
|
||||||
|
|
||||||
public event EventHandler<MqttClientSubscribedTopicEventArgs> ClientSubscribedTopic;
|
public IMqttServerClientUnsubscribedTopicHandler ClientUnsubscribedTopicHandler
|
||||||
|
{
|
||||||
public event EventHandler<MqttClientUnsubscribedTopicEventArgs> ClientUnsubscribedTopic;
|
get => _eventDispatcher.ClientUnsubscribedTopicHandler;
|
||||||
|
set => _eventDispatcher.ClientUnsubscribedTopicHandler = value;
|
||||||
public IMqttApplicationMessageHandler ReceivedApplicationMessageHandler { get; set; }
|
}
|
||||||
public event EventHandler<MqttApplicationMessageReceivedEventArgs> ApplicationMessageReceived;
|
|
||||||
|
public IMqttApplicationMessageHandler ApplicationMessageReceivedHandler
|
||||||
|
{
|
||||||
|
get => _eventDispatcher.ApplicationMessageReceivedHandler;
|
||||||
|
set => _eventDispatcher.ApplicationMessageReceivedHandler = value;
|
||||||
|
}
|
||||||
|
|
||||||
public IMqttServerOptions Options { get; private set; }
|
public IMqttServerOptions Options { get; private set; }
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ namespace MQTTnet.Server
|
|||||||
|
|
||||||
foreach (var adapter in _adapters)
|
foreach (var adapter in _adapters)
|
||||||
{
|
{
|
||||||
adapter.ClientAccepted += OnClientAccepted;
|
adapter.ClientAcceptedHandler = OnClientAccepted;
|
||||||
await adapter.StartAsync(Options).ConfigureAwait(false);
|
await adapter.StartAsync(Options).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ namespace MQTTnet.Server
|
|||||||
|
|
||||||
foreach (var adapter in _adapters)
|
foreach (var adapter in _adapters)
|
||||||
{
|
{
|
||||||
adapter.ClientAccepted -= OnClientAccepted;
|
adapter.ClientAcceptedHandler = null;
|
||||||
await adapter.StopAsync().ConfigureAwait(false);
|
await adapter.StopAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +170,7 @@ namespace MQTTnet.Server
|
|||||||
return _retainedMessagesManager?.ClearMessagesAsync();
|
return _retainedMessagesManager?.ClearMessagesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs eventArgs)
|
private void OnClientAccepted(MqttServerAdapterClientAcceptedEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
eventArgs.SessionTask = _clientSessionsManager.HandleConnectionAsync(eventArgs.Client);
|
eventArgs.SessionTask = _clientSessionsManager.HandleConnectionAsync(eventArgs.Client);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
if (handler == null) throw new ArgumentNullException(nameof(handler));
|
if (handler == null) throw new ArgumentNullException(nameof(handler));
|
||||||
|
|
||||||
_handler = context =>
|
_handler = eventArgs =>
|
||||||
{
|
{
|
||||||
handler(context);
|
handler(eventArgs);
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
if (handler == null) throw new ArgumentNullException(nameof(handler));
|
if (handler == null) throw new ArgumentNullException(nameof(handler));
|
||||||
|
|
||||||
_handler = context =>
|
_handler = eventArgs =>
|
||||||
{
|
{
|
||||||
handler(context);
|
handler(eventArgs);
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
namespace MQTTnet.Server
|
namespace MQTTnet.Server
|
||||||
{
|
{
|
||||||
public class MqttClientSubscribedTopicEventArgs : EventArgs
|
public class MqttServerClientSubscribedTopicEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public MqttClientSubscribedTopicEventArgs(string clientId, TopicFilter topicFilter)
|
public MqttServerClientSubscribedTopicEventArgs(string clientId, TopicFilter topicFilter)
|
||||||
{
|
{
|
||||||
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
||||||
TopicFilter = topicFilter ?? throw new ArgumentNullException(nameof(topicFilter));
|
TopicFilter = topicFilter ?? throw new ArgumentNullException(nameof(topicFilter));
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server
|
||||||
|
{
|
||||||
|
public class MqttServerClientSubscribedHandlerDelegate : IMqttServerClientSubscribedTopicHandler
|
||||||
|
{
|
||||||
|
private readonly Func<MqttServerClientSubscribedTopicEventArgs, Task> _handler;
|
||||||
|
|
||||||
|
public MqttServerClientSubscribedHandlerDelegate(Action<MqttServerClientSubscribedTopicEventArgs> handler)
|
||||||
|
{
|
||||||
|
if (handler == null) throw new ArgumentNullException(nameof(handler));
|
||||||
|
|
||||||
|
_handler = eventArgs =>
|
||||||
|
{
|
||||||
|
handler(eventArgs);
|
||||||
|
return Task.FromResult(0);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public MqttServerClientSubscribedHandlerDelegate(Func<MqttServerClientSubscribedTopicEventArgs, Task> handler)
|
||||||
|
{
|
||||||
|
_handler = handler ?? throw new ArgumentNullException(nameof(handler));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task HandleClientSubscribedTopicAsync(MqttServerClientSubscribedTopicEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
return _handler(eventArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
namespace MQTTnet.Server
|
namespace MQTTnet.Server
|
||||||
{
|
{
|
||||||
public class MqttClientUnsubscribedTopicEventArgs : EventArgs
|
public class MqttServerClientUnsubscribedTopicEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public MqttClientUnsubscribedTopicEventArgs(string clientId, string topicFilter)
|
public MqttServerClientUnsubscribedTopicEventArgs(string clientId, string topicFilter)
|
||||||
{
|
{
|
||||||
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
||||||
TopicFilter = topicFilter ?? throw new ArgumentNullException(nameof(topicFilter));
|
TopicFilter = topicFilter ?? throw new ArgumentNullException(nameof(topicFilter));
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server
|
||||||
|
{
|
||||||
|
public class MqttServerClientUnsubscribedTopicHandlerDelegate : IMqttServerClientUnsubscribedTopicHandler
|
||||||
|
{
|
||||||
|
private readonly Func<MqttServerClientUnsubscribedTopicEventArgs, Task> _handler;
|
||||||
|
|
||||||
|
public MqttServerClientUnsubscribedTopicHandlerDelegate(Action<MqttServerClientUnsubscribedTopicEventArgs> handler)
|
||||||
|
{
|
||||||
|
if (handler == null) throw new ArgumentNullException(nameof(handler));
|
||||||
|
|
||||||
|
_handler = eventArgs =>
|
||||||
|
{
|
||||||
|
handler(eventArgs);
|
||||||
|
return Task.FromResult(0);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public MqttServerClientUnsubscribedTopicHandlerDelegate(Func<MqttServerClientUnsubscribedTopicEventArgs, Task> handler)
|
||||||
|
{
|
||||||
|
_handler = handler ?? throw new ArgumentNullException(nameof(handler));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task HandleClientUnsubscribedTopicAsync(MqttServerClientUnsubscribedTopicEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
return _handler(eventArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,42 +1,73 @@
|
|||||||
using System;
|
using System.Threading.Tasks;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
|
|
||||||
namespace MQTTnet.Server
|
namespace MQTTnet.Server
|
||||||
{
|
{
|
||||||
public class MqttServerEventDispatcher
|
public class MqttServerEventDispatcher
|
||||||
{
|
{
|
||||||
public event EventHandler<MqttClientSubscribedTopicEventArgs> ClientSubscribedTopic;
|
public IMqttServerClientConnectedHandler ClientConnectedHandler { get; set; }
|
||||||
|
|
||||||
public event EventHandler<MqttClientUnsubscribedTopicEventArgs> ClientUnsubscribedTopic;
|
public IMqttServerClientDisconnectedHandler ClientDisconnectedHandler { get; set; }
|
||||||
|
|
||||||
public event EventHandler<MqttServerClientConnectedEventArgs> ClientConnected;
|
public IMqttServerClientSubscribedTopicHandler ClientSubscribedTopicHandler { get; set; }
|
||||||
|
|
||||||
public event EventHandler<MqttServerClientDisconnectedEventArgs> ClientDisconnected;
|
public IMqttServerClientUnsubscribedTopicHandler ClientUnsubscribedTopicHandler { get; set; }
|
||||||
|
|
||||||
public event EventHandler<MqttApplicationMessageReceivedEventArgs> ApplicationMessageReceived;
|
public IMqttApplicationMessageHandler ApplicationMessageReceivedHandler { get; set; }
|
||||||
|
|
||||||
public void OnClientSubscribedTopic(string clientId, TopicFilter topicFilter)
|
public Task HandleClientConnectedAsync(string clientId)
|
||||||
{
|
{
|
||||||
ClientSubscribedTopic?.Invoke(this, new MqttClientSubscribedTopicEventArgs(clientId, topicFilter));
|
var handler = ClientConnectedHandler;
|
||||||
|
if (handler == null)
|
||||||
|
{
|
||||||
|
return Task.FromResult(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return handler.HandleClientConnectedAsync(new MqttServerClientConnectedEventArgs(clientId));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnClientUnsubscribedTopic(string clientId, string topicFilter)
|
public Task HandleClientDisconnectedAsync(string clientId, MqttClientDisconnectType disconnectType)
|
||||||
{
|
{
|
||||||
ClientUnsubscribedTopic?.Invoke(this, new MqttClientUnsubscribedTopicEventArgs(clientId, topicFilter));
|
var handler = ClientDisconnectedHandler;
|
||||||
|
if (handler == null)
|
||||||
|
{
|
||||||
|
return Task.FromResult(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return handler.HandleClientDisconnectedAsync(new MqttServerClientDisconnectedEventArgs(clientId, disconnectType));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnClientDisconnected(string clientId, MqttClientDisconnectType disconnectType)
|
public Task HandleClientSubscribedTopicAsync(string clientId, TopicFilter topicFilter)
|
||||||
{
|
{
|
||||||
ClientDisconnected?.Invoke(this, new MqttServerClientDisconnectedEventArgs(clientId, disconnectType));
|
var handler = ClientSubscribedTopicHandler;
|
||||||
|
if (handler == null)
|
||||||
|
{
|
||||||
|
return Task.FromResult(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return handler.HandleClientSubscribedTopicAsync(new MqttServerClientSubscribedTopicEventArgs(clientId, topicFilter));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnApplicationMessageReceived(string senderClientId, MqttApplicationMessage applicationMessage)
|
public Task HandleClientUnsubscribedTopicAsync(string clientId, string topicFilter)
|
||||||
{
|
{
|
||||||
ApplicationMessageReceived?.Invoke(this, new MqttApplicationMessageReceivedEventArgs(senderClientId, applicationMessage));
|
var handler = ClientUnsubscribedTopicHandler;
|
||||||
|
if (handler == null)
|
||||||
|
{
|
||||||
|
return Task.FromResult(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return handler.HandleClientUnsubscribedTopicAsync(new MqttServerClientUnsubscribedTopicEventArgs(clientId, topicFilter));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnClientConnected(string clientId)
|
public Task HandleApplicationMessageReceivedAsync(string senderClientId, MqttApplicationMessage applicationMessage)
|
||||||
{
|
{
|
||||||
ClientConnected?.Invoke(this, new MqttServerClientConnectedEventArgs(clientId));
|
var handler = ApplicationMessageReceivedHandler;
|
||||||
|
if (handler == null)
|
||||||
|
{
|
||||||
|
return Task.FromResult(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return handler.HandleApplicationMessageAsync(new MqttApplicationMessageReceivedEventArgs(senderClientId, applicationMessage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using MQTTnet.Channel;
|
using MQTTnet.Channel;
|
||||||
using MQTTnet.Client;
|
|
||||||
using MQTTnet.Diagnostics;
|
using MQTTnet.Diagnostics;
|
||||||
using MQTTnet.Implementations;
|
using MQTTnet.Implementations;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
@@ -22,7 +21,7 @@ namespace MQTTnet.Benchmarks
|
|||||||
{
|
{
|
||||||
var factory = new MqttFactory();
|
var factory = new MqttFactory();
|
||||||
var tcpServer = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger());
|
var tcpServer = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger());
|
||||||
tcpServer.ClientAccepted += (sender, args) => _serverChannel = (IMqttChannel)args.Client.GetType().GetField("_channel", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(args.Client);
|
tcpServer.ClientAcceptedHandler += args => _serverChannel = (IMqttChannel)args.Client.GetType().GetField("_channel", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(args.Client);
|
||||||
|
|
||||||
_mqttServer = factory.CreateMqttServer(new[] { tcpServer }, new MqttNetLogger());
|
_mqttServer = factory.CreateMqttServer(new[] { tcpServer }, new MqttNetLogger());
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
using MQTTnet.Client.Publishing;
|
using MQTTnet.Client.Publishing;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Client.Subscribing;
|
using MQTTnet.Client.Subscribing;
|
||||||
using MQTTnet.Client.Unsubscribing;
|
using MQTTnet.Client.Unsubscribing;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
@@ -213,13 +214,13 @@ namespace MQTTnet.Tests.MQTTv5
|
|||||||
var receivedMessages = new List<MqttApplicationMessageReceivedEventArgs>();
|
var receivedMessages = new List<MqttApplicationMessageReceivedEventArgs>();
|
||||||
|
|
||||||
await client1.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1").WithClientId("client1").WithProtocolVersion(MqttProtocolVersion.V500).Build());
|
await client1.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1").WithClientId("client1").WithProtocolVersion(MqttProtocolVersion.V500).Build());
|
||||||
client1.ApplicationMessageReceived += (s, e) =>
|
client1.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(e =>
|
||||||
{
|
{
|
||||||
lock (receivedMessages)
|
lock (receivedMessages)
|
||||||
{
|
{
|
||||||
receivedMessages.Add(e);
|
receivedMessages.Add(e);
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
await client1.SubscribeAsync("a");
|
await client1.SubscribeAsync("a");
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace MQTTnet.Tests.Mockups
|
|||||||
{
|
{
|
||||||
public class TestMqttServerAdapter : IMqttServerAdapter
|
public class TestMqttServerAdapter : IMqttServerAdapter
|
||||||
{
|
{
|
||||||
public event EventHandler<MqttServerAdapterClientAcceptedEventArgs> ClientAccepted;
|
public Action<MqttServerAdapterClientAcceptedEventArgs> ClientAcceptedHandler { get; set; }
|
||||||
|
|
||||||
public async Task<IMqttClient> ConnectTestClient(string clientId, MqttApplicationMessage willMessage = null)
|
public async Task<IMqttClient> ConnectTestClient(string clientId, MqttApplicationMessage willMessage = null)
|
||||||
{
|
{
|
||||||
@@ -41,7 +41,7 @@ namespace MQTTnet.Tests.Mockups
|
|||||||
|
|
||||||
private void FireClientAcceptedEvent(IMqttChannelAdapter adapter)
|
private void FireClientAcceptedEvent(IMqttChannelAdapter adapter)
|
||||||
{
|
{
|
||||||
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(adapter));
|
ClientAcceptedHandler?.Invoke(new MqttServerAdapterClientAcceptedEventArgs(adapter));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task StartAsync(IMqttServerOptions options)
|
public Task StartAsync(IMqttServerOptions options)
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using MQTTnet.Client;
|
|
||||||
using MQTTnet.Server;
|
|
||||||
|
|
||||||
namespace MQTTnet.Tests.Mockups
|
|
||||||
{
|
|
||||||
public static class TestServerExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// publishes a message with a client and waits in the server until a message with the same topic is received
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static async Task PublishAndWaitForAsync(this IMqttClient client, IMqttServer server, MqttApplicationMessage message)
|
|
||||||
{
|
|
||||||
var tcs = new TaskCompletionSource<object>();
|
|
||||||
|
|
||||||
void Handler(object sender, MqttApplicationMessageReceivedEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.ApplicationMessage.Topic == message.Topic)
|
|
||||||
{
|
|
||||||
tcs.SetResult(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
server.ApplicationMessageReceived += Handler;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await client.PublishAsync(message).ConfigureAwait(false);
|
|
||||||
await tcs.Task.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
server.ApplicationMessageReceived -= Handler;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,8 +5,9 @@ using System.Net.Sockets;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
|
using MQTTnet.Client.Connecting;
|
||||||
|
using MQTTnet.Client.Disconnecting;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
using MQTTnet.Client.Receiving;
|
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
@@ -45,10 +46,10 @@ namespace MQTTnet.Tests
|
|||||||
using (var client = factory.CreateMqttClient())
|
using (var client = factory.CreateMqttClient())
|
||||||
{
|
{
|
||||||
Exception ex = null;
|
Exception ex = null;
|
||||||
client.Disconnected += (s, e) =>
|
client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(e =>
|
||||||
{
|
{
|
||||||
ex = e.Exception;
|
ex = e.Exception;
|
||||||
};
|
});
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -81,9 +82,9 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
var receivedValues = new List<int>();
|
var receivedValues = new List<int>();
|
||||||
|
|
||||||
async Task Handler1(MqttApplicationMessageHandlerContext context)
|
async Task Handler1(MqttApplicationMessageReceivedEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
var value = int.Parse(context.ApplicationMessage.ConvertPayloadToString());
|
var value = int.Parse(eventArgs.ApplicationMessage.ConvertPayloadToString());
|
||||||
await Task.Delay(value);
|
await Task.Delay(value);
|
||||||
|
|
||||||
lock (receivedValues)
|
lock (receivedValues)
|
||||||
@@ -92,7 +93,7 @@ namespace MQTTnet.Tests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client1.UseReceivedApplicationMessageHandler(Handler1);
|
client1.UseApplicationMessageReceivedHandler(Handler1);
|
||||||
|
|
||||||
var client2 = await testEnvironment.ConnectClientAsync();
|
var client2 = await testEnvironment.ConnectClientAsync();
|
||||||
for (var i = MessagesCount; i > 0; i--)
|
for (var i = MessagesCount; i > 0; i--)
|
||||||
@@ -119,27 +120,27 @@ namespace MQTTnet.Tests
|
|||||||
var client1 = await testEnvironment.ConnectClientAsync();
|
var client1 = await testEnvironment.ConnectClientAsync();
|
||||||
await client1.SubscribeAsync("request/+");
|
await client1.SubscribeAsync("request/+");
|
||||||
|
|
||||||
async Task Handler1(MqttApplicationMessageHandlerContext context)
|
async Task Handler1(MqttApplicationMessageReceivedEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
await client1.PublishAsync($"reply/{context.ApplicationMessage.Topic}");
|
await client1.PublishAsync($"reply/{eventArgs.ApplicationMessage.Topic}");
|
||||||
}
|
}
|
||||||
|
|
||||||
client1.UseReceivedApplicationMessageHandler(Handler1);
|
client1.UseApplicationMessageReceivedHandler(Handler1);
|
||||||
|
|
||||||
var client2 = await testEnvironment.ConnectClientAsync();
|
var client2 = await testEnvironment.ConnectClientAsync();
|
||||||
await client2.SubscribeAsync("reply/#");
|
await client2.SubscribeAsync("reply/#");
|
||||||
|
|
||||||
var replies = new List<string>();
|
var replies = new List<string>();
|
||||||
|
|
||||||
void Handler2(MqttApplicationMessageHandlerContext context)
|
void Handler2(MqttApplicationMessageReceivedEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
lock (replies)
|
lock (replies)
|
||||||
{
|
{
|
||||||
replies.Add(context.ApplicationMessage.Topic);
|
replies.Add(eventArgs.ApplicationMessage.Topic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client2.UseReceivedApplicationMessageHandler((Action<MqttApplicationMessageHandlerContext>)Handler2);
|
client2.UseApplicationMessageReceivedHandler((Action<MqttApplicationMessageReceivedEventArgs>)Handler2);
|
||||||
|
|
||||||
await Task.Delay(500);
|
await Task.Delay(500);
|
||||||
|
|
||||||
@@ -163,7 +164,7 @@ namespace MQTTnet.Tests
|
|||||||
var receivedMessages = new List<MqttApplicationMessage>();
|
var receivedMessages = new List<MqttApplicationMessage>();
|
||||||
|
|
||||||
var client1 = await testEnvironment.ConnectClientAsync();
|
var client1 = await testEnvironment.ConnectClientAsync();
|
||||||
client1.UseReceivedApplicationMessageHandler(c =>
|
client1.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (receivedMessages)
|
lock (receivedMessages)
|
||||||
{
|
{
|
||||||
@@ -195,7 +196,7 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
var client = testEnvironment.CreateClient();
|
var client = testEnvironment.CreateClient();
|
||||||
|
|
||||||
client.Connected += async (s, e) =>
|
client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(async e =>
|
||||||
{
|
{
|
||||||
await client.SubscribeAsync("RCU/P1/H0001/R0003");
|
await client.SubscribeAsync("RCU/P1/H0001/R0003");
|
||||||
|
|
||||||
@@ -204,9 +205,9 @@ namespace MQTTnet.Tests
|
|||||||
.WithTopic("RCU/P1/H0001/R0003");
|
.WithTopic("RCU/P1/H0001/R0003");
|
||||||
|
|
||||||
await client.PublishAsync(msg.Build());
|
await client.PublishAsync(msg.Build());
|
||||||
};
|
});
|
||||||
|
|
||||||
client.UseReceivedApplicationMessageHandler(c =>
|
client.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (receivedMessages)
|
lock (receivedMessages)
|
||||||
{
|
{
|
||||||
@@ -241,7 +242,7 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
var retries = 0;
|
var retries = 0;
|
||||||
|
|
||||||
async Task Handler1(MqttApplicationMessageHandlerContext context)
|
async Task Handler1(MqttApplicationMessageReceivedEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
retries++;
|
retries++;
|
||||||
|
|
||||||
@@ -249,7 +250,7 @@ namespace MQTTnet.Tests
|
|||||||
throw new Exception("Broken!");
|
throw new Exception("Broken!");
|
||||||
}
|
}
|
||||||
|
|
||||||
client1.UseReceivedApplicationMessageHandler(Handler1);
|
client1.UseApplicationMessageReceivedHandler(Handler1);
|
||||||
|
|
||||||
var client2 = await testEnvironment.ConnectClientAsync();
|
var client2 = await testEnvironment.ConnectClientAsync();
|
||||||
await client2.PublishAsync("x");
|
await client2.PublishAsync("x");
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
|
|||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|
||||||
namespace MQTTnet.Tests
|
namespace MQTTnet.Tests
|
||||||
@@ -29,10 +30,10 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
TaskCompletionSource<string> response = null;
|
TaskCompletionSource<string> response = null;
|
||||||
|
|
||||||
receiverClient.ApplicationMessageReceived += (sender, args) =>
|
receiverClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(args =>
|
||||||
{
|
{
|
||||||
response?.SetResult(args.ApplicationMessage.ConvertPayloadToString());
|
response?.SetResult(args.ApplicationMessage.ConvertPayloadToString());
|
||||||
};
|
});
|
||||||
|
|
||||||
var times = new List<TimeSpan>();
|
var times = new List<TimeSpan>();
|
||||||
var stopwatch = Stopwatch.StartNew();
|
var stopwatch = Stopwatch.StartNew();
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|||||||
using MQTTnet.Adapter;
|
using MQTTnet.Adapter;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
using MQTTnet.Client.Connecting;
|
using MQTTnet.Client.Connecting;
|
||||||
|
using MQTTnet.Client.Disconnecting;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
using MQTTnet.Tests.Mockups;
|
using MQTTnet.Tests.Mockups;
|
||||||
@@ -66,7 +68,7 @@ namespace MQTTnet.Tests
|
|||||||
var clientOptions = new MqttClientOptionsBuilder().WithWillMessage(willMessage);
|
var clientOptions = new MqttClientOptionsBuilder().WithWillMessage(willMessage);
|
||||||
|
|
||||||
var c1 = await testEnvironment.ConnectClientAsync();
|
var c1 = await testEnvironment.ConnectClientAsync();
|
||||||
c1.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
c1.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(c => Interlocked.Increment(ref receivedMessagesCount));
|
||||||
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
|
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
|
||||||
|
|
||||||
var c2 = await testEnvironment.ConnectClientAsync(clientOptions);
|
var c2 = await testEnvironment.ConnectClientAsync(clientOptions);
|
||||||
@@ -92,7 +94,7 @@ namespace MQTTnet.Tests
|
|||||||
var clientOptions = new MqttClientOptionsBuilder().WithWillMessage(willMessage);
|
var clientOptions = new MqttClientOptionsBuilder().WithWillMessage(willMessage);
|
||||||
|
|
||||||
var c1 = await testEnvironment.ConnectClientAsync();
|
var c1 = await testEnvironment.ConnectClientAsync();
|
||||||
c1.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
||||||
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
|
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
|
||||||
|
|
||||||
var c2 = await testEnvironment.ConnectClientAsync(clientOptions);
|
var c2 = await testEnvironment.ConnectClientAsync(clientOptions);
|
||||||
@@ -114,7 +116,7 @@ namespace MQTTnet.Tests
|
|||||||
var server = await testEnvironment.StartServerAsync();
|
var server = await testEnvironment.StartServerAsync();
|
||||||
|
|
||||||
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("c1"));
|
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("c1"));
|
||||||
c1.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
||||||
|
|
||||||
var c2 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("c2"));
|
var c2 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("c2"));
|
||||||
|
|
||||||
@@ -125,10 +127,10 @@ namespace MQTTnet.Tests
|
|||||||
Assert.AreEqual(0, receivedMessagesCount);
|
Assert.AreEqual(0, receivedMessagesCount);
|
||||||
|
|
||||||
var subscribeEventCalled = false;
|
var subscribeEventCalled = false;
|
||||||
server.ClientSubscribedTopic += (_, e) =>
|
server.ClientSubscribedTopicHandler = new MqttServerClientSubscribedHandlerDelegate(e =>
|
||||||
{
|
{
|
||||||
subscribeEventCalled = e.TopicFilter.Topic == "a" && e.ClientId == "c1";
|
subscribeEventCalled = e.TopicFilter.Topic == "a" && e.ClientId == "c1";
|
||||||
};
|
});
|
||||||
|
|
||||||
await c1.SubscribeAsync(new TopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
|
await c1.SubscribeAsync(new TopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
|
||||||
await Task.Delay(250);
|
await Task.Delay(250);
|
||||||
@@ -139,10 +141,10 @@ namespace MQTTnet.Tests
|
|||||||
Assert.AreEqual(1, receivedMessagesCount);
|
Assert.AreEqual(1, receivedMessagesCount);
|
||||||
|
|
||||||
var unsubscribeEventCalled = false;
|
var unsubscribeEventCalled = false;
|
||||||
server.ClientUnsubscribedTopic += (_, e) =>
|
server.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(e =>
|
||||||
{
|
{
|
||||||
unsubscribeEventCalled = e.TopicFilter == "a" && e.ClientId == "c1";
|
unsubscribeEventCalled = e.TopicFilter == "a" && e.ClientId == "c1";
|
||||||
};
|
});
|
||||||
|
|
||||||
await c1.UnsubscribeAsync("a");
|
await c1.UnsubscribeAsync("a");
|
||||||
await Task.Delay(250);
|
await Task.Delay(250);
|
||||||
@@ -168,7 +170,7 @@ namespace MQTTnet.Tests
|
|||||||
var receivedMessagesCount = 0;
|
var receivedMessagesCount = 0;
|
||||||
|
|
||||||
var client = await testEnvironment.ConnectClientAsync();
|
var client = await testEnvironment.ConnectClientAsync();
|
||||||
client.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
client.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
||||||
|
|
||||||
var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build();
|
var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build();
|
||||||
await client.SubscribeAsync(new TopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
|
await client.SubscribeAsync(new TopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
|
||||||
@@ -194,7 +196,7 @@ namespace MQTTnet.Tests
|
|||||||
var c1 = await testEnvironment.ConnectClientAsync();
|
var c1 = await testEnvironment.ConnectClientAsync();
|
||||||
var c2 = await testEnvironment.ConnectClientAsync();
|
var c2 = await testEnvironment.ConnectClientAsync();
|
||||||
|
|
||||||
c1.UseReceivedApplicationMessageHandler(c =>
|
c1.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (locked)
|
lock (locked)
|
||||||
{
|
{
|
||||||
@@ -202,7 +204,7 @@ namespace MQTTnet.Tests
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
c2.UseReceivedApplicationMessageHandler(c =>
|
c2.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (locked)
|
lock (locked)
|
||||||
{
|
{
|
||||||
@@ -258,12 +260,12 @@ namespace MQTTnet.Tests
|
|||||||
var client = await testEnvironment.ConnectClientAsync();
|
var client = await testEnvironment.ConnectClientAsync();
|
||||||
var receivedMessages = new List<MqttApplicationMessage>();
|
var receivedMessages = new List<MqttApplicationMessage>();
|
||||||
|
|
||||||
client.Connected += async (s, e) =>
|
client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(async e =>
|
||||||
{
|
{
|
||||||
await client.PublishAsync("Connected");
|
await client.PublishAsync("Connected");
|
||||||
};
|
});
|
||||||
|
|
||||||
client.UseReceivedApplicationMessageHandler(c =>
|
client.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (receivedMessages)
|
lock (receivedMessages)
|
||||||
{
|
{
|
||||||
@@ -287,15 +289,12 @@ namespace MQTTnet.Tests
|
|||||||
using (var testEnvironment = new TestEnvironment())
|
using (var testEnvironment = new TestEnvironment())
|
||||||
{
|
{
|
||||||
var server = await testEnvironment.StartServerAsync();
|
var server = await testEnvironment.StartServerAsync();
|
||||||
server.ClientConnected += async (s, e) =>
|
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e => server.SubscribeAsync(e.ClientId, "topic1"));
|
||||||
{
|
|
||||||
await server.SubscribeAsync(e.ClientId, "topic1");
|
|
||||||
};
|
|
||||||
|
|
||||||
var client = await testEnvironment.ConnectClientAsync();
|
var client = await testEnvironment.ConnectClientAsync();
|
||||||
var receivedMessages = new List<MqttApplicationMessage>();
|
var receivedMessages = new List<MqttApplicationMessage>();
|
||||||
|
|
||||||
client.UseReceivedApplicationMessageHandler(c =>
|
client.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (receivedMessages)
|
lock (receivedMessages)
|
||||||
{
|
{
|
||||||
@@ -325,7 +324,7 @@ namespace MQTTnet.Tests
|
|||||||
var disconnectCalled = 0;
|
var disconnectCalled = 0;
|
||||||
|
|
||||||
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder());
|
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder());
|
||||||
c1.Disconnected += (sender, args) => disconnectCalled++;
|
c1.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(e => disconnectCalled++);
|
||||||
|
|
||||||
await Task.Delay(100);
|
await Task.Delay(100);
|
||||||
|
|
||||||
@@ -347,8 +346,8 @@ namespace MQTTnet.Tests
|
|||||||
var clientConnectedCalled = 0;
|
var clientConnectedCalled = 0;
|
||||||
var clientDisconnectedCalled = 0;
|
var clientDisconnectedCalled = 0;
|
||||||
|
|
||||||
server.ClientConnected += (_, __) => Interlocked.Increment(ref clientConnectedCalled);
|
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(_ => Interlocked.Increment(ref clientConnectedCalled));
|
||||||
server.ClientDisconnected += (_, __) => Interlocked.Increment(ref clientDisconnectedCalled);
|
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(_ => Interlocked.Increment(ref clientDisconnectedCalled));
|
||||||
|
|
||||||
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder());
|
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder());
|
||||||
|
|
||||||
@@ -462,7 +461,7 @@ namespace MQTTnet.Tests
|
|||||||
var receivedMessages = 0;
|
var receivedMessages = 0;
|
||||||
|
|
||||||
var c2 = await testEnvironment.ConnectClientAsync();
|
var c2 = await testEnvironment.ConnectClientAsync();
|
||||||
c2.UseReceivedApplicationMessageHandler(c =>
|
c2.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
Interlocked.Increment(ref receivedMessages);
|
Interlocked.Increment(ref receivedMessages);
|
||||||
});
|
});
|
||||||
@@ -500,7 +499,7 @@ namespace MQTTnet.Tests
|
|||||||
var receivedMessagesCount = 0;
|
var receivedMessagesCount = 0;
|
||||||
|
|
||||||
var c2 = await testEnvironment.ConnectClientAsync();
|
var c2 = await testEnvironment.ConnectClientAsync();
|
||||||
c2.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
c2.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
||||||
await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("retained_other").Build());
|
await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("retained_other").Build());
|
||||||
|
|
||||||
await Task.Delay(500);
|
await Task.Delay(500);
|
||||||
@@ -523,7 +522,7 @@ namespace MQTTnet.Tests
|
|||||||
var receivedMessages = new List<MqttApplicationMessage>();
|
var receivedMessages = new List<MqttApplicationMessage>();
|
||||||
|
|
||||||
var c2 = await testEnvironment.ConnectClientAsync();
|
var c2 = await testEnvironment.ConnectClientAsync();
|
||||||
c2.UseReceivedApplicationMessageHandler(c =>
|
c2.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (receivedMessages)
|
lock (receivedMessages)
|
||||||
{
|
{
|
||||||
@@ -558,7 +557,7 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
var c2 = await testEnvironment.ConnectClientAsync();
|
var c2 = await testEnvironment.ConnectClientAsync();
|
||||||
|
|
||||||
c2.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
c2.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
||||||
|
|
||||||
await Task.Delay(200);
|
await Task.Delay(200);
|
||||||
await c2.SubscribeAsync(new TopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
|
await c2.SubscribeAsync(new TopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
|
||||||
@@ -604,7 +603,7 @@ namespace MQTTnet.Tests
|
|||||||
await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("test").Build());
|
await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("test").Build());
|
||||||
|
|
||||||
var isIntercepted = false;
|
var isIntercepted = false;
|
||||||
c2.UseReceivedApplicationMessageHandler(c =>
|
c2.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
isIntercepted = string.Compare("extended", Encoding.UTF8.GetString(c.ApplicationMessage.Payload), StringComparison.Ordinal) == 0;
|
isIntercepted = string.Compare("extended", Encoding.UTF8.GetString(c.ApplicationMessage.Payload), StringComparison.Ordinal) == 0;
|
||||||
});
|
});
|
||||||
@@ -645,7 +644,7 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
await testEnvironment.StartServerAsync(new MqttServerOptionsBuilder());
|
await testEnvironment.StartServerAsync(new MqttServerOptionsBuilder());
|
||||||
var client1 = await testEnvironment.ConnectClientAsync();
|
var client1 = await testEnvironment.ConnectClientAsync();
|
||||||
client1.UseReceivedApplicationMessageHandler(c =>
|
client1.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
receivedBody = c.ApplicationMessage.Payload;
|
receivedBody = c.ApplicationMessage.Payload;
|
||||||
});
|
});
|
||||||
@@ -703,21 +702,21 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
var events = new List<string>();
|
var events = new List<string>();
|
||||||
|
|
||||||
server.ClientConnected += (_, __) =>
|
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(_ =>
|
||||||
{
|
{
|
||||||
lock (events)
|
lock (events)
|
||||||
{
|
{
|
||||||
events.Add("c");
|
events.Add("c");
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
server.ClientDisconnected += (_, __) =>
|
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(_ =>
|
||||||
{
|
{
|
||||||
lock (events)
|
lock (events)
|
||||||
{
|
{
|
||||||
events.Add("d");
|
events.Add("d");
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
var clientOptions = new MqttClientOptionsBuilder()
|
var clientOptions = new MqttClientOptionsBuilder()
|
||||||
.WithClientId("same_id");
|
.WithClientId("same_id");
|
||||||
@@ -888,7 +887,7 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
var buffer = new StringBuilder();
|
var buffer = new StringBuilder();
|
||||||
|
|
||||||
client2.UseReceivedApplicationMessageHandler(c =>
|
client2.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (buffer)
|
lock (buffer)
|
||||||
{
|
{
|
||||||
@@ -952,7 +951,7 @@ namespace MQTTnet.Tests
|
|||||||
await testEnvironment.StartServerAsync(new MqttServerOptionsBuilder());
|
await testEnvironment.StartServerAsync(new MqttServerOptionsBuilder());
|
||||||
|
|
||||||
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("receiver"));
|
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("receiver"));
|
||||||
c1.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
|
||||||
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic(topicFilter).WithQualityOfServiceLevel(filterQualityOfServiceLevel).Build());
|
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic(topicFilter).WithQualityOfServiceLevel(filterQualityOfServiceLevel).Build());
|
||||||
|
|
||||||
var c2 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("sender"));
|
var c2 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("sender"));
|
||||||
|
|||||||
@@ -2,7 +2,10 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
|
using MQTTnet.Client.Connecting;
|
||||||
|
using MQTTnet.Client.Disconnecting;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
namespace MQTTnet.TestApp.NetCore
|
namespace MQTTnet.TestApp.NetCore
|
||||||
@@ -25,7 +28,7 @@ namespace MQTTnet.TestApp.NetCore
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
client.ApplicationMessageReceived += (s, e) =>
|
client.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(e =>
|
||||||
{
|
{
|
||||||
Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###");
|
Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###");
|
||||||
Console.WriteLine($"+ Topic = {e.ApplicationMessage.Topic}");
|
Console.WriteLine($"+ Topic = {e.ApplicationMessage.Topic}");
|
||||||
@@ -33,18 +36,18 @@ namespace MQTTnet.TestApp.NetCore
|
|||||||
Console.WriteLine($"+ QoS = {e.ApplicationMessage.QualityOfServiceLevel}");
|
Console.WriteLine($"+ QoS = {e.ApplicationMessage.QualityOfServiceLevel}");
|
||||||
Console.WriteLine($"+ Retain = {e.ApplicationMessage.Retain}");
|
Console.WriteLine($"+ Retain = {e.ApplicationMessage.Retain}");
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
};
|
});
|
||||||
|
|
||||||
client.Connected += async (s, e) =>
|
client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(async e =>
|
||||||
{
|
{
|
||||||
Console.WriteLine("### CONNECTED WITH SERVER ###");
|
Console.WriteLine("### CONNECTED WITH SERVER ###");
|
||||||
|
|
||||||
await client.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
|
await client.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
|
||||||
|
|
||||||
Console.WriteLine("### SUBSCRIBED ###");
|
Console.WriteLine("### SUBSCRIBED ###");
|
||||||
};
|
});
|
||||||
|
|
||||||
client.Disconnected += async (s, e) =>
|
client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(async e =>
|
||||||
{
|
{
|
||||||
Console.WriteLine("### DISCONNECTED FROM SERVER ###");
|
Console.WriteLine("### DISCONNECTED FROM SERVER ###");
|
||||||
await Task.Delay(TimeSpan.FromSeconds(5));
|
await Task.Delay(TimeSpan.FromSeconds(5));
|
||||||
@@ -57,7 +60,7 @@ namespace MQTTnet.TestApp.NetCore
|
|||||||
{
|
{
|
||||||
Console.WriteLine("### RECONNECTING FAILED ###");
|
Console.WriteLine("### RECONNECTING FAILED ###");
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.IO;
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Extensions.ManagedClient;
|
using MQTTnet.Extensions.ManagedClient;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
@@ -34,10 +35,10 @@ namespace MQTTnet.TestApp.NetCore
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var managedClient = new MqttFactory().CreateManagedMqttClient();
|
var managedClient = new MqttFactory().CreateManagedMqttClient();
|
||||||
managedClient.ApplicationMessageReceived += (s, e) =>
|
managedClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(e =>
|
||||||
{
|
{
|
||||||
Console.WriteLine(">> RECEIVED: " + e.ApplicationMessage.Topic);
|
Console.WriteLine(">> RECEIVED: " + e.ApplicationMessage.Topic);
|
||||||
};
|
});
|
||||||
|
|
||||||
await managedClient.PublishAsync(builder => builder.WithTopic("Step").WithPayload("1"));
|
await managedClient.PublishAsync(builder => builder.WithTopic("Step").WithPayload("1"));
|
||||||
await managedClient.PublishAsync(builder => builder.WithTopic("Step").WithPayload("2").WithAtLeastOnceQoS());
|
await managedClient.PublishAsync(builder => builder.WithTopic("Step").WithPayload("2").WithAtLeastOnceQoS());
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.IO;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
@@ -80,7 +81,7 @@ namespace MQTTnet.TestApp.NetCore
|
|||||||
var topic = Guid.NewGuid().ToString();
|
var topic = Guid.NewGuid().ToString();
|
||||||
|
|
||||||
MqttApplicationMessage receivedMessage = null;
|
MqttApplicationMessage receivedMessage = null;
|
||||||
client.ApplicationMessageReceived += (s, e) => receivedMessage = e.ApplicationMessage;
|
client.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(e => receivedMessage = e.ApplicationMessage);
|
||||||
|
|
||||||
await client.ConnectAsync(options);
|
await client.ConnectAsync(options);
|
||||||
await client.SubscribeAsync(topic, MqttQualityOfServiceLevel.AtLeastOnce);
|
await client.SubscribeAsync(topic, MqttQualityOfServiceLevel.AtLeastOnce);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using MQTTnet.Server;
|
using MQTTnet.Server;
|
||||||
|
|
||||||
@@ -78,12 +79,12 @@ namespace MQTTnet.TestApp.NetCore
|
|||||||
|
|
||||||
var mqttServer = new MqttFactory().CreateMqttServer();
|
var mqttServer = new MqttFactory().CreateMqttServer();
|
||||||
|
|
||||||
mqttServer.ApplicationMessageReceived += (s, e) =>
|
mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageHandlerDelegate(e =>
|
||||||
{
|
{
|
||||||
MqttNetConsoleLogger.PrintToConsole(
|
MqttNetConsoleLogger.PrintToConsole(
|
||||||
$"'{e.ClientId}' reported '{e.ApplicationMessage.Topic}' > '{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}'",
|
$"'{e.ClientId}' reported '{e.ApplicationMessage.Topic}' > '{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}'",
|
||||||
ConsoleColor.Magenta);
|
ConsoleColor.Magenta);
|
||||||
};
|
});
|
||||||
|
|
||||||
//options.ApplicationMessageInterceptor = c =>
|
//options.ApplicationMessageInterceptor = c =>
|
||||||
//{
|
//{
|
||||||
@@ -107,10 +108,10 @@ namespace MQTTnet.TestApp.NetCore
|
|||||||
// }
|
// }
|
||||||
//};
|
//};
|
||||||
|
|
||||||
mqttServer.ClientDisconnected += (s, e) =>
|
mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
|
||||||
{
|
{
|
||||||
Console.Write("Client disconnected event fired.");
|
Console.Write("Client disconnected event fired.");
|
||||||
};
|
});
|
||||||
|
|
||||||
await mqttServer.StartAsync(options);
|
await mqttServer.StartAsync(options);
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,10 @@ using Windows.Security.Cryptography.Certificates;
|
|||||||
using Windows.UI.Core;
|
using Windows.UI.Core;
|
||||||
using Windows.UI.Xaml;
|
using Windows.UI.Xaml;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
|
using MQTTnet.Client.Connecting;
|
||||||
|
using MQTTnet.Client.Disconnecting;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Diagnostics;
|
using MQTTnet.Diagnostics;
|
||||||
using MQTTnet.Exceptions;
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Extensions.ManagedClient;
|
using MQTTnet.Extensions.ManagedClient;
|
||||||
@@ -144,9 +147,9 @@ namespace MQTTnet.TestApp.UniversalWindows
|
|||||||
if (_mqttClient != null)
|
if (_mqttClient != null)
|
||||||
{
|
{
|
||||||
await _mqttClient.DisconnectAsync();
|
await _mqttClient.DisconnectAsync();
|
||||||
_mqttClient.ApplicationMessageReceived -= OnApplicationMessageReceived;
|
_mqttClient.UseApplicationMessageReceivedHandler(HandleReceivedApplicationMessage);
|
||||||
_mqttClient.Connected -= OnConnected;
|
_mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(x => OnConnected(x));
|
||||||
_mqttClient.Disconnected -= OnDisconnected;
|
_mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(x => OnDisconnected(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
var factory = new MqttFactory();
|
var factory = new MqttFactory();
|
||||||
@@ -154,9 +157,9 @@ namespace MQTTnet.TestApp.UniversalWindows
|
|||||||
if (UseManagedClient.IsChecked == true)
|
if (UseManagedClient.IsChecked == true)
|
||||||
{
|
{
|
||||||
_managedMqttClient = factory.CreateManagedMqttClient();
|
_managedMqttClient = factory.CreateManagedMqttClient();
|
||||||
_managedMqttClient.ApplicationMessageReceived += OnApplicationMessageReceived;
|
_managedMqttClient.UseApplicationMessageReceivedHandler(HandleReceivedApplicationMessage);
|
||||||
_managedMqttClient.Connected += OnConnected;
|
_managedMqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(x => OnConnected(x));
|
||||||
_managedMqttClient.Disconnected += OnDisconnected;
|
_managedMqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(x => OnDisconnected(x));
|
||||||
|
|
||||||
await _managedMqttClient.StartAsync(new ManagedMqttClientOptions
|
await _managedMqttClient.StartAsync(new ManagedMqttClientOptions
|
||||||
{
|
{
|
||||||
@@ -166,9 +169,9 @@ namespace MQTTnet.TestApp.UniversalWindows
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_mqttClient = factory.CreateMqttClient();
|
_mqttClient = factory.CreateMqttClient();
|
||||||
_mqttClient.ApplicationMessageReceived += OnApplicationMessageReceived;
|
_mqttClient.UseApplicationMessageReceivedHandler(HandleReceivedApplicationMessage);
|
||||||
_mqttClient.Connected += OnConnected;
|
_mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(x => OnConnected(x));
|
||||||
_mqttClient.Disconnected += OnDisconnected;
|
_mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(x => OnDisconnected(x));
|
||||||
|
|
||||||
await _mqttClient.ConnectAsync(options);
|
await _mqttClient.ConnectAsync(options);
|
||||||
}
|
}
|
||||||
@@ -179,7 +182,7 @@ namespace MQTTnet.TestApp.UniversalWindows
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDisconnected(object sender, MqttClientDisconnectedEventArgs e)
|
private void OnDisconnected(MqttClientDisconnectedEventArgs e)
|
||||||
{
|
{
|
||||||
_traceMessages.Enqueue(new MqttNetLogMessage("", DateTime.Now, -1,
|
_traceMessages.Enqueue(new MqttNetLogMessage("", DateTime.Now, -1,
|
||||||
"", MqttNetLogLevel.Info, "! DISCONNECTED EVENT FIRED", null));
|
"", MqttNetLogLevel.Info, "! DISCONNECTED EVENT FIRED", null));
|
||||||
@@ -187,7 +190,7 @@ namespace MQTTnet.TestApp.UniversalWindows
|
|||||||
Task.Run(UpdateLogAsync);
|
Task.Run(UpdateLogAsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnConnected(object sender, MqttClientConnectedEventArgs e)
|
private void OnConnected(MqttClientConnectedEventArgs e)
|
||||||
{
|
{
|
||||||
_traceMessages.Enqueue(new MqttNetLogMessage("", DateTime.Now, -1,
|
_traceMessages.Enqueue(new MqttNetLogMessage("", DateTime.Now, -1,
|
||||||
"", MqttNetLogLevel.Info, "! CONNECTED EVENT FIRED", null));
|
"", MqttNetLogLevel.Info, "! CONNECTED EVENT FIRED", null));
|
||||||
@@ -195,7 +198,7 @@ namespace MQTTnet.TestApp.UniversalWindows
|
|||||||
Task.Run(UpdateLogAsync);
|
Task.Run(UpdateLogAsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void OnApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs eventArgs)
|
private async Task HandleReceivedApplicationMessage(MqttApplicationMessageReceivedEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
var item = $"Timestamp: {DateTime.Now:O} | Topic: {eventArgs.ApplicationMessage.Topic} | Payload: {Encoding.UTF8.GetString(eventArgs.ApplicationMessage.Payload)} | QoS: {eventArgs.ApplicationMessage.QualityOfServiceLevel}";
|
var item = $"Timestamp: {DateTime.Now:O} | Topic: {eventArgs.ApplicationMessage.Topic} | Payload: {Encoding.UTF8.GetString(eventArgs.ApplicationMessage.Payload)} | QoS: {eventArgs.ApplicationMessage.QualityOfServiceLevel}";
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user