示例#1
0
        static void WebsocketTest()
        {
            logger = new MqttNetLogger();
            logger.LogMessagePublished += LoggerOnLogMessagePublished;
            var endpoint    = Endpoint;
            var queryParams = new StringBuilder();
            var expiresOn   = DateTime.UtcNow.AddDays(2);
            var period      = Convert.ToInt64((expiresOn.ToUniversalTime() - DateTime.UtcNow).TotalSeconds);

            queryParams.AppendFormat("{0}={1}", AWS4SignerBase.X_Amz_Expires, HttpHelpers.UrlEncode(period.ToString()));

            var headers = new Dictionary <string, string> {
            };
            var signer  = new AWS4SignerForQueryParameterAuth()
            {
                EndpointUri = new Uri(endpoint),
                HttpMethod  = "GET",
                Region      = "us-east-1",
                Service     = "iotdevicegateway"
            };

            var authorization = signer.ComputeSignature(headers,
                                                        queryParams.ToString(),
                                                        AWS4SignerBase.EMPTY_BODY_SHA256,
                                                        ACCESS_KEY,
                                                        SECRET_KEY);

            var urlBuilder = new StringBuilder(endpoint.ToString());

            urlBuilder.AppendFormat("?{0}", queryParams.ToString());
            urlBuilder.AppendFormat("&{0}", authorization);
            var presignedUrl = urlBuilder.ToString();

            Task.Run(() => ConnectWs(presignedUrl));
        }
示例#2
0
        public void Setup()
        {
            _logger      = new MqttNetLogger();
            _childLogger = _logger.CreateScopedLogger("child");

            _logger.LogMessagePublished += OnLogMessagePublished;
        }
示例#3
0
        public IMqttServer CreateMqttServer()
        {
            var logger = new MqttNetLogger();

            return(CreateMqttServer(new List <IMqttServerAdapter> {
                new MqttServerAdapter(logger)
            }, logger));
        }
示例#4
0
        public static void ForwardToConsole(MqttNetLogger logger)
        {
            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            logger.LogMessagePublished -= PrintToConsole;
            logger.LogMessagePublished += PrintToConsole;
        }
示例#5
0
        public async Task <bool> ConnectAsync(Uri uri, string username, string password)
        {
            if (BrokerUri == null && uri != null)
            {
                BrokerUri = uri;
            }
            if (BrokerUri != null && uri == null)
            {
                uri = BrokerUri;
            }
            bool initok = false;

            try
            {
                var           factory       = new MqttFactory();
                MqttNetLogger mqttNetLogger = new MqttNetLogger();
                mqttNetLogger.LogMessagePublished += MqttNetLogger_LogMessagePublished;;
                Client = factory.CreateMqttClient(mqttNetLogger);
                var clientOptions = new MqttClientOptionsBuilder()
                                    .WithClientId(uri.ToString() + Guid.NewGuid().ToString())
                                    .WithTcpServer(uri.Host, uri.Port)
                                    .WithCredentials(username, password)
                                    .Build();
                Client.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(args => Client_ApplicationMessageReceived(Client, args));
                Client.ConnectedHandler    = new MqttClientConnectedHandlerDelegate(args => Client_ConnectedAsync(Client, args));
                Client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(async e =>
                {
                    try
                    {
                        await Client.ConnectAsync(clientOptions);
                    }
                    catch (Exception exception)
                    {
                        _logger.LogError("CONNECTING FAILED", exception);
                    }
                });

                try
                {
                    var result = await Client.ConnectAsync(clientOptions);

                    initok = result.ResultCode == MqttClientConnectResultCode.Success;
                }
                catch (Exception exception)
                {
                    _logger.LogError("CONNECTING FAILED", exception);
                }
                _logger.LogInformation("WAITING FOR APPLICATION MESSAGES");
            }
            catch (Exception exception)
            {
                _logger.LogError("CONNECTING FAILED", exception);
            }
            return(initok);
        }
        private static IServiceCollection AddHostedMqttServer(this IServiceCollection services)
        {
            var logger = new MqttNetLogger();

            services.AddSingleton<IMqttNetLogger>(logger);
            services.AddSingleton<MqttHostedServer>();
            services.AddSingleton<IHostedService>(s => s.GetService<MqttHostedServer>());
            services.AddSingleton<IMqttServer>(s => s.GetService<MqttHostedServer>());

            return services;
        }
        public static IMqttServer CreateOrleansMqttSever(this MqttFactory factory, IClusterClient clusterClient, IMqttServerOptions options, ILoggerFactory appLoggerFactory)
        {
            if (clusterClient == null)
            {
                throw new ArgumentNullException(nameof(clusterClient));
            }

            var logger = new MqttNetLogger();

            return(CreateOrleansMqttSever(factory, clusterClient, options, logger, appLoggerFactory.CreateLogger <OrleansManagedMqttServer>()));
        }
        /// <summary>
        /// For use with building a silo, this will wire-up the "orleans" flavor of the MQTTserver object and its supporting infrastructure.
        /// </summary>
        private static IServiceCollection AddHostedOrleansMqttServer(this IServiceCollection services)
        {
            var logger      = new MqttNetLogger();
            var childLogger = logger.CreateChildLogger();

            services.AddSingleton <IMqttNetLogger>(logger);
            services.AddSingleton(childLogger);
            services.AddSingleton <OrleansManagedMqttServer>();
            services.AddSingleton <IHostedService>(s => s.GetService <OrleansManagedMqttServer>());
            services.AddSingleton <IMqttServer>(s => s.GetService <OrleansManagedMqttServer>());

            return(services);
        }
示例#9
0
 public MainWindow()
 {
     InitializeComponent();
     DataContext = this;
     Closing += MainWindow_Closing;
     Logger = new NullLogger("testLogger");
     Logger.LogMessagePublished += Logger_LogMessagePublished;
     CommunicationThread = new Thread(new ThreadStart(StartMqttClient));
     CommunicationThread.Start();
     QualityOfService = MqttQualityOfServiceLevel.AtMostOnce;
     StatusPane.QosChanged += StatusPane_QosChanged;
     StatusPane.CodeStyleChanged += StatusPane_CodeStyleChanged;
 }
示例#10
0
        protected override void OnStart()
        {
            _storageService.SafeReadSerializedValue(out _options, DefaultDirectoryNames.Configuration, MqttServiceOptions.Filename);

            IsLowLevelMqttLoggingEnabled = _options.EnableLogging;

            var mqttFactory = new MqttFactory();

            IMqttNetLogger mqttNetLogger;

            if (IsLowLevelMqttLoggingEnabled)
            {
                mqttNetLogger = new LoggerAdapter(_logger);
            }
            else
            {
                mqttNetLogger = new MqttNetLogger();
            }

            _webSocketServerAdapter = new MqttWebSocketServerAdapter(mqttNetLogger);

            var serverAdapters = new List <IMqttServerAdapter>
            {
                new MqttTcpServerAdapter(mqttNetLogger),
                _webSocketServerAdapter
            };

            _mqttServer = mqttFactory.CreateMqttServer(serverAdapters, mqttNetLogger);
            _mqttServer.UseApplicationMessageReceivedHandler(new MqttApplicationMessageReceivedHandlerDelegate(e => OnApplicationMessageReceived(e)));

            var serverOptions = new MqttServerOptionsBuilder()
                                .WithDefaultEndpointPort(_options.ServerPort)
                                .WithConnectionValidator(ValidateClientConnection)
                                .WithPersistentSessions();

            if (_options.PersistRetainedMessages)
            {
                var storage = new MqttServerStorage(_storageService, _systemCancellationToken, _logger);
                storage.Start();
                serverOptions.WithStorage(storage);
            }

            _mqttServer.StartAsync(serverOptions.Build()).GetAwaiter().GetResult();

            _systemCancellationToken.Token.Register(() =>
            {
                _mqttServer.StopAsync().GetAwaiter().GetResult();
            });

            ParallelTask.StartLongRunning(ProcessIncomingMqttMessages, _systemCancellationToken.Token, _logger);
        }
示例#11
0
        static async Task Main(string[] args)
        {
            var logger = new MqttNetLogger();

            logger.LogMessagePublished += (s, e) => Console.WriteLine(e.TraceMessage.ToString());
            var server  = new MqttFactory().CreateMqttServer(logger);
            var options = new MqttServerOptionsBuilder()
                          .WithDefaultEndpointPort(6969);

            await server.StartAsync(options.Build());

            logger.Publish(MqttNetLogLevel.Info, "Program", "Press any key to shutdown the server.", null, null);
            Console.ReadLine();
            await server.StopAsync();
        }
示例#12
0
        public void Set_Custom_Log_ID()
        {
            var logger      = new MqttNetLogger("logId");
            var childLogger = logger.CreateScopedLogger("Source1");

            logger.LogMessagePublished += (s, e) =>
            {
                Assert.AreEqual("logId", e.LogMessage.LogId);
            };

            childLogger.Verbose("Verbose");
            childLogger.Info("Info");
            childLogger.Warning(null, "Warning");
            childLogger.Error(null, "Error");
        }
示例#13
0
        private void InitServer()
        {
            IMqttNetLogger logger = new MqttNetLogger();

            serverOptionsBuilder = new MqttServerOptionsBuilder()
                                   .WithDefaultEndpointBoundIPAddress(IPAddress.Parse(ip))
                                   .WithDefaultEndpointPort(port)
                                   .WithDefaultCommunicationTimeout(TimeSpan.FromSeconds(communicationTimeout))
                                   .WithEncryptionSslProtocol(sslProtocols);
            // connect verfication
            serverOptionsBuilder.WithConnectionValidator(valid =>
            {
                if (valid.ClientId.Length < 10)
                {
                    valid.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid;
                    return;
                }
                if (!valid.Username.Equals(this.username))
                {
                    valid.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
                    return;
                }
                if (!valid.Password.Equals(password))
                {
                    valid.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
                    return;
                }
                valid.ReasonCode = MqttConnectReasonCode.Success;
            });
            serverOptions = serverOptionsBuilder.Build();

            mqttServer = (new MqttFactory()).CreateMqttServer(logger) as MqttServer;
            mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
            {
                ClientIds.Add(e.ClientId);
                Logger.Info($"clientID:{e.ClientId} connect success!");
            });
            mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
            {
                ClientIds.RemoveWhere(s => s.Equals(e.ClientId));
                Logger.Info($"clientID:{e.ClientId} disconnect!");
            });
            mqttServer.UseApplicationMessageReceivedHandler(e =>
            {
                AppMsgReceivedHandler?.Invoke(e.ClientId, e.ApplicationMessage);
            });
        }
示例#14
0
        public void Root_Log_Messages()
        {
            var logger = new MqttNetLogger();

            var logMessagesCount = 0;

            logger.LogMessagePublished += (s, e) =>
            {
                logMessagesCount++;
            };

            logger.Verbose("Verbose");
            logger.Info("Info");
            logger.Warning(null, "Warning");
            logger.Error(null, "Error");

            Assert.AreEqual(4, logMessagesCount);
        }
示例#15
0
        public static async Task RunAsync()
        {
            var logger = new MqttNetLogger();

            MqttNetConsoleLogger.ForwardToConsole(logger);

            var factory = new MqttFactory(logger);
            var server  = factory.CreateMqttServer();
            var client  = factory.CreateMqttClient();

            var serverOptions = new MqttServerOptionsBuilder().Build();
            await server.StartAsync(serverOptions);

            var clientOptions = new MqttClientOptionsBuilder().WithTcpServer("localhost").Build();
            await client.ConnectAsync(clientOptions);

            await Task.Delay(Timeout.Infinite);
        }
示例#16
0
        public static async Task RunAsync()
        {
            try
            {
                var logger = new MqttNetLogger();
                MqttNetConsoleLogger.ForwardToConsole(logger);

                var factory = new MqttFactory(logger);

                var client = factory.CreateMqttClient();

                var options = new MqttClientOptionsBuilder()
                              .WithTcpServer("localhost")
                              .Build();

                Console.WriteLine("BEFORE CONNECT");
                await client.ConnectAsync(options);

                Console.WriteLine("AFTER CONNECT");

                Console.WriteLine("BEFORE SUBSCRIBE");
                await client.SubscribeAsync("test/topic");

                Console.WriteLine("AFTER SUBSCRIBE");

                Console.WriteLine("BEFORE PUBLISH");
                await client.PublishAsync("test/topic", "payload");

                Console.WriteLine("AFTER PUBLISH");

                await Task.Delay(1000);

                Console.WriteLine("BEFORE DISCONNECT");
                await client.DisconnectAsync();

                Console.WriteLine("AFTER DISCONNECT");

                Console.WriteLine("FINISHED");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
示例#17
0
        public IMqttNetLogger CreateChildLogger(string source = null)
        {
            if (source == null)
            {
                // Required to avoid argument null exception in dictionary.
                source = string.Empty;
            }

            lock (_childLoggers)
            {
                if (!_childLoggers.TryGetValue(source, out var childLogger))
                {
                    childLogger           = new MqttNetLogger(source);
                    _childLoggers[source] = childLogger;
                }

                return(childLogger);
            }
        }
示例#18
0
        public void Bubbling_Log_Messages()
        {
            var logger      = new MqttNetLogger();
            var childLogger = logger.CreateScopedLogger("Source1");

            var logMessagesCount = 0;

            logger.LogMessagePublished += (s, e) =>
            {
                logMessagesCount++;
            };

            childLogger.Verbose("Verbose");
            childLogger.Info("Info");
            childLogger.Warning(null, "Warning");
            childLogger.Error(null, "Error");

            Assert.AreEqual(4, logMessagesCount);
        }
示例#19
0
        public IMqttNetLogger Create(string loggerName)
        {
            var logger = _loggerFactory.CreateLogger(loggerName);

            var mqttNetLogger = new MqttNetLogger();

            mqttNetLogger.LogMessagePublished += (sender, e) =>
            {
                if (e.TraceMessage.Exception != null)
                {
                    logger.LogError(e.TraceMessage.Exception, e.TraceMessage.Message);
                }
                else
                {
                    logger.LogDebug(e.TraceMessage.Message);
                }
            };

            return(mqttNetLogger);
        }
 private static IServiceCollection AddHostedMqttServerEx(this IServiceCollection services)
 {
     var logger = new MqttNetLogger();
     var childLogger = logger.CreateChildLogger();
     services.AddSingleton<IMqttNetLogger>(logger);
     services.AddSingleton(childLogger);
     services.AddSingleton<MqttHostedServerEx>();
     services.AddSingleton<IHostedService>(s => s.GetService<MqttHostedServerEx>());
     services.AddSingleton<IMqttServerEx>(s =>
     {
         var mhse = s.GetService<MqttHostedServerEx>();
         var store = s.GetService<IMqttServerStorage>();
         MqttServerOptions options = (MqttServerOptions)mhse.Options;
         options.ConnectionValidator = mhse.ConnectionValidator;
         if (options.Storage == null) options.Storage = store;
         return mhse;
     }
     );
     return services;
 }
示例#21
0
        public ModemManager(Modem modem, DeviceManager deviceManager)
        {
            Modem      = modem;
            logger     = LogManager.GetCurrentClassLogger();
            mqttLogger = new MqttNetLogger();
            mqttLogger.LogMessagePublished += MqttLogger_LogMessagePublished;


            factory = new MqttFactory(mqttLogger);
            // Create TCP based options using the builder.
            var options = new MqttClientOptionsBuilder()
                          .WithClientId(modem.MqttClientId)
                          .WithCredentials(modem.MqttUserName, modem.MqttPassword)
                          .WithTcpServer(modem.MqttBrokerAddress.ToString())
                          .WithCleanSession(true)
                          .WithNoKeepAlive()
                          .WithSessionExpiryInterval(60 * 60 * 24)
                          .Build();

            mqttClient = factory.CreateMqttClient(mqttLogger);
            MqttClientAuthenticateResult conResult;

            conResult = mqttClient.ConnectAsync(options).Result;

            mqttClient.UseConnectedHandler(async(e) => {
                while (mqttClient.IsConnected)
                {
                    var devicePacket = deviceManager.GetDevicePacket();
                    if (devicePacket != null)
                    {
                        await mqttClient.PublishAsync("/MachineData", devicePacket.Encode());
                        logger.Info($"Device Packet: {devicePacket}");
                        continue;
                    }
                    await Task.Delay(10000);
                }
            });
            DeviceManager = deviceManager;
        }
示例#22
0
        public IMqttServer CreateMqttServer()
        {
            var logger = new MqttNetLogger();

            return(CreateMqttServer(logger));
        }
示例#23
0
        public async Task Create_Managed_Client_With_Logger()
        {
            var factory = new MqttFactory();

            //This test compares
            //1. correct logID
            string logId = "logId";
            bool   invalidLogIdOccured = false;

            //2. if the total log calls are the same for global and local
            int globalLogCount = 0;
            int localLogCount  = 0;

            MqttNetLogger logger = new MqttNetLogger(logId);

            //we have a theoretical bug here if a concurrent test is also logging
            var globalLog = new EventHandler <MqttNetLogMessagePublishedEventArgs>((s, e) =>
            {
                if (logId != e.TraceMessage.LogId)
                {
                    invalidLogIdOccured = true;
                }
                Interlocked.Increment(ref globalLogCount);
            });

            MqttNetGlobalLogger.LogMessagePublished += globalLog;

            logger.LogMessagePublished += (s, e) =>
            {
                if (logId != e.TraceMessage.LogId)
                {
                    invalidLogIdOccured = true;
                }
                Interlocked.Increment(ref localLogCount);
            };

            var managedClient = factory.CreateManagedMqttClient(logger);

            try
            {
                var clientOptions = new ManagedMqttClientOptionsBuilder();

                clientOptions.WithClientOptions(o => o.WithTcpServer("this_is_an_invalid_host").WithCommunicationTimeout(TimeSpan.FromSeconds(1)));

                //try connect to get some log entries
                await managedClient.StartAsync(clientOptions.Build());

                //wait at least connect timeout or we have some log messages
                var tcs = new TaskCompletionSource <object>();
                managedClient.ConnectingFailedHandler = new ConnectingFailedHandlerDelegate(e => tcs.TrySetResult(null));
                await Task.WhenAny(Task.Delay(managedClient.Options.ClientOptions.CommunicationTimeout), tcs.Task);
            }
            finally
            {
                await managedClient.StopAsync();

                MqttNetGlobalLogger.LogMessagePublished -= globalLog;
            }

            Assert.IsFalse(invalidLogIdOccured);
            Assert.AreNotEqual(0, globalLogCount);
            Assert.AreEqual(globalLogCount, localLogCount);
        }
示例#24
0
        public static async Task RunAsync()
        {
            try
            {
                var logger = new MqttNetLogger();
                MqttNetConsoleLogger.ForwardToConsole(logger);

                var factory       = new MqttFactory(logger);
                var client        = factory.CreateMqttClient();
                var clientOptions = new MqttClientOptions
                {
                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = "127.0.0.1"
                    }
                };

                client.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
                {
                    Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###");
                    Console.WriteLine($"+ Topic = {e.ApplicationMessage.Topic}");
                    Console.WriteLine($"+ Payload = {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
                    Console.WriteLine($"+ QoS = {e.ApplicationMessage.QualityOfServiceLevel}");
                    Console.WriteLine($"+ Retain = {e.ApplicationMessage.Retain}");
                    Console.WriteLine();
                });

                client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(async e =>
                {
                    Console.WriteLine("### CONNECTED WITH SERVER ###");

                    await client.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("#").Build());

                    Console.WriteLine("### SUBSCRIBED ###");
                });

                client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(async e =>
                {
                    Console.WriteLine("### DISCONNECTED FROM SERVER ###");
                    await Task.Delay(TimeSpan.FromSeconds(5));

                    try
                    {
                        await client.ConnectAsync(clientOptions);
                    }
                    catch
                    {
                        Console.WriteLine("### RECONNECTING FAILED ###");
                    }
                });

                try
                {
                    await client.ConnectAsync(clientOptions);
                }
                catch (Exception exception)
                {
                    Console.WriteLine("### CONNECTING FAILED ###" + Environment.NewLine + exception);
                }

                Console.WriteLine("### WAITING FOR APPLICATION MESSAGES ###");

                while (true)
                {
                    Console.ReadLine();

                    await client.SubscribeAsync(new MqttTopicFilter { Topic = "test", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });

                    var applicationMessage = new MqttApplicationMessageBuilder()
                                             .WithTopic("A/B/C")
                                             .WithPayload("Hello World")
                                             .WithAtLeastOnceQoS()
                                             .Build();

                    await client.PublishAsync(applicationMessage);
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
示例#25
0
        static async Task Main(string[] args)
        {
            var optionbuilder = new MqttServerOptionsBuilder()
                                .WithDefaultEndpointPort(3883)
                                .WithConnectionValidator((valid) =>
            {
            });

            var server_logger = new MqttNetLogger("server logger");

            server_logger.LogMessagePublished += (sender, e) =>
            {
                //Console.WriteLine(e.TraceMessage.ToString());
            };

            var mqttServer = new MqttFactory().CreateMqttServer(server_logger);

            mqttServer.StartedHandler = new MqttServerStartedHandlerDelegate((e) =>
            {
                Console.WriteLine("mqtt server started!");
            });

            mqttServer.StoppedHandler = new MqttServerStoppedHandlerDelegate((e) =>
            {
                Console.WriteLine("mqtt server stopped!");
            });

            mqttServer.UseClientConnectedHandler((eventArgs) =>
            {
                Console.WriteLine($"client Connected ClientId:{eventArgs.ClientId}");
            });

            mqttServer.UseClientDisconnectedHandler((eventArgs) =>
            {
                Console.WriteLine($"client Disconnected ClientId:{eventArgs.ClientId} Type:{eventArgs.DisconnectType}");
            });

            mqttServer.UseApplicationMessageReceivedHandler((eventArgs) =>
            {
                var msg     = eventArgs.ApplicationMessage;
                var topic   = msg.Topic;
                var payload = msg.ConvertPayloadToString();

                Console.WriteLine($"Topic:{topic}\r\nPayload:{payload}");
            });

            mqttServer.ClientSubscribedTopicHandler = new MqttServerClientSubscribedHandlerDelegate((e) =>
            {
                Console.WriteLine($"topic subscribed ClientId:{e.ClientId} Topic:{e.TopicFilter.ToString()}");
            });

            mqttServer.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate((e) =>
            {
                Console.WriteLine($"topic ubsubscribed ClientId:{e.ClientId} Topic:{e.TopicFilter.ToString()}");
            });

            await mqttServer.StartAsync(optionbuilder.Build());

            Console.WriteLine("输入exit退出");
            var input = string.Empty;

            while (true)
            {
                input = Console.ReadLine().ToLower().Trim();
                if (input == "exit")
                {
                    break;
                }

                switch (input)
                {
                case "exit":
                    await mqttServer.StopAsync();

                    return;

                case "client":
                    var clients = await mqttServer.GetClientStatusAsync();

                    if (clients.Count == 0)
                    {
                        Console.WriteLine("no client");
                        continue;
                    }

                    foreach (var client in clients)
                    {
                        Console.WriteLine($"clientid:{client.ClientId}");
                    }
                    break;

                case "msg":
                    var msgs = await mqttServer.GetRetainedApplicationMessagesAsync();

                    if (msgs.Count == 0)
                    {
                        Console.WriteLine("no message");
                    }

                    foreach (var item in msgs)
                    {
                        Console.WriteLine($"Topic:{item.Topic}, payload:{item.ConvertPayloadToString()}");
                    }
                    break;

                case "session":
                    var mqttSessions = await mqttServer.GetSessionStatusAsync();

                    if (mqttSessions.Count == 0)
                    {
                        Console.WriteLine("no session");
                        continue;
                    }
                    foreach (var item in mqttSessions)
                    {
                        Console.WriteLine($"ClientId:{item.ClientId},PendingMsgCnt:{item.PendingApplicationMessagesCount}");
                    }
                    break;

                default:
                    await Task.Delay(100);

                    break;
                }
            }
        }