using MQTTnet;
using MQTTnet.Client;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace LeatherApp.Device
{
public class CloudlInfo
{
public string ProductKey = "";
public string DeviceName = "";
public string DeviceSecret = "";
public string clientId = "";
public string username = "";
public string mqttHostUrl = "";
public string passwd = "";
public int port = 0;
}
///
/// 云端控制
///
public class CloudMgr
{
private IMqttClient mqttClient = null;
private CloudlInfo cloudlInfo = new CloudlInfo();
///
/// 连接服务器
///
///
///
public bool ConnectCloud(string ip, int port, string username, string password)
{
bool ret = true;
cloudlInfo.mqttHostUrl = ip;
cloudlInfo.port = port;
cloudlInfo.username = username;
cloudlInfo.passwd = password;
cloudlInfo.clientId = username;
//连接
var option = new MqttClientOptions();
option.ClientId = cloudlInfo.clientId;
//设置服务器地址与端口
option.ChannelOptions = new MqttClientTcpOptions()
{
Server = cloudlInfo.mqttHostUrl,
Port = cloudlInfo.port
};
//设置账号与密码
option.Credentials = new MqttClientCredentials(cloudlInfo.username, Encoding.Default.GetBytes(cloudlInfo.passwd));
option.CleanSession = true;
//保持期
option.KeepAlivePeriod = TimeSpan.FromSeconds(100.5);
//构建客户端对象
mqttClient = new MqttFactory().CreateMqttClient() as MqttClient;
try
{
//绑定消息接收方法
mqttClient.ApplicationMessageReceivedAsync += _client_ApplicationMessageReceived;
//绑定连接成功状态接收方法
mqttClient.ConnectedAsync += _client_Connected;
//绑定连接断开状态接收方法
mqttClient.DisconnectedAsync += _client_Disconnected;
//启动连接
mqttClient.ConnectAsync(option);
}
catch
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")} 连接失败");
ret = false;
}
return ret;
}
///
/// 客户端与服务端断开连接
///
///
///
private Task _client_Disconnected(MqttClientDisconnectedEventArgs e)
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")} Mqtt客户端连接断开");
if (mqttClient == null || mqttClient.IsConnected == false)
{
Thread.Sleep(25 * 1000);
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")} Mqtt客户端重连...");
mqttClient.ReconnectAsync();
Thread.Sleep(5 * 1000);
}
if (mqttClient.IsConnected)
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")} Mqtt客户端重连成功");
return Task.CompletedTask;
}
///
/// 客户端与服务端建立连接
///
///
///
private Task _client_Connected(MqttClientConnectedEventArgs e)
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")} Mqtt客户端连接成功.");
return Task.CompletedTask;
}
///
/// 客户端收到消息
///
///
///
private Task _client_ApplicationMessageReceived(MqttApplicationMessageReceivedEventArgs e)
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")} Mqtt客户端收到消息:{e.ApplicationMessage}");
return Task.CompletedTask;
}
private class WarningInfo
{
public WarningEnum Warn;
public string WarningString;
}
///
/// 发送topic信息
///
///
///
public bool SendTopic(string topic, string payload)
{
try
{
var applicationMessage = new MqttApplicationMessageBuilder()
.WithTopic(topic)
.WithPayload(payload)
.Build();
Task task = mqttClient.PublishAsync(applicationMessage);
task.Wait();
return true;
}
catch
{
//throw new Exception("云端连接错误");
return false;
}
}
}
}