using MQTTnet; using MQTTnet.Client; using MQTTnet.Client.Options; using MQTTnet.Client.Disconnecting; using MQTTnet.Client.Connecting; using System.Text; namespace MQttConnection { /// /// CLass Connector to connect MQTT Server /// public class Connector { private string _host; private int _port; private bool _tls = true; private string? _username; private string? _password; private string _payload; private string _topic; private string _clientid = "Client"; public event MessageHandler messagehandler; public delegate void MessageHandler(Connector c, Message e); public static IMqttClient client = new MqttFactory().CreateMqttClient(); public string Host { get { return _host; } set { _host = value; } } public int Port { get { return _port; } set { _port = value; } } public string Payload { get { return _payload; } set { _payload = value; } } public bool Tls { get { return _tls; } set { _tls = value; } } public string topic { get { return _topic; } set { _topic = value; } } public string clientid { get { return _clientid; } set { _clientid = value; } } private static MqttClientOptionsBuilder mqttClientOptionsBuilder = new MqttClientOptionsBuilder(); /// /// default constructor /// public Connector() { _host = "localhost"; _port = 1883; _payload = ""; } /// /// constructor with parameters /// /// MQTT Hostname /// Port public Connector(string host, int port) { _host = host; _port = port; _payload = ""; } /// /// constructor with parameters /// /// MQTT Hostname /// Port /// Username /// Password public Connector(string host, int port, string username, string password) { _host = host; _port = port; _username = username; _password = password; _payload = ""; } /// /// Start Mqtt connection /// /// async Task public async Task Initialize() { try { client.UseApplicationMessageReceivedHandler(MessageRecieved); client.UseConnectedHandler(ConnectionHandler); client.UseDisconnectedHandler(DisconnectHandler); var options = BuildClientOptions(); await client.ConnectAsync(options, CancellationToken.None); } catch (Exception ex) { Console.WriteLine(ex.Message); } } /// /// Close Mqtt connection /// /// async Task of bool type public async Task CloseConnection() { await client.DisconnectAsync(); return true; } /// /// Unsubscribe Mqtt Topic /// /// Topic to unsubscribe public async void UnsubscribeTopic(string topic) { await client.UnsubscribeAsync(topic); } /// /// Subscribe Mqtt Topic /// /// Topic to subscribe public async void SubscribeTopic(string topic) { await client.SubscribeAsync(topic); } /// /// Publish asynchronusly /// /// Topic to publish /// Payload /// default true /// default 1 /// async Task public async Task PublishAsync(string topic, string payload, bool retainFlag = true, int qos = 1) => await client.PublishAsync(new MqttApplicationMessageBuilder() .WithTopic(topic) .WithPayload(payload) .WithQualityOfServiceLevel((MQTTnet.Protocol.MqttQualityOfServiceLevel)qos) .WithRetainFlag(retainFlag) .Build()); /// /// Handler for connection /// /// Returns MqttClientConnectedEventArgs private void ConnectionHandler(MqttClientConnectedEventArgs e) { Message message = new (); message.EventMessage = e.ConnectResult.ResultCode.ToString(); messagehandler(this, message); } /// /// Handler for disconnection /// /// Returns MqttClientDisconnectedEventArgs private void DisconnectHandler(MqttClientDisconnectedEventArgs e) { Message message = new (); message.EventMessage = "Connection Closed"; messagehandler(this, message); } /// /// Message Handler /// /// Message of type MqttApplicationMessageReceivedEventArgs private void MessageRecieved(MqttApplicationMessageReceivedEventArgs mq_message) { Payload = Encoding.UTF8.GetString(mq_message.ApplicationMessage.Payload); Message message = new (); message.EventMessage = Payload; messagehandler(this, message); } /// /// Option Builder /// /// IMqttClientOptions /// private IMqttClientOptions BuildClientOptions() { if (_host == null || _port == 0) { throw new ArgumentException("No Host or Port"); } mqttClientOptionsBuilder.WithClientId(_clientid); mqttClientOptionsBuilder.WithTcpServer(_host, _port); mqttClientOptionsBuilder.WithCleanSession(); if (_username != null && _password != null) { mqttClientOptionsBuilder.WithCredentials(_username, _password); } if (_tls) { mqttClientOptionsBuilder.WithTls(); } var options = mqttClientOptionsBuilder.Build(); return options; } } }