WingMan – Rev 1

Subversion Repositories:
Rev:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Extensions.ManagedClient;

namespace WingMan.Communication
{
    public class MQTTClient : IDisposable
    {
        private IManagedMqttClient Client { get; set; }
        public bool ClientRunning { get; set; }

        public MQTTClient()
        {
            Client = new MqttFactory().CreateManagedMqttClient();
        }

        public async Task Start(IPAddress ipAddress, int port)
        {
            // Setup and start a managed MQTT client.
            var options = new ManagedMqttClientOptionsBuilder()
                .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
                .WithClientOptions(new MqttClientOptionsBuilder()
                    .WithTcpServer(ipAddress.ToString(), port)
                    .WithTls().Build())
                .Build();
            BindHandlers();

            await Client.SubscribeAsync(
                new TopicFilterBuilder()
                    .WithTopic("lobby")
                    .WithTopic("exchange")
                    .Build()
                );

            await Client.StartAsync(options);

            ClientRunning = true;
        }

        private void ClientOnApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
        {

        }

        private void ClientOnConnected(object sender, MqttClientConnectedEventArgs e)
        {

        }

        public async Task Stop()
        {
            UnbindHandlers();

            await Client.StopAsync();

            ClientRunning = false;
        }

        public void Dispose()
        {
            UnbindHandlers();

            Client.StopAsync().Wait();

            Client?.Dispose();
        }

        public void BindHandlers()
        {
            Client.Connected += ClientOnConnected;
            Client.ApplicationMessageReceived += ClientOnApplicationMessageReceived;
        }

        public void UnbindHandlers()
        {
            Client.Connected -= ClientOnConnected;
            Client.ApplicationMessageReceived -= ClientOnApplicationMessageReceived;
        }
    }
}