|
- 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
- {
- /// <summary>
- /// 上下线通知
- /// </summary>
- public class ProcessServer
- {
- /// <summary>
- /// 上报大屏总Model
- /// </summary>
- 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; }
- public List<DevStatus> devStatuses { get; set; }=new List<DevStatus>();
- #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
- bool FistBOOL = false;
- /// <summary>
- /// 初始化
- /// </summary>
- public void Initialize()
- {
- devModel = new ScreenMonitorModel();
- devModel.operatingDeviceStatus = new OperatingDeviceStatus(); devModel.operatingDeviceStatus.data = new List<DevStatus>();//现场设备于状态
- devModel.infoMessage = new InfoMessage(); devModel.infoMessage.data = new List<DeviceBase>();//通知消息
-
- //加载店铺信息 //加载店铺信息
- LoadingShopInformation();
- //MQTT 数据接收处理
- ConsoleHelper.WriteInfoLine("尝试连接阿里云.");
- //设置变量
- IOTDevServer.GetInstance().Set(DataBus.ProductKey, DataBus.DeviceName, DataBus.DeviceSecret);
- IOTDevServer.GetInstance().SetSub(new List<string> { IOTDevServer.HeartbeatSubTopic, IOTDevServer.BroadcastTopic });
-
- if (IOTDevServer.GetInstance().CreateLinks(DataBus.ProductKey, DataBus.DeviceName, DataBus.DeviceSecret))
- {
- //订阅上下线
- Subscribe(IOTDevServer.HeartbeatSubTopic);
- //订阅主播消息
- Subscribe(IOTDevServer.BroadcastTopic);
- ConsoleHelper.WriteInfoLine($"阿里云【Transit】连接成功");
- }
- else
- {
- ConsoleHelper.WriteErrorLine($"阿里云【Transit】连接失败");
- }
-
- IOTDevServer.UNConnectMqtt += new Action<string>((o) => { ConsoleHelper.WriteSuccessLine(o); });
-
- IOTDevServer.DevIOTAction += DevIOTActionHandler;
-
- QueueTask();
-
- ConsoleHelper.WriteSuccessLine("开始接收数据,执行队列任务!");
- }
-
- /// <summary>
- /// 队列任务
- /// </summary>
- 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.WriteInfoLine($"阿里云【Transit】重新连接成功");
- //订阅上下线
- Subscribe(IOTDevServer.HeartbeatSubTopic);
- //订阅主播消息
- Subscribe(IOTDevServer.BroadcastTopic);
- }
- else
- {
- ConsoleHelper.WriteErrorLine($"阿里云【Transit】重新连接失败");
- }
- Thread.Sleep(360000);
- }
-
- }
- 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))
- {
- par.IsAlarm = alarmController.QueryClientProcess(par.clientId);
- }
- });
- }
-
- /// <summary>
- /// 加载店铺信息
- /// </summary>
- /// <param name="clientId"></param>
- public void LoadingShopInformation(string clientId = "")
- {
- try
- {
- devStatuses = devModel.operatingDeviceStatus.data;
- ConsoleHelper.WriteSuccessLine("加载店铺集合中.");
- JsonMsg<List<DeviceTable>> jsonMsg = deviceController.Query("", "", DateTime.MinValue, DateTime.MinValue);
- if (jsonMsg?.obj?.data.Count > 0)
- {
- //if ((devStatuses.Count != devModel.operatingDeviceStatus.data.Count) || devStatuses.Count<=0)
- {
- devModel.operatingDeviceStatus.data.Clear();
- 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
- };
- ConsoleHelper.WriteSuccessLine($"加载设备.{par.devtype} {par.remark}");
-
-
- DevStatus dev= devStatuses?.Find(k => k.deviceName == par.devicename);
- if (dev != null && dev.DeviceZT == "在线") { devStatus.SetStatus(dev.DeviceZT); }
- devModel.operatingDeviceStatus.data.Insert(0, devStatus);
- if (dev != null && dev.DeviceZT == "在线")
- {
- OnOrOffline(dev.DeviceZT, devModel.operatingDeviceStatus.data, devStatus);
- }
- }
- });
- ConsoleHelper.WriteSuccessLine($"加载设备数[ {jsonMsg?.obj?.data?.Count} ]台...");
- }
- }
- else
- {
- ConsoleHelper.WriteSuccessLine("查询店铺集合为空.");
- }
-
-
-
- }
- catch (Exception ex)
- {
- ConsoleHelper.WriteErrorLine($"错误{ex.Message}");
-
- }
-
- }
-
- /// <summary>
- /// 订阅主题
- /// </summary>
- /// <param name="subscribe"></param>
- 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<CommandModel>(command));
- IOTDevServer.GetInstance().IOT_Publish(PubTopic, Tools.JsonConvertTools<CommandModel>(command));
- }
-
- /// <summary>
- /// 更新内存集合
- /// </summary>
- /// <param name="receive"></param>
- 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,
- DeviceId = dev.deviceId,
- LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- LogType = "提示",
- LogMessage = $"设备{receiveModel.status.value}了!",
- LogVla = "通知"
- });
- OnOrOffline(receiveModel.status.value, devModel.operatingDeviceStatus.data, dev);
- }
- 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<OrderCount>(Tools.JsonConvertTools(obj));
- ScreenMonitorModel screen1Monitor = Tools.JsonToObjectTools<ScreenMonitorModel>(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<DeviceBase> 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}");
-
- }
- }
-
- /// <summary>
- /// 上下线调整
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="status"></param>
- /// <param name="list"></param>
- /// <param name="present"></param>
- /// <returns></returns>
- private static List<T> OnOrOffline<T>(string status, List<T> list, T present)
- {
- int now = list.IndexOf(present);
- switch (status)
- {
-
- case "离线":
- list.Remove(present);
- list.Add(present);
- break;
- default:
- //在线
- list.Remove(present);
- list.Insert(0, present);
- break;
- }
- return list;
- }
- /// <summary>
- /// list 位置交换
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="list"></param>
- /// <param name="index1"></param>
- /// <param name="index2"></param>
- /// <returns></returns>
- private static List<T> Swap<T>(List<T> list, int index1, int index2)
- {
- var temp = list[index1];
- list[index1] = list[index2];
- list[index2] = temp;
- return list;
- }
-
- /// <summary>
- /// MQTT 消息
- /// </summary>
- /// <param name="topic"></param>
- /// <param name="message"></param>
- private void DevIOTActionHandler(string topic, string message)
- {
- if (string.IsNullOrEmpty(topic)) return;
- if (topic == IOTDevServer.HeartbeatSubTopic)//上下线订阅主题
- {
- ReceiveModel receiveModel = Tools.JsonToObjectTools<ReceiveModel>(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<AlarmTable>(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);
- }
- FindDataAlarm();
- }
- else if (message.Contains("LogType"))
- {
- logController.Create(Tools.JsonToObjectTools<LogTable>(message));
- }
- else if (message == "刷新店铺列表")
- {
- LoadingShopInformation();
- }
- }
- //else if (topic == IOTDevServer.TargetStatusSubTopic)//属性变更
- //{
- // ReceiveModel rEmodel = Tools.JsonToObjectTools<ReceiveModel>(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 = "" });
- //}
- }
- }
- }
|