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;
}
}
}