MqttClientService.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using Edge.Core.Configuration;
  2. using Edge.Core.Core.database;
  3. using Microsoft.Extensions.Configuration;
  4. using MQTTnet;
  5. using MQTTnet.Client;
  6. using Newtonsoft.Json;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace Edge.Core.MqttClient
  13. {
  14. public class MqttClientService: IMqttClientService
  15. {
  16. private static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
  17. private string[] topics;//需要订阅的主题
  18. private string? buildId;
  19. private IMqttClient _mqttClient; //mqtt 客户端
  20. private IConfiguration _configuration;
  21. public MqttClientService(IConfiguration configuration)
  22. {
  23. _configuration = configuration;
  24. }
  25. public event EventHandler<MqttClientConnectedEventArgs> OnConnect;
  26. public event EventHandler<MqttClientDisconnectedEventArgs> OnDisconnect;
  27. public event EventHandler<MqttApplicationMessageReceivedEventArgs> OnApplicationMessageReceived;
  28. public void Public(string topic, string paramsJson)
  29. {
  30. }
  31. public void Start()
  32. {
  33. MqttConfiguration? mqttConfiguration = _configuration.GetSection("Mqtt").Get<MqttConfiguration>();
  34. using (var dbContext = new MysqlDbContext())
  35. {
  36. Domain.FccStationInfo.FccStationInfo? fccStationInfo = dbContext.FccStationInfos.FirstOrDefault();
  37. string? mqttService = fccStationInfo?.MqttService;
  38. buildId = fccStationInfo?.BuildId;
  39. string clientId = buildId + "_" + Guid.NewGuid().ToString();
  40. Logger.Info($"mqtt client id : {clientId}");
  41. if (mqttService == null || buildId == null)
  42. {
  43. Logger.Info($"can not get mqttService:{mqttService} and buildId:{buildId}");
  44. return;
  45. }
  46. string[] hostAndPort = mqttService.Split(":");
  47. MqttClientOptions mqttClientOptions = new MqttClientOptionsBuilder()
  48. .WithTcpServer(hostAndPort[0], hostAndPort[1].ToString().ToInt())
  49. .WithCredentials(mqttConfiguration.user, mqttConfiguration.password)
  50. .WithClientId(clientId)
  51. .WithCleanSession()
  52. .WithTlsOptions(new MqttClientTlsOptions()
  53. {
  54. UseTls = false
  55. })
  56. .Build();
  57. _mqttClient = new MqttFactory().CreateMqttClient();
  58. this.topics = mqttConfiguration.subTopic;
  59. _mqttClient.ConnectedAsync += mqttConnected;
  60. _mqttClient.DisconnectedAsync += mqttDisConnected;
  61. _mqttClient.ApplicationMessageReceivedAsync += mqttOnReceive;
  62. _mqttClient.ConnectAsync(mqttClientOptions);
  63. }
  64. }
  65. /// <summary>
  66. /// MQTT 已连接事件
  67. /// </summary>
  68. /// <param name="args"></param>
  69. /// <returns></returns>
  70. private Task mqttConnected(MqttClientConnectedEventArgs args)
  71. {
  72. Logger.Info($"mqtt connected");
  73. topics.ForEach(topic =>
  74. {
  75. _mqttClient.SubscribeAsync($"{topic}/{buildId}", MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce);
  76. });
  77. OnConnect?.Invoke(this, args);
  78. return Task.CompletedTask;
  79. }
  80. /// <summary>
  81. /// MQTT 断开连接
  82. /// </summary>
  83. /// <param name="args"></param>
  84. /// <returns></returns>
  85. private Task mqttDisConnected(MqttClientDisconnectedEventArgs args)
  86. {
  87. Logger.Info($"mqtt disconnect",JsonConvert.SerializeObject(args));
  88. Thread.Sleep(3000);
  89. Start();
  90. OnDisconnect?.Invoke(this, args);
  91. return Task.CompletedTask;
  92. }
  93. /// <summary>
  94. /// MQTT 获取到数据
  95. /// </summary>
  96. /// <param name="args"></param>
  97. /// <returns></returns>
  98. private Task mqttOnReceive(MqttApplicationMessageReceivedEventArgs args)
  99. {
  100. Logger.Info($"mqtt receive message");
  101. OnApplicationMessageReceived?.Invoke(this, args);
  102. return Task.CompletedTask;
  103. }
  104. }
  105. }