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);
}
}
}
}