using DataVApi.Order; using DataVAPI.Controllers; using DataVAPI.Model; using DataVAPI.ModelDataBus; using DataVAPI.Tool; using DataVAPI.Tool.IOT; using DataVAPI.Tool.控制台显示; using System; using System.Collections.Generic; using System.Linq; using System.Threading; namespace DataVAPI.UpAndDown { /// /// 上下线通知 /// public class ProcessServer { /// /// 上报大屏总Model /// public ScreenMonitorModel devModel { get; set; } public DeviceController deviceController { get; set; } public LogController logController { get; set; } public ScreenController screenController { get; set; } public AlarmController alarmController { get; set; } public OrderProvider orderProvider { get; set; } #region 不需要监听 private static ProcessServer _instance; public static ProcessServer Instance { get { if (_instance == null) _instance = new ProcessServer(); return _instance; } } public ProcessServer() { deviceController = new DeviceController(); logController = new LogController(); alarmController = new AlarmController(); screenController = new ScreenController(); orderProvider = new OrderProvider(); } #endregion /// /// 初始化 /// public void Initialize() { devModel = new ScreenMonitorModel(); devModel.operatingDeviceStatus = new OperatingDeviceStatus(); devModel.operatingDeviceStatus.data = new List();//现场设备于状态 devModel.infoMessage = new InfoMessage(); devModel.infoMessage.data = new List();//通知消息 //加载店铺信息 //加载店铺信息 LoadingShopInformation(); //MQTT 数据接收处理 ConsoleHelper.WriteInfoLine("尝试连接阿里云."); if (IOTDevServer.GetInstance().CreateLinks(DataBus.ProductKey, DataBus.DeviceName, DataBus.DeviceSecret)) { ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接成功"); } else { ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接失败"); } //属性状态变xin //Subscribe(IOTDevServer.TargetStatusSubTopic); //订阅上下线 Subscribe(IOTDevServer.HeartbeatSubTopic); //订阅主播消息 Subscribe(IOTDevServer.BroadcastTopic); IOTDevServer.UNConnectMqtt += new Action((o) => { ConsoleHelper.WriteSuccessLine(o); }); IOTDevServer.DevIOTAction += DevIOTActionHandler; QueueTask(); ConsoleHelper.WriteSuccessLine("开始接收数据,执行队列任务!"); } /// /// 队列任务 /// private void QueueTask() { Executer.GetInstance().Start(new Action(() => { while (true) { try { if (!IOTDevServer.GetInstance().GetIsConnected()) { if (IOTDevServer.GetInstance().CreateLinks(DataBus.ProductKey, DataBus.DeviceName, DataBus.DeviceSecret)) { ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接成功"); //订阅上下线 Subscribe(IOTDevServer.HeartbeatSubTopic); //订阅主播消息 Subscribe(IOTDevServer.BroadcastTopic); } else { ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接失败"); } Thread.Sleep(10000); } } catch (Exception ex) { ConsoleHelper.WriteErrorLine(ex.Message); } } }), "阿里云重新连接"); Executer.GetInstance().Start(new Action(() => { while (true) { try { if (IOTDevServer.GetInstance().GetIsConnected()) { SentData(null); FindDataAlarm(); Thread.Sleep(3000); } } catch (Exception ex) { ConsoleHelper.WriteErrorLine(ex.Message); } } }), "队列任务执行"); } public void FindDataAlarm() { devModel?.operatingDeviceStatus.data?.ForEach(par => { if (!string.IsNullOrEmpty(par.clientId)) { JsonMsg> jsonMsg = alarmController.QueryClientId(par.clientId); par.IsAlarm = (jsonMsg.obj != null && jsonMsg.obj.data != null && jsonMsg.obj.data.Count > 0)?true:false; } }); } /// /// 加载店铺信息 /// /// public void LoadingShopInformation(string clientId = "") { try { ConsoleHelper.WriteSuccessLine("加载店铺集合中."); JsonMsg> jsonMsg = deviceController.Query("", "",DateTime.MinValue,DateTime.MinValue); jsonMsg?.obj?.data?.ForEach(par => { int chid = 0; try { chid = int.Parse(par.ClientId); } catch (Exception ex) { chid = 0; } if (chid>0) { DevStatus devStatus = new DevStatus() { deviceName = par.devicename, gmtCreate = par.devicesecret, productKey = par.productkey, DeviceMC = par.devtype, DeviceMS = par.remark, DeviceSJ = par.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"), DeviceZT = "离线", clientId = par.ClientId, deviceId = par.DeviceId }; if (devModel.operatingDeviceStatus.data.Find(o => o.gmtCreate == par.devicesecret) == null) { ConsoleHelper.WriteSuccessLine($"加载设备.{par.devtype} {par.remark}"); devModel.operatingDeviceStatus.data.Insert(0,devStatus); } } }); ConsoleHelper.WriteSuccessLine($"加载设备数[ {jsonMsg?.obj?.data?.Count} ]台..."); } catch (Exception ex) { ConsoleHelper.WriteErrorLine($"错误{ex.Message}"); } } /// /// 订阅主题 /// /// public void Subscribe(string subscribe) { IOTDevServer.GetInstance().IOT_Subscribe(subscribe); ConsoleHelper.WriteSuccessLine("订阅主题: " + subscribe); } public void Publish(string PubTopic, CommandModel command) { ConsoleHelper.WriteWarningLine("发送数据 " + PubTopic + Tools.JsonConvertTools(command)); IOTDevServer.GetInstance().IOT_Publish(PubTopic, Tools.JsonConvertTools(command)); } /// /// 更新内存集合 /// /// public void SentData(ReceiveModel receiveModel) { try { if (receiveModel?.deviceContext != null && receiveModel?.status != null)//状态变更消息 { devModel?.operatingDeviceStatus.data?.Find(par => par.deviceName == receiveModel.deviceContext.deviceName)?.SetStatus(receiveModel.status.value); devModel?.infoMessage?.data?.Add(new DeviceBase { DeviceMC = receiveModel.deviceContext.deviceName, DeviceMS = $"设备{receiveModel.status.value}了!", DeviceSJ = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }); DevStatus dev = devModel?.operatingDeviceStatus.data?.Find(par => par.deviceName == receiveModel.deviceContext.deviceName); if (dev != null) { LoadingShopInformation(); } dev = devModel?.operatingDeviceStatus.data?.Find(par => par.deviceName == receiveModel.deviceContext.deviceName); if (dev != null) { logController.Create(new LogTable { devicename = receiveModel.deviceContext.deviceName, ClientId = dev.clientId, LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), LogType = "提示", LogMessage = $"设备{receiveModel.status.value}了!", LogVla = "通知" }); int index = 0; if (receiveModel.status.value == "离线") { //离线移除并添加到最后一位 devModel.operatingDeviceStatus.data.Remove(dev); devModel.operatingDeviceStatus.data.Add(dev); } else { //在线 往上一点 index = devModel.operatingDeviceStatus.data.FindIndex(0, ar => ar.DeviceZT.Contains("离线")); if (index > devModel.operatingDeviceStatus.data.Count - 1) index = devModel.operatingDeviceStatus.data.Count - 1; int now = devModel.operatingDeviceStatus.data.IndexOf(dev); Swap(devModel.operatingDeviceStatus.data, index, now); } } else { LoadingShopInformation(); } } devModel.OrderLine = orderProvider.OrderLine(new DataVApi.Order.RequestModel.FullScreenBasic()); devModel.OrderDataState = orderProvider.GetAllOrderDataState(new DataVApi.Order.RequestModel.FullScreenInput()); devModel.LocSale = orderProvider.GetLocSale(); object obj = orderProvider.OrderNumber(new DataVApi.Order.RequestModel.FullScreenBasic()); devModel.OrderNumber = Tools.JsonToObjectTools(Tools.JsonConvertTools(obj)); ScreenMonitorModel screen1Monitor = Tools.JsonToObjectTools(devModel.ToJSON()); #region 1.设置data默认值 if (screen1Monitor.operatingDeviceStatus.data.Count == 0) { screen1Monitor.operatingDeviceStatus.data.Add(new DevStatus { DeviceMC = "", DeviceMS = "", DeviceSJ = "", deviceName = "", DeviceZT = "", gmtCreate = "" }); } if (screen1Monitor.infoMessage.data.Count == 0) { screen1Monitor.infoMessage.data.Add(new DeviceBase { DeviceMC = "", DeviceMS = "", DeviceSJ = "" }); } #endregion string JSON = screen1Monitor.ToJSON(); if (!string.IsNullOrEmpty(JSON)) { screenController.CreateOrUpdate(new LargeScreenTable() { json = JSON, devicename = "Transit",ClientId = "-10",DeviceId="-10" }); IOTDevServer.GetInstance().IOT_Publish(IOTDevServer.ScreenShowPubTopic, JSON); } if (devModel.infoMessage.data != null && devModel.infoMessage.data.Count > 0) { List bases = devModel.infoMessage.data.ToList(); bases?.ForEach(par => { if (string.IsNullOrEmpty(par.DeviceMC)) devModel.infoMessage.data.Remove(par); if (!string.IsNullOrEmpty(par.DeviceSJ) && DateTime.Now.AddSeconds(-5) > DateTime.Parse(par.DeviceSJ)) { devModel.infoMessage.data.Remove(par); } }); } } catch (Exception ex) { ConsoleHelper.WriteErrorLine($"错误{ex.Message}"); } } /// /// list 位置交换 /// /// /// /// /// /// private static List Swap(List list, int index1, int index2) { var temp = list[index1]; list[index1] = list[index2]; list[index2] = temp; return list; } /// /// MQTT 消息 /// /// /// private void DevIOTActionHandler(string topic, string message) { if (string.IsNullOrEmpty(topic)) return; if (topic == IOTDevServer.HeartbeatSubTopic)//上下线订阅主题 { ReceiveModel receiveModel = Tools.JsonToObjectTools(message); if (receiveModel != null && receiveModel.status != null)//上下线通知 { if (receiveModel.deviceContext.deviceName != "Transit" && receiveModel.deviceContext.deviceName != "Transit_Test") { ConsoleHelper.WriteWarningLine("接收数据 " + topic + " 数据 " + message); SentData(receiveModel); } } } else if (topic == IOTDevServer.BroadcastTopic)//广播主题 { if (message.Contains("AlarmType")) { AlarmTable alarm= Tools.JsonToObjectTools(message); if (alarm.State == "n") { AlarmTable al = alarmController.mg.QueryKeyID(alarm.KeyID); if (al != null) { alarmController.mg.Modify(al.Id, "State", "n"); } } else { alarmController.Create(alarm); } } else if (message.Contains("LogType")) { logController.Create(Tools.JsonToObjectTools(message)); } } //else if (topic == IOTDevServer.TargetStatusSubTopic)//属性变更 //{ // ReceiveModel rEmodel = Tools.JsonToObjectTools(message); // string name= rEmodel.deviceContext.deviceName; // string status = rEmodel.props.NodeStatus.value; // string id = deviceController.QueryDeviceName(name)?.obj?.data?.ClientId; // screenController.CreateOrUpdate(new LargeScreenTable() { json = status, devicename = name, ClientId = id, DeviceId = "" }); //} } } }