diff --git a/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs b/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs index b4eec1c2..37dab8d1 100644 --- a/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs +++ b/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs @@ -38,9 +38,9 @@ namespace MQTTnet.Extensions.ManagedClient _mqttClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient)); - _mqttClient.Connected += OnConnected; - _mqttClient.Disconnected += OnDisconnected; - _mqttClient.ApplicationMessageReceived += OnApplicationMessageReceived; + _mqttClient.UseConnectedHandler(OnConnected); + _mqttClient.UseDisconnectedHandler(OnDisconnected); + _mqttClient.UseReceivedApplicationMessageHandler(OnApplicationMessageReceived); _logger = logger.CreateChildLogger(nameof(ManagedMqttClient)); } @@ -415,19 +415,22 @@ namespace MQTTnet.Extensions.ManagedClient } } - private void OnApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs eventArgs) + private Task OnApplicationMessageReceived(MqttApplicationMessageHandlerContext context) { - ApplicationMessageReceived?.Invoke(this, eventArgs); + ApplicationMessageReceived?.Invoke(this, new MqttApplicationMessageReceivedEventArgs(context.SenderClientId, context.ApplicationMessage)); + return Task.FromResult(0); } - private void OnDisconnected(object sender, MqttClientDisconnectedEventArgs eventArgs) + private Task OnDisconnected(MqttClientDisconnectedEventArgs eventArgs) { Disconnected?.Invoke(this, eventArgs); + return Task.FromResult(0); } - private void OnConnected(object sender, MqttClientConnectedEventArgs eventArgs) + private Task OnConnected(MqttClientConnectedEventArgs eventArgs) { Connected?.Invoke(this, eventArgs); + return Task.FromResult(0); } private void StartPublishing() diff --git a/Source/MQTTnet/Client/Connecting/IMqttClientConnectedHandler.cs b/Source/MQTTnet/Client/Connecting/IMqttClientConnectedHandler.cs new file mode 100644 index 00000000..8b7be27e --- /dev/null +++ b/Source/MQTTnet/Client/Connecting/IMqttClientConnectedHandler.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace MQTTnet.Client.Connecting +{ + public interface IMqttClientConnectedHandler + { + Task HandleConnectedAsync(MqttClientConnectedEventArgs eventArgs); + } +} diff --git a/Source/MQTTnet/Client/Connecting/MqttClientConnectedHandlerDelegate.cs b/Source/MQTTnet/Client/Connecting/MqttClientConnectedHandlerDelegate.cs new file mode 100644 index 00000000..96812afe --- /dev/null +++ b/Source/MQTTnet/Client/Connecting/MqttClientConnectedHandlerDelegate.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; + +namespace MQTTnet.Client.Connecting +{ + public class MqttClientConnectedHandlerDelegate : IMqttClientConnectedHandler + { + private readonly Func _handler; + + public MqttClientConnectedHandlerDelegate(Action handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + _handler = context => + { + handler(context); + return Task.FromResult(0); + }; + } + + public MqttClientConnectedHandlerDelegate(Func handler) + { + _handler = handler ?? throw new ArgumentNullException(nameof(handler)); + } + + public Task HandleConnectedAsync(MqttClientConnectedEventArgs eventArgs) + { + return _handler(eventArgs); + } + } +} diff --git a/Source/MQTTnet/Client/Disconnecting/IMqttClientDisconnectedHandler.cs b/Source/MQTTnet/Client/Disconnecting/IMqttClientDisconnectedHandler.cs new file mode 100644 index 00000000..14347bf0 --- /dev/null +++ b/Source/MQTTnet/Client/Disconnecting/IMqttClientDisconnectedHandler.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace MQTTnet.Client.Disconnecting +{ + public interface IMqttClientDisconnectedHandler + { + Task HandleDisconnectedAsync(MqttClientDisconnectedEventArgs eventArgs); + } +} diff --git a/Source/MQTTnet/Client/Disconnecting/MqttClientDisconnectedHandlerDelegate.cs b/Source/MQTTnet/Client/Disconnecting/MqttClientDisconnectedHandlerDelegate.cs new file mode 100644 index 00000000..c02443ed --- /dev/null +++ b/Source/MQTTnet/Client/Disconnecting/MqttClientDisconnectedHandlerDelegate.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; + +namespace MQTTnet.Client.Disconnecting +{ + public class MqttClientDisconnectedHandlerDelegate : IMqttClientDisconnectedHandler + { + private readonly Func _handler; + + public MqttClientDisconnectedHandlerDelegate(Action handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + _handler = context => + { + handler(context); + return Task.FromResult(0); + }; + } + + public MqttClientDisconnectedHandlerDelegate(Func handler) + { + _handler = handler ?? throw new ArgumentNullException(nameof(handler)); + } + + public Task HandleDisconnectedAsync(MqttClientDisconnectedEventArgs eventArgs) + { + return _handler(eventArgs); + } + } +} diff --git a/Source/MQTTnet/Client/IMqttClient.cs b/Source/MQTTnet/Client/IMqttClient.cs index 0e00f009..4e25e9c5 100644 --- a/Source/MQTTnet/Client/IMqttClient.cs +++ b/Source/MQTTnet/Client/IMqttClient.cs @@ -14,7 +14,12 @@ namespace MQTTnet.Client bool IsConnected { get; } IMqttClientOptions Options { get; } + IMqttClientConnectedHandler ConnectedHandler { get; set; } + [Obsolete("Use ConnectedHandler instead.")] event EventHandler Connected; + + IMqttClientDisconnectedHandler DisconnectedHandler { get; set; } + [Obsolete("Use DisconnectedHandler instead.")] event EventHandler Disconnected; Task ConnectAsync(IMqttClientOptions options, CancellationToken cancellationToken); diff --git a/Source/MQTTnet/Client/MqttClient.cs b/Source/MQTTnet/Client/MqttClient.cs index 97cd3f25..6cf248d6 100644 --- a/Source/MQTTnet/Client/MqttClient.cs +++ b/Source/MQTTnet/Client/MqttClient.cs @@ -44,8 +44,12 @@ namespace MQTTnet.Client _logger = logger.CreateChildLogger(nameof(MqttClient)); } + public IMqttClientConnectedHandler ConnectedHandler { get; set; } + public event EventHandler Connected; + public IMqttClientDisconnectedHandler DisconnectedHandler { get; set; } + public event EventHandler Disconnected; public IMqttApplicationMessageHandler ReceivedApplicationMessageHandler { get; set; } @@ -93,10 +97,12 @@ namespace MQTTnet.Client } IsConnected = true; - Connected?.Invoke(this, new MqttClientConnectedEventArgs(authenticateResult)); _logger.Info("Connected."); + Connected?.Invoke(this, new MqttClientConnectedEventArgs(authenticateResult)); + await ConnectedHandler?.HandleConnectedAsync(new MqttClientConnectedEventArgs(authenticateResult)); + return authenticateResult; } catch (Exception exception) @@ -259,6 +265,7 @@ namespace MQTTnet.Client _logger.Info("Disconnected."); Disconnected?.Invoke(this, new MqttClientDisconnectedEventArgs(clientWasConnected, exception)); + await DisconnectedHandler?.HandleDisconnectedAsync(new MqttClientDisconnectedEventArgs(clientWasConnected, exception)); } } diff --git a/Source/MQTTnet/Client/MqttClientExtensions.cs b/Source/MQTTnet/Client/MqttClientExtensions.cs index 752763dd..de1a77ba 100644 --- a/Source/MQTTnet/Client/MqttClientExtensions.cs +++ b/Source/MQTTnet/Client/MqttClientExtensions.cs @@ -15,6 +15,30 @@ namespace MQTTnet.Client { public static class MqttClientExtensions { + public static IMqttClient UseConnectedHandler(this IMqttClient client, Func handler) + { + if (handler == null) + { + client.ConnectedHandler = null; + return client; + } + + client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(handler); + return client; + } + + public static IMqttClient UseDisconnectedHandler(this IMqttClient client, Func handler) + { + if (handler == null) + { + client.DisconnectedHandler = null; + return client; + } + + client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(handler); + return client; + } + public static IMqttClient UseReceivedApplicationMessageHandler(this IMqttClient client, Func handler) { if (handler == null) @@ -143,7 +167,7 @@ namespace MQTTnet.Client await client.PublishAsync(applicationMessage).ConfigureAwait(false); } } - + public static Task PublishAsync(this IMqttClient client, string topic) { if (client == null) throw new ArgumentNullException(nameof(client)); @@ -175,7 +199,7 @@ namespace MQTTnet.Client .WithPayload(payload) .Build()); } - + public static Task PublishAsync(this IMqttClient client, string topic, string payload, MqttQualityOfServiceLevel qualityOfServiceLevel) { if (client == null) throw new ArgumentNullException(nameof(client));