using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using Cysharp.Threading.Tasks; using DefaultNamespace; using DG.Tweening; using Newtonsoft.Json; using UnityEngine; public class MqttManager : MonoSingleton<MqttManager> { /// <summary> /// 所有设备的请求头 /// </summary> public List<Allequipment> devices = new List<Allequipment>(); /// <summary> /// 换电池装置 /// </summary> public List<Qcbd> qcbdequipments = new List<Qcbd>(); /// <summary> /// 查询提升机 /// </summary> public List<Elvequipment> elvequipments = new List<Elvequipment>(); /// <summary> /// 拆码垛机 /// </summary> public List<Dpmequipment> dpmequipments = new List<Dpmequipment>(); /// <summary> /// 输送机设备 /// </summary> public List<Convoyorequipment> convoyorequipments = new List<Convoyorequipment>(); /// <summary> /// 输入机设备 /// </summary> public List<Convoyorequipment> exportations = new List<Convoyorequipment>(); /// <summary> /// 小车设备 /// </summary> public List<Carequipment> carequipments = new List<Carequipment>(); /// <summary> /// 查询式落地机 /// </summary> public List<Feequipment> feequipments = new List<Feequipment>(); /// <summary> /// 查训加去盖信息 /// </summary> public List<Cmequipment> cmequipments = new List<Cmequipment>(); /// <summary> /// 消息队列 /// </summary> public ConcurrentQueue<string> messageQueue = new ConcurrentQueue<string>(); /// <summary> /// 第一层箱子 /// </summary> public List<GameObject> firstbox = new List<GameObject>(); /// <summary> /// 第二层箱子 /// </summary> public List<GameObject> secondbox = new List<GameObject>(); /// <summary> /// 小车位移的速度 /// </summary> public float speed = 5f; [Obsolete] private void Awake() { //启动MQTT连接 Application.ExternalCall("OpenHtmlMQTT"); ProcessQueue().Forget(); } private void Start() { } /// <summary> /// 接受MQTT消息 /// </summary> /// <param name="message"></param> public void Message(string message) { // Debug.Log($"接收到的MQTT消息---->{message}"); messageQueue.Enqueue(message); // 将消息存入队列 } private async UniTaskVoid ProcessQueue() { while (true) { if (messageQueue.TryDequeue(out string message)) { // 处理消息 Debug.Log($"剩余:{messageQueue.Count}条数据,取数据-----> {message}"); //await UniTask.Delay(10); Allequipment str = JsonConvert.DeserializeObject<Allequipment>(message); //Debug.Log("获取到了数据"); //Debug.Log(str.device + " " + str.message); devices.Add(str); string data = str.device.Substring(0, 2); switch (data) { case "qc": Qcbd qcbd = JsonConvert.DeserializeObject<Qcbd>(str.message); qcbdequipments.Add(qcbd); break; case "el": Elvequipment elvequipment = JsonConvert.DeserializeObject<Elvequipment>(str.message); elvequipments.Add(elvequipment); break; case "dp": Dpmequipment dpmequipment = JsonConvert.DeserializeObject<Dpmequipment>(str.message); dpmequipments.Add(dpmequipment); break; case "co": Convoyorequipment convoyorequipment = JsonConvert.DeserializeObject<Convoyorequipment>(str.message); string con = convoyorequipment.Id.Substring(0, 2); //Debug.Log(con); if (con == "54") { convoyorequipments.Add(convoyorequipment); } else { exportations.Add(convoyorequipment); } break; case "ca": Carequipment carequipment = JsonConvert.DeserializeObject<Carequipment>(str.message); string carname = str.device; GameObject cargame = GameObject.Find(carname); Carpoint(cargame, carequipment); break; case "fe": Feequipment feequipment = JsonConvert.DeserializeObject<Feequipment>(str.message); feequipments.Add(feequipment); break; case "cm": Cmequipment cmequipment = JsonConvert.DeserializeObject<Cmequipment>(str.message); cmequipments.Add(cmequipment); break; default: break; } await UniTask.Delay(10); } else { Debug.Log("等待数据"); await UniTask.Delay(1000); } } } public void Carpoint(GameObject car, Carequipment carequipment) { Debug.Log(carequipment.id); if (car) { Carinformation carbox = car.GetComponent<Carinformation>(); carbox.BoxCode = carequipment.CarState_BoxCode; string point = carequipment.CarState_Car_Column + "-" + carequipment.CarState_Car_Row + "-" + carequipment.CarState_Car_Layer; GameObject displacement = GameObject.Find(point); //car.transform.DOMove(displacement.transform.position, Vector3.Distance(car.transform.position, displacement.transform.position) / speed).SetEase(Ease.InOutQuad); Designateddisplacement(car, displacement.transform.position, speed); if (carequipment.CarState_CarPlt == "上升") { BoxCollider cars = car.GetComponent<BoxCollider>(); cars.enabled = true; } else if (carequipment.CarState_CarPlt == "下降") { //BoxCollider cars = car.GetComponent<BoxCollider>(); //cars.enabled = true; GameObject box = car.transform.GetChild(0).gameObject; float dis = box.transform.position.y - 0.3f; box.transform.DOMoveY(dis, 0.2f).SetEase(Ease.OutQuad); car.transform.SetParent(null); } else { BoxCollider cars = car.GetComponent<BoxCollider>(); cars.enabled = false; } } } /// <summary> /// 需要位移的地方 /// </summary> /// <param name="car">小车</param> /// <param name="dis">位移到指定位置</param> /// <param name="speed">位移的速度</param> public void Designateddisplacement(GameObject car, Vector3 dis, float speed) { float times = Vector3.Distance(car.transform.position, dis) / speed; car.transform.DOMove(dis, times).SetEase(Ease.InOutQuad); } }