129 lines
5.1 KiB
C#
129 lines
5.1 KiB
C#
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);
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|