using MQTTnet.Client; using MQTTnet.Protocol; using MQTTnet; using System.Text; namespace GatherAPI.Util { public class MqttClientService { private static string clientid; public static IMqttClient _mqttClient; static log4net.ILog log; public void MqttClientStart() { log4net.Config.XmlConfigurator.Configure(); log = log4net.LogManager.GetLogger("loginfo"); try { if (_mqttClient == null) { clientid = "API-" + Guid.NewGuid().ToString("N"); var optionsBuilder = new MqttClientOptionsBuilder() .WithTcpServer("127.0.0.1", 1883) // 要访问的mqtt服务端的 ip 和 端口号 1.117.96.199 .WithCredentials("dev", "!11@22#33") // 要访问的mqtt服务端的用户名和密码 .WithClientId(clientid) // 设置客户端id .WithCleanSession() .WithTls(new MqttClientOptionsBuilderTlsParameters { UseTls = false // 是否使用 tls加密 }); var clientOptions = optionsBuilder.Build(); _mqttClient = new MqttFactory().CreateMqttClient(); _mqttClient.ConnectedAsync += _mqttClient_ConnectedAsync; // 客户端连接成功事件 _mqttClient.DisconnectedAsync += _mqttClient_DisconnectedAsync; // 客户端连接关闭事件 _mqttClient.ConnectAsync(clientOptions).Wait(); } else { if (!_mqttClient.IsConnected) { clientid = "API-" + Guid.NewGuid().ToString("N"); var optionsBuilder = new MqttClientOptionsBuilder() .WithTcpServer("127.0.0.1", 1883) // 要访问的mqtt服务端的 ip 和 端口号 .WithCredentials("dev", "!11@22#33") // 要访问的mqtt服务端的用户名和密码 .WithClientId(clientid) // 设置客户端id .WithCleanSession() .WithTls(new MqttClientOptionsBuilderTlsParameters { UseTls = false // 是否使用 tls加密 }); var clientOptions = optionsBuilder.Build(); _mqttClient = new MqttFactory().CreateMqttClient(); _mqttClient.ConnectedAsync += _mqttClient_ConnectedAsync; // 客户端连接成功事件 _mqttClient.DisconnectedAsync += _mqttClient_DisconnectedAsync; // 客户端连接关闭事件 _mqttClient.ConnectAsync(clientOptions).Wait(); } } } catch (Exception ex) { log.Info("接口端连接服务端失败,失败原因:" + ex.Message); //LogHelper.WriteLog("接口端连接服务端失败,失败原因:" + ex.Message); } } /// /// 客户端连接关闭事件 /// /// /// private Task _mqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg) { log.Info("接口端已断开MQTT服务端的连接"); //LogHelper.WriteLog("接口端已断开MQTT服务端的连接"); //Console.WriteLine($"客户端已断开与服务端的连接……"); return Task.CompletedTask; } /// /// 客户端连接成功事件 /// /// /// private Task _mqttClient_ConnectedAsync(MqttClientConnectedEventArgs arg) { //Console.WriteLine($"客户端已连接服务端……"); //LogHelper.WriteLog("接口端已连接MQTT服务端"); log.Info("接口端已连接MQTT服务端"); return Task.CompletedTask; } public void Publish(string pub, string data) { try { if (_mqttClient.IsConnected) { var message = new MqttApplicationMessage { Topic = pub, Payload = Encoding.UTF8.GetBytes(data), QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, Retain = false // 服务端是否保留消息。true为保留,如果有新的订阅者连接,就会立马收到该消息。 }; _mqttClient.PublishAsync(message); } } catch (Exception ex) { log.Info("接口端发布消息失败,失败原因:" + ex.Message); //LogHelper.WriteLog("接口端发布消息失败,失败原因:" + ex.Message); } } } }