public void Setup() { var factory = new MqttFactory(); var tcpServer = new MqttTcpServerAdapter(new MqttNetEventLogger()); tcpServer.ClientHandler += args => { _serverChannel = (IMqttChannel)args.GetType().GetField("_channel", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) .GetValue(args); return(Task.CompletedTask); }; _mqttServer = factory.CreateMqttServer(new[] { tcpServer }, new MqttNetEventLogger()); var serverOptions = new MqttServerOptionsBuilder().Build(); _mqttServer.StartAsync(serverOptions).GetAwaiter().GetResult(); var clientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost").Build(); var tcpOptions = (MqttClientTcpOptions)clientOptions.ChannelOptions; _clientChannel = new MqttTcpChannel(new MqttClientOptions { ChannelOptions = tcpOptions }); _clientChannel.ConnectAsync(CancellationToken.None).GetAwaiter().GetResult(); }
public async Task MqttServer_ShutdownDisconnectsClientsGracefully() { var serverAdapter = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger()); var s = new MqttFactory().CreateMqttServer(new[] { serverAdapter }, new MqttNetLogger()); var clientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost") .Build(); var disconnectCalled = 0; await s.StartAsync(new MqttServerOptions()); var c1 = new MqttFactory().CreateMqttClient(); c1.Disconnected += (sender, args) => disconnectCalled++; await c1.ConnectAsync(clientOptions); await Task.Delay(100); await s.StopAsync(); await Task.Delay(100); Assert.AreEqual(1, disconnectCalled); }
public async Task MqttServer_HandleCleanDisconnect() { var serverAdapter = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger()); var s = new MqttFactory().CreateMqttServer(new[] { serverAdapter }, new MqttNetLogger()); var clientConnectedCalled = 0; var clientDisconnectedCalled = 0; s.ClientConnected += (_, __) => clientConnectedCalled++; s.ClientDisconnected += (_, __) => clientDisconnectedCalled++; var clientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost") .Build(); await s.StartAsync(new MqttServerOptions()); var c1 = new MqttFactory().CreateMqttClient(); await c1.ConnectAsync(clientOptions); await Task.Delay(100); await c1.DisconnectAsync(); await Task.Delay(100); await s.StopAsync(); await Task.Delay(100); Assert.AreEqual(clientConnectedCalled, clientDisconnectedCalled); }
public async Task MqttServer_Publish_MultipleClients() { var serverAdapter = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger()); var s = new MqttFactory().CreateMqttServer(new[] { serverAdapter }, new MqttNetLogger()); var receivedMessagesCount = 0; var locked = new object(); var clientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost") .Build(); var clientOptions2 = new MqttClientOptionsBuilder() .WithTcpServer("localhost") .Build(); try { await s.StartAsync(new MqttServerOptions()); var c1 = new MqttFactory().CreateMqttClient(); var c2 = new MqttFactory().CreateMqttClient(); await c1.ConnectAsync(clientOptions); await c2.ConnectAsync(clientOptions2); c1.ApplicationMessageReceived += (_, __) => { lock (locked) { receivedMessagesCount++; } }; c2.ApplicationMessageReceived += (_, __) => { lock (locked) { receivedMessagesCount++; } }; var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build(); await c1.SubscribeAsync(new TopicFilter("a", MqttQualityOfServiceLevel.AtLeastOnce)); await c2.SubscribeAsync(new TopicFilter("a", MqttQualityOfServiceLevel.AtLeastOnce)); //await Task.WhenAll(Publish(c1, message), Publish(c2, message)); await Publish(c1, message); await Task.Delay(500); } finally { await s.StopAsync(); } Assert.AreEqual(2000, receivedMessagesCount); }
public async Task MqttServer_SameClientIdConnectDisconnectEventOrder() { var serverAdapter = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger()); var s = new MqttFactory().CreateMqttServer(new[] { serverAdapter }, new MqttNetLogger()); var connectedClient = false; var connecteCalledBeforeConnectedClients = false; s.ClientConnected += (_, __) => { connecteCalledBeforeConnectedClients |= connectedClient; connectedClient = true; }; s.ClientDisconnected += (_, __) => { connectedClient = false; }; var clientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost") .WithClientId(Guid.NewGuid().ToString()) .Build(); await s.StartAsync(new MqttServerOptions()); var c1 = new MqttFactory().CreateMqttClient(); var c2 = new MqttFactory().CreateMqttClient(); await c1.ConnectAsync(clientOptions); await Task.Delay(100); await c2.ConnectAsync(clientOptions); await Task.Delay(100); await c1.DisconnectAsync(); await c2.DisconnectAsync(); await s.StopAsync(); await Task.Delay(100); Assert.IsFalse(connecteCalledBeforeConnectedClients, "ClientConnected was called before ClientDisconnect was called"); }
public async Task MqttServer_HandleCleanDisconnect() { MqttNetGlobalLogger.LogMessagePublished += (_, e) => { System.Diagnostics.Debug.WriteLine($"[{e.TraceMessage.Timestamp:s}] {e.TraceMessage.Source} {e.TraceMessage.Message}"); }; var serverAdapter = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger()); var s = new MqttFactory().CreateMqttServer(new[] { serverAdapter }, new MqttNetLogger()); var clientConnectedCalled = 0; var clientDisconnectedCalled = 0; s.ClientConnected += (_, __) => clientConnectedCalled++; s.ClientDisconnected += (_, __) => clientDisconnectedCalled++; var clientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost") .Build(); await s.StartAsync(new MqttServerOptions()); var c1 = new MqttFactory().CreateMqttClient(); await c1.ConnectAsync(clientOptions); await Task.Delay(100); await c1.DisconnectAsync(); await Task.Delay(100); await s.StopAsync(); await Task.Delay(100); Assert.AreEqual(clientConnectedCalled, clientDisconnectedCalled); }