SuZhouZhanFang/suzhou-iot-service/GatherAPI/Util/MqttClientService.cs

129 lines
5.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}
/// <summary>
/// 客户端连接关闭事件
/// </summary>
/// <param name="arg"></param>
/// <returns></returns>
private Task _mqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg)
{
log.Info("接口端已断开MQTT服务端的连接");
//LogHelper.WriteLog("接口端已断开MQTT服务端的连接");
//Console.WriteLine($"客户端已断开与服务端的连接……");
return Task.CompletedTask;
}
/// <summary>
/// 客户端连接成功事件
/// </summary>
/// <param name="arg"></param>
/// <returns></returns>
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);
}
}
}
}