using System; using System.Text; using System.Threading.Tasks; using MQTTnet.Core.Protocol; using MQTTnet.Core.Server; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace MQTTnet.TestApp.NetCore { public static class ServerTest { public static Task RunAsync() { try { var services = new ServiceCollection() .AddMqttServer() .AddLogging(); services.Configure(options => { options.ConnectionValidator = p => { if (p.ClientId == "SpecialClient") { if (p.Username != "USER" || p.Password != "PASS") { return MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword; } } return MqttConnectReturnCode.ConnectionAccepted; }; options.Storage = new RetainedMessageHandler(); // Extend the timestamp for all messages from clients. options.ApplicationMessageInterceptor = context => { if (MqttTopicFilterComparer.IsMatch(context.ApplicationMessage.Topic, "/myTopic/WithTimestamp/#")) { // Replace the payload with the timestamp. But also extending a JSON // based payload with the timestamp is a suitable use case. context.ApplicationMessage.Payload = Encoding.UTF8.GetBytes(DateTime.Now.ToString("O")); } }; // Protect several topics from being subscribed from every client. options.SubscriptionsInterceptor = context => { if (context.TopicFilter.Topic.StartsWith("admin/foo/bar") && context.ClientId != "theAdmin") { context.AcceptSubscription = false; } if (context.TopicFilter.Topic.StartsWith("the/secret/stuff") && context.ClientId != "Imperator") { context.AcceptSubscription = false; context.CloseConnection = true; } }; }); var serviceProvider = services.BuildServiceProvider(); serviceProvider.GetRequiredService().AddConsole(); //var certificate = new X509Certificate(@"C:\certs\test\test.cer", ""); //options.TlsEndpointOptions.Certificate = certificate.Export(X509ContentType.Cert); //options.ConnectionBacklog = 5; //options.DefaultEndpointOptions.IsEnabled = true; //options.TlsEndpointOptions.IsEnabled = false; var mqttServer = new MqttFactory(serviceProvider).CreateMqttServer(); mqttServer.ClientDisconnected += (s, e) => { Console.Write("Client disconnected event fired."); }; mqttServer.StartAsync(); Console.WriteLine("Press any key to exit."); Console.ReadLine(); mqttServer.StopAsync(); } catch (Exception e) { Console.WriteLine(e); } Console.ReadLine(); return Task.FromResult(0); } } }