batteryDiagnosis/Assets/Scripts/GetawayMqttClient.cs

168 lines
5.9 KiB
C#

using DG.Tweening.Core.Easing;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
public class GetawayMqttClient : MonoBehaviour
{
private MqttFactory mqttFactory = new MqttFactory();
private IMqttClient mqttClient;
private MQTTInitData mqttInitData;
private Queue<string> reciveDatas = new Queue<string>();
private LicensePlateData licensePlateData = new LicensePlateData();
async void Start()
{
//这里先创建一个客户端对象,但是没进行配置
mqttClient = mqttFactory.CreateMqttClient();
await StartConnect();
}
private async Task StartConnect()
{
try
{
var path = Path.Combine(Application.streamingAssetsPath, "StateTrendConfig/mqttConfig.json");
if (File.Exists(path))
{
var jsonStr = File.ReadAllText(path);
var config = JsonConvert.DeserializeObject<MQTTInitData>(jsonStr);
mqttInitData = config;
//构建客户端配置对象
MqttClientOptions mqttClientOptions = new MqttClientOptionsBuilder()
.WithTcpServer(config.Ip, config.Port) // 指定服务器地址和端口
.WithCredentials(config.UserName, config.Passwd) // 指定用户名和密码
.WithClientId(Guid.NewGuid().ToString("N"))//配置客户端的ID
.WithCleanSession() // 使用清除会话标志
.WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
//配置MQTT版本
.Build();
//MQTT客户端异步连接,上面构建的配置对象给到了客户端对象
var response = await mqttClient.ConnectAsync(mqttClientOptions,
CancellationToken.None);
UnityEngine.Debug.Log(("The MQTT client is connected.") +
response.ResultCode);
//当await连接完成后,构建主题对象
string topic = "LicensePlateData";//一般参照你的连接协议
var topicFilter = new MqttTopicFilterBuilder()//主题构建对象构建一个主题对象
.WithTopic(topic)
.WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce)
//设置质量服务等级
.Build();//最终构建订阅topic
await mqttClient.SubscribeAsync(topicFilter);//订阅该主题,接收通过该主题转发的消息
//事件订阅mqtt消息
mqttClient.ApplicationMessageReceivedAsync += (e =>
{
string topic1 = e.ApplicationMessage.Topic;//根据该属性分辨是哪个主题传递的消息,你可以根据不同的主题传来的消息做出不同的反应将消息转为字符串
string payload = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment.Array);
reciveDatas.Enqueue(payload);
//UnityEngine.Debug.Log($"Topic is {topic}, Payload is {payload}");
return Task.CompletedTask;
});
}
}
catch (Exception e)
{
Debug.LogError(e.Message);
}
}
private void Update()
{
if (reciveDatas.Count > 0)
{
string data = reciveDatas.Dequeue();
Debug.Log(data);
licensePlateData = JsonConvert.DeserializeObject<LicensePlateData>(data);
switch (licensePlateData.VehicleModel)
{
case "BYD秦":
Bootstrap.Instance.eventCenter.EventTrigger(Enum_EventType.ChangeCarSwitch);
break;
case "BYD宋":
Bootstrap.Instance.eventCenter.EventTrigger(Enum_EventType.ChangeCarSwitch);
break;
default:
break;
}
}
}
//发送消息,你可以使用按钮绑定该方法,发送消息,或者其他方法
async void SendMes(string cmd)
{
var result = mqttClient.PublishAsync(new MqttApplicationMessage
{
//Topic = "/" + mqttInitData.MacAddress + "/connect_packet/connect1_subscribe",//发送到那个主题
Topic = "LicensePlateData",
QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
Retain = false, //指示消息是否要被服务器保留。保留的消息会存储在服务器上,当新客户端订阅该主题时会立即收到该消息。
PayloadSegment = new ArraySegment<byte>(Encoding.UTF8.GetBytes(cmd)),//承载消息
}, CancellationToken.None);
await result;
Debug.Log("发布命令结果为" + result.IsCompleted);
}
//断开连接释放资源
void OnDestroy()
{
var mqttClientDisconnectOptionsBuilder =
mqttFactory.CreateClientDisconnectOptionsBuilder();
var mqttClientDisconnectOptions = mqttClientDisconnectOptionsBuilder.Build();
mqttClient.DisconnectAsync(mqttClientDisconnectOptions,
CancellationToken.None);
}
}
/// <summary>
/// mqtt配置类
/// </summary>
public class MQTTInitData
{
[JsonProperty("ip")]
public string Ip { get; set; }
[JsonProperty("port")]
public int Port { get; set; }
[JsonProperty("userName")]
public string UserName { get; set; }
[JsonProperty("passwd")]
public string Passwd { get; set; }
[JsonProperty("macAddress")]
public string MacAddress { get; set; }
}
/// <summary>
/// 车牌数据类
/// </summary>
public class LicensePlateData
{
/// <summary>
/// 车牌号
/// </summary>
[JsonProperty("licensePlateNumber")]
public string LicensePlateNumber { get; set; }
/// <summary>
/// 车辆品牌
/// </summary>
[JsonProperty("vehicleBrand")]
public string VehicleBrand { get; set; }
/// <summary>
/// 车辆型号
/// </summary>
[JsonProperty("vehicleModel")]
public string VehicleModel { get; set; }
}