|
- using System;
- using System.Text;
- using System.Threading.Tasks;
- using MQTTnet.Protocol;
- using MQTTnet.Server;
- using Newtonsoft.Json.Linq;
-
- namespace MQTTnet.TestApp.NetCore
- {
- public static class ServerTest
- {
- public static async Task RunAsync()
- {
- try
- {
- MqttNetConsoleLogger.ForwardToConsole();
-
- var options = new MqttServerOptions
- {
- ConnectionValidator = p =>
- {
- if (p.ClientId == "SpecialClient")
- {
- if (p.Username != "USER" || p.Password != "PASS")
- {
- p.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
- }
- }
- },
-
- Storage = new RetainedMessageHandler(),
- 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"));
- }
- },
- SubscriptionInterceptor = 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;
- }
- }
- };
-
- // Extend the timestamp for all messages from clients.
- // Protect several topics from being subscribed from every client.
-
- //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().CreateMqttServer();
-
- mqttServer.ApplicationMessageReceived += (s, e) =>
- {
- MqttNetConsoleLogger.PrintToConsole(
- $"'{e.ClientId}' reported '{e.ApplicationMessage.Topic}' > '{Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}'",
- ConsoleColor.Magenta);
- };
-
- options.ApplicationMessageInterceptor = c =>
- {
- var content = JObject.Parse(Encoding.UTF8.GetString(c.ApplicationMessage.Payload));
- var timestampProperty = content.Property("timestamp");
- if (timestampProperty != null && timestampProperty.Value.Type == JTokenType.Null)
- {
- timestampProperty.Value = DateTime.Now.ToString("O");
- c.ApplicationMessage.Payload = Encoding.UTF8.GetBytes(content.ToString());
- }
- };
-
- mqttServer.ClientDisconnected += (s, e) =>
- {
- Console.Write("Client disconnected event fired.");
- };
-
- await mqttServer.StartAsync(options);
-
- Console.WriteLine("Press any key to exit.");
- Console.ReadLine();
-
- await mqttServer.StopAsync();
- }
- catch (Exception e)
- {
- Console.WriteLine(e);
- }
-
- Console.ReadLine();
- }
- }
- }
|