|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- using DataVApi.Order;
- using DataVAPI.Controllers;
- using DataVAPI.Model;
- 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; }
- #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
- /// <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("尝试连接阿里云.");
- if (IOTDevServer.GetInstance().CreateLinks("grgpECHSL7q", "Transit", "562dcc779b918a54c2d6589ec30ee230"))
- {
-
- ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接成功");
- }
- else
- {
- ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接失败");
- }
- //属性状态变更
- Subscribe(IOTDevServer.TargetStatusSubTopic);
-
- //订阅上下线
- Subscribe(IOTDevServer.HeartbeatSubTopic);
-
- //订阅主播消息
- Subscribe(IOTDevServer.BroadcastTopic);
-
- 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())
- {
-
- 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<List<AlarmTable>> jsonMsg = alarmController.QueryClientId(par.clientId);
- par.IsAlarm = (jsonMsg.obj != null && jsonMsg.obj.data != null && jsonMsg.obj.data.Count > 0)?true:false;
- }
- });
- }
-
- /// <summary>
- /// 加载店铺信息
- /// </summary>
- /// <param name="clientId"></param>
- public void LoadingShopInformation(string clientId = "")
- {
- try
- {
- ConsoleHelper.WriteSuccessLine("加载店铺集合中.");
- JsonMsg<List<DeviceTable>> 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.Add(devStatus);
- }
- }
- });
- ConsoleHelper.WriteSuccessLine($"加载设备数[ {jsonMsg?.obj?.data?.Count} ]台...");
- }
- 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)
- {
- 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 == "离线") 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<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>
- /// 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")
- {
- ConsoleHelper.WriteWarningLine("接收数据 " + topic + " 数据 " + message);
- SentData(receiveModel);
- }
- }
- }
- else if (topic == IOTDevServer.BroadcastTopic)//广播主题
- {
- if (message.Contains("AlarmType"))
- {
- alarmController.Create(Tools.JsonToObjectTools<AlarmTable>(message));
- }
- else if (message.Contains("LogType"))
- {
- logController.Create(Tools.JsonToObjectTools<LogTable>(message));
-
- }
- } 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 = "" });
- }
- }
- }
- }
|