MQTTServe.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using MQTTnet;
  2. using MQTTnet.Protocol;
  3. using MQTTnet.Server;
  4. using System.Text;
  5. namespace MQTTServer.Controllers
  6. {
  7. public static class MQTTSERVER {
  8. public static async Task<bool> InitMQTTServerAsync()
  9. {
  10. var mqttServer = CreateMqttServer();
  11. mqttServer.ValidatingConnectionAsync += e =>
  12. {
  13. //if (e.ClientId != "ValidClientId")
  14. //{
  15. // e.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid;
  16. //}
  17. if (e.UserName != "HSClient")
  18. {
  19. e.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
  20. }
  21. if (e.Password != "HS202503")
  22. {
  23. e.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
  24. }
  25. return Task.CompletedTask;
  26. };
  27. await StartMqttServer(mqttServer);
  28. Console.WriteLine("MQTT Server started. Press Enter to exit.");
  29. // Console.ReadLine();
  30. //await mqttServer.StopAsync();
  31. //Console.WriteLine("MQTT Server stopped.");
  32. return true;
  33. }
  34. static MqttServer CreateMqttServer()
  35. {
  36. var optionsBuilder = new MqttServerOptionsBuilder()
  37. .WithDefaultEndpoint() // 监听所有IP,默认端口1883
  38. .WithDefaultEndpointPort(1883)
  39. .WithConnectionBacklog(100) // 最大并发连接数
  40. .WithPersistentSessions () // 订阅拦截器
  41. ;
  42. return new MqttServerFactory().CreateMqttServer(optionsBuilder.Build());
  43. }
  44. static async Task StartMqttServer(MqttServer mqttServer)
  45. {
  46. mqttServer.ClientConnectedAsync += OnClientConnected;
  47. mqttServer.ClientDisconnectedAsync += OnClientDisconnected;
  48. mqttServer.ClientSubscribedTopicAsync += OnClientSubscribed;
  49. mqttServer.ApplicationMessageEnqueuedOrDroppedAsync += MqttServer_ApplicationMessageEnqueuedOrDroppedAsync;
  50. await mqttServer.StartAsync();
  51. }
  52. private static Task MqttServer_ApplicationMessageEnqueuedOrDroppedAsync(ApplicationMessageEnqueuedEventArgs arg)
  53. {
  54. Console.WriteLine($"Message received on [{arg.ApplicationMessage.Topic}]: {arg.SenderClientId}, {arg.ReceiverClientId}, {arg.ApplicationMessage.Payload}");
  55. return Task.CompletedTask;
  56. }
  57. static Task OnClientConnected(ClientConnectedEventArgs arg)
  58. {
  59. Console.WriteLine($"Client connected: {arg.ClientId}");
  60. return Task.CompletedTask;
  61. }
  62. static Task OnClientDisconnected(ClientDisconnectedEventArgs arg)
  63. {
  64. Console.WriteLine($"Client disconnected: {arg.ClientId}");
  65. return Task.CompletedTask;
  66. }
  67. //static void OnNewConnection( context)
  68. //{
  69. // // 示例验证逻辑(可根据需要修改)
  70. // if (context.ClientId.Length < 3)
  71. // {
  72. // context.ReasonCode = MQTTnet.Protocol.MqttConnectReasonCode.ClientIdentifierNotValid;
  73. // return;
  74. // }
  75. // context.ReasonCode = MQTTnet.Protocol.MqttConnectReasonCode.Success;
  76. //}
  77. static Task OnClientSubscribed(ClientSubscribedTopicEventArgs context)
  78. {
  79. Console.WriteLine($"Client [{context.ClientId}] subscribed to: {context.TopicFilter.Topic}");
  80. return Task.CompletedTask;
  81. }
  82. }
  83. }