public async Task TestUriConnectionWithAuthAsync()
        {
            var resolver = new MqttConnectionResolver();

            resolver.Configure(ConfigParams.FromTuples(
                                   "connection.uri", "tcp://*****:*****@server1:1883,server2:1883,server3:1883?param1=ABC"
                                   ));

            var connection = await resolver.ResolveAsync(null);

            Assert.Equal("server1:1883,server2:1883,server3:1883", connection.GetAsString("servers"));
            Assert.Equal("test", connection.GetAsString("username"));
            Assert.Equal("pass123", connection.GetAsString("password"));
        }
        public async Task TestSingleConnectionAsync()
        {
            var resolver = new MqttConnectionResolver();

            resolver.Configure(ConfigParams.FromTuples(
                                   "connection.protocol", "tcp",
                                   "connection.host", "localhost",
                                   "connection.port", 1883
                                   ));

            var connection = await resolver.ResolveAsync(null);

            Assert.Equal("localhost:1883", connection.GetAsString("servers"));
            Assert.Null(connection.GetAsString("username"));
            Assert.Null(connection.GetAsString("password"));
        }
        public async Task TestClusterConnectionAsync()
        {
            var resolver = new MqttConnectionResolver();

            resolver.Configure(ConfigParams.FromTuples(
                                   "connections.0.protocol", "tcp",
                                   "connections.0.host", "server1",
                                   "connections.0.port", 1883,
                                   "connections.1.protocol", "tcp",
                                   "connections.1.host", "server2",
                                   "connections.1.port", 1883,
                                   "connections.2.protocol", "tcp",
                                   "connections.2.host", "server3",
                                   "connections.2.port", 1883
                                   ));

            var connection = await resolver.ResolveAsync(null);

            Assert.Equal("server1:1883,server2:1883,server3:1883", connection.GetAsString("servers"));
            Assert.Null(connection.GetAsString("username"));
            Assert.Null(connection.GetAsString("password"));
        }
        /// <summary>
        /// Opens the component.
        /// </summary>
        /// <param name="correlationId">(optional) transaction id to trace execution through call chain.</param>
        public async Task OpenAsync(string correlationId)
        {
            var options = await _connectionResolver.ResolveAsync(correlationId);

            var opts = new MqttClientOptionsBuilder()
                       .WithClientId(_clientId);

            if (_keepAliveTimeout > 0)
            {
                opts.WithKeepAlivePeriod(TimeSpan.FromMilliseconds(_keepAliveTimeout));
            }
            else
            {
                opts.WithNoKeepAlive();
            }

            var uri     = options.GetAsString("servers") ?? "";
            var servers = uri.Split(',');

            foreach (var server in servers)
            {
                var host = server;
                var port = 1883;

                var pos = server.IndexOf(":");
                if (pos > 0)
                {
                    host = server.Substring(0, pos);
                    Int32.TryParse(server.Substring(pos + 1), out port);
                }

                opts.WithTcpServer(host, port);
            }

            var username = options.GetAsString("username");

            if (!string.IsNullOrEmpty(username))
            {
                var password = options.GetAsString("password");
                opts.WithCredentials(username, password);
            }

            //opts.SetAutoReconnect(c.retryConnect)
            //opts.SetConnectTimeout(time.Millisecond * time.Duration(c.connectTimeout))
            //opts.SetConnectRetryInterval(time.Millisecond * time.Duration(c.reconnectTimeout))

            var client = new MqttFactory().CreateMqttClient();

            client.UseDisconnectedHandler(DisconnectedHandlerAsync);
            client.UseApplicationMessageReceivedHandler(MessageReceiveHandlerAsync);

            try
            {
                await client.ConnectAsync(opts.Build());
            }
            catch (Exception ex)
            {
                _logger.Error(correlationId, ex, "Failed to connect to MQTT broker at " + uri);
                throw ex;
            }

            _connection    = client;
            _clientOptions = opts.Build();

            _logger.Debug(correlationId, "Connected to MQTT broker at " + uri);
        }