using BPA.Message.Enum; using BPA.Message.IOT; using BPASmartClient.Business; using BPASmartClient.Device; using BPA.Helper; using BPASmartClient.IoT.Model; using BPASmartDatavDeviceClient.IoT; using System; using System.Collections.Generic; using System.Linq; using System.Threading; namespace BPASmartClient.IoT { /// /// DataV客户端数据中心 /// public class DataVClient { #region 单例模式 private volatile static DataVClient _Instance; public static DataVClient GetInstance => _Instance ?? (_Instance = new DataVClient()); /// /// 显示定义构造函数为私有,表示只允许自己实例化自己 /// public DataVClient() { DataVApiAddress = InternetInfo.DataVApiAddress; ClientId = Plugin.GetInstance.GetPlugin().ClientId.ToString(); DeviceName = System.Configuration.ConfigurationManager.AppSettings["DeviceName"].ToString(); ProductKey = System.Configuration.ConfigurationManager.AppSettings["ProductKey"].ToString(); DeviceSecret = System.Configuration.ConfigurationManager.AppSettings["DeviceSecret"].ToString(); StartupMode = System.Configuration.ConfigurationManager.AppSettings["StartupMode"].ToString(); BroadcastPubTopic = InternetInfo.BroadcastPubTopic; //MaintainTable maintainTable = new MaintainTable(); //maintainTable.Id = Guid.NewGuid().ToString(); //maintainTable.MaintainTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //maintainTable.MaintainType = "一般"; //maintainTable.MaintainVla = "MorkS"; //maintainTable.MaintainMessage = "xxxxx故障需要维修"; //maintainTable.DeviceId = ""; //maintainTable.ClientId = ClientId; //maintainTable.devicename = DeviceDataV.deviceTable.devicename; //maintainTables.Add(maintainTable); } #endregion #region 公有变量 public string StartupMode { set; get; } public string DeviceName { set; get; } public string ProductKey { set; get; } public string DeviceSecret { set; get; } public string BroadcastPubTopic { set; get; } /// /// DataV 服务地址 /// public string DataVApiAddress { set; get; } /// /// 客户端ID /// public string ClientId { set; get; } public List ListDeviceId { set; get; } = new List(); /// /// MQTT上报集合 /// public DataVReport DeviceDataV = new DataVReport(); /// /// 大屏上报Model /// public DataVAPI.Tool.IOT.IOTDevSXModel iOTDevSXModel = new DataVAPI.Tool.IOT.IOTDevSXModel() { }; /// /// key值 /// public Dictionary keyValues = new Dictionary(); /// /// 维保通知 /// public List maintainTables = new List(); #endregion #region API调用 /// /// 刷新店铺列表 /// public void RefreshTheListOfStores() { try { if (DeviceDataV != null && DeviceDataV.GetIsConnected() && DeviceDataV.deviceTable != null) { string api = DataVApiAddress + "/api/Device/FlushedDevice"; // APIHelper.GetInstance.GetRequest(api, 1000); APIHelper.GetInstance.GetRequest(api); //DeviceDataV.IOT_Publish(BroadcastPubTopic, Tools.JsonConvertTools("刷新店铺列表")); } } catch (Exception ex) { MessageLog.GetInstance.Show(ex.Message); } } /// /// 增加告警信息 /// /// /// 返回ID public string HttpAddAlarm(AlarmTable alarmTable) { try { if (DeviceDataV != null && DeviceDataV.GetIsConnected() && DeviceDataV.deviceTable != null) { alarmTable.ClientId = ClientId; alarmTable.devicename = DeviceDataV.deviceTable.devicename; DeviceDataV.IOT_Publish(BroadcastPubTopic, Tools.JsonConvertTools(alarmTable)); } } catch (Exception ex) { MessageLog.GetInstance.Show(ex.Message); } return alarmTable.KeyID; } /// /// 增加维保信息 /// /// /// public string HttpAddMaintain(MaintainTable maintainTable) { try { if (DeviceDataV != null && DeviceDataV.GetIsConnected() && DeviceDataV.deviceTable != null) { maintainTable.Id = Guid.NewGuid().ToString(); //maintainTable.MaintainTime = DateTime.Now.ToString(); //maintainTable.MaintainType = "一般"; //maintainTable.MaintainVla = "MorkS"; //maintainTable.MaintainMessage = "xxxxx故障需要维修"; //maintainTable.DeviceId = ""; maintainTable.ClientId = ClientId; maintainTable.devicename = DeviceDataV.deviceTable.devicename; maintainTables.Add(maintainTable); } } catch (Exception ex) { MessageLog.GetInstance.Show(ex.Message); } return maintainTable.KeyID; } /// /// 增加日志信息 /// /// /// 返回ID public string HttpAddLog(LogTable logTable) { string id = string.Empty; try { if (DeviceDataV != null && DeviceDataV.GetIsConnected() && DeviceDataV.deviceTable != null) { logTable.ClientId = ClientId; logTable.devicename = DeviceDataV.deviceTable.devicename; DeviceDataV.IOT_Publish(BroadcastPubTopic, Tools.JsonConvertTools(logTable)); } } catch (Exception ex) { MessageLog.GetInstance.Show(ex.Message); } return id; } #endregion #region 公用 /// /// 释放 /// public void Dispose() { TaskManage.GetInstance.StopTask("DataV数据上报"); } /// /// 初始化 /// public void Initialize() { string message = string.Empty; if (StartupMode == "API") { while (ListDeviceId.Count == 0) { Plugin.GetInstance?.GetPlugin()?.GetDevices()?.ForEach(device => { if (device != null) { ListDeviceId.Add(device.DeviceId); } }); } if (DeviceDataV.Initialize(DataVApiAddress, ClientId, ListDeviceId.Count == 0 ? "" : ListDeviceId?.First().ToString(), ref message)) { ProductKey = DeviceDataV.deviceTable.productkey; DeviceName = DeviceDataV.deviceTable.devicename; DeviceSecret = DeviceDataV.deviceTable.devicesecret; DeviceDataV.DataVMessageAction += DevIOTActionHandler; MessageLog.GetInstance.Show($"客户端:【{ClientId}】,设备名称{DeviceName}阿里云连接成功"); UpDataFile(); } else { MessageLog.GetInstance.ShowEx(message); } } else { if (DeviceDataV.InitializeNo(ProductKey, DeviceName, DeviceSecret, ref message)) { MessageLog.GetInstance.Show($"客户端:【{ClientId}】,设备名称{DeviceName}阿里云连接成功"); DeviceDataV.DataVMessageAction += DevIOTActionHandler; UpDataFile(); } else MessageLog.GetInstance.ShowEx(message); } Plugin.GetInstance?.GetPlugin()?.GetDevices()?.ForEach(device => { device.AddErrorAction += AddErrorAction; device.DeleteErrorAction += DeleteErrorAction; }); } /// /// 启动DataV数据上报 /// public void Start() { TaskManage.GetInstance.StartLong(new Action(() => { if (DeviceDataV != null && DeviceDataV.GetIsConnected() && DeviceDataV.deviceTable != null) { iOTDevSXModel.Device1 = String.Empty; iOTDevSXModel.Device2 = String.Empty; iOTDevSXModel.Device3 = String.Empty; List dataVNode = new List(); Plugin.GetInstance?.GetPlugin()?.GetDevices()?.ForEach(device => { var obj = new { DeviceId = device.DeviceId.ToString(), devicename = DeviceDataV.deviceTable.devicename, Name = device.Name, DeviceType = device.DeviceType.ToString(), IsBusy = device.IsBusy ? "忙碌" : "空闲", IsBusyColor = device.IsBusy ? new ALYColor { r = 255, g = 0, b = 0, a = 1 } : new ALYColor { r = 51, g = 232, b = 34, a = 1 }, IsHealth = device.IsHealth ? "健康" : "故障", IsHealthColor = !device.IsHealth ? new ALYColor { r = 255, g = 0, b = 0, a = 1 } : new ALYColor { r = 51, g = 232, b = 34, a = 1 }, Status = device.Status.GetIOTStatus(), gjxx = device.GetError(), rzxx = device.GetLog(), VariableMonitor = device.GetVariableMonitor(), }; dataVNode.Add(obj); if (string.IsNullOrEmpty(iOTDevSXModel.Device1)) iOTDevSXModel.Device1 = $"[{device.Name}]:{(device.IsBusy ? "忙碌" : "空闲")}-{(device.IsHealth ? "健康" : "故障")}"; else if (string.IsNullOrEmpty(iOTDevSXModel.Device2)) iOTDevSXModel.Device2 = $"[{device.Name}]:{(device.IsBusy ? "忙碌" : "空闲")}-{(device.IsHealth ? "健康" : "故障")}"; else if (string.IsNullOrEmpty(iOTDevSXModel.Device3)) iOTDevSXModel.Device3 = $"[{device.Name}]:{(device.IsBusy ? "忙碌" : "空闲")}-{(device.IsHealth ? "健康" : "故障")}"; }); if (dataVNode.Count > 0) { if (maintainTables.Count > 0) { iOTDevSXModel.Maintain = Tools.JsonConvertTools(maintainTables); } iOTDevSXModel.NodeStatus = Tools.JsonConvertTools(new { data = dataVNode }); DeviceDataV.IOT_Publish(DeviceDataV.PubTopic, iOTDevSXModel.Tojson()); } } Thread.Sleep(3000); }), "DataV数据上报", true); } /// /// 文件上传请求 /// public void UpDataFile() { try { if (DeviceDataV != null && DeviceDataV.GetIsConnected() && DeviceDataV.deviceTable != null) { FileUpload.FileRequest(DeviceDataV); } } catch (Exception ex) { MessageLog.GetInstance.Show(ex.Message); } } #endregion #region 私有 /// /// 增加告警 /// /// private void AddErrorAction(int Devid, object obj) { string id = Guid.NewGuid().ToString(); HttpAddAlarm(new AlarmTable { AlarmTime = GetPropertyValue(obj, "Time").ToString(), AlarmType = GetPropertyValue(obj, "Type").ToString(), AlarmMessage = GetPropertyValue(obj, "Text").ToString(), AlarmVla = "告警", DeviceId = Devid.ToString(), KeyID = id, }); keyValues[GetPropertyValue(obj, "Time").ToString() + GetPropertyValue(obj, "Type").ToString() + GetPropertyValue(obj, "Text").ToString()] = id; //MessageLog.GetInstance.AddDeviceAlarmLogShow(GetPropertyValue(obj, "Time").ToString() + GetPropertyValue(obj, "Type").ToString() + GetPropertyValue(obj, "Text").ToString(),id); } /// /// 删除告警 /// /// private void DeleteErrorAction(int Devid, object obj) { string message = GetPropertyValue(obj, "Time").ToString() + GetPropertyValue(obj, "Type").ToString() + GetPropertyValue(obj, "Text").ToString(); if (keyValues.ContainsKey(message)) { HttpAddAlarm(new AlarmTable { AlarmTime = GetPropertyValue(obj, "Time").ToString(), AlarmType = GetPropertyValue(obj, "Type").ToString(), AlarmMessage = GetPropertyValue(obj, "Text").ToString(), AlarmVla = "告警", DeviceId = Devid.ToString(), KeyID = keyValues[message], State = "n" }); //MessageLog.GetInstance.DeleteDeviceAlarmLogShow(message, keyValues[message]); } } /// /// 接收云端消息 /// /// /// private void DevIOTActionHandler(string deviceId, string topic, string message) { if (DeviceDataV.BroadcastTopic == topic && !string.IsNullOrEmpty(message))//广播主题消息,将广播消息发送到相应客户端 { IOTCommandModel iOTCommand = Tools.JsonToObjectTools(message); if (iOTCommand.deviceName == DeviceDataV.deviceTable.devicename) ActionManage.GetInstance.Send(iOTCommand, "IotBroadcast"); } else if (DeviceDataV.FileUpLoadReplyTopic == topic)//文件请求上传响应Topic { FileUploadModelResult result = Tools.JsonToObjectTools(message); if (result.code == 200) { string FileName = result.data?.fileName; string uploadId = result.data?.uploadId; FileUpload.FileSend(DeviceDataV, uploadId, result.data.offset); //MessageLog.GetInstance.Show($"[阿里云上传]:请求上传云回执成功."); } else MessageLog.GetInstance.Show($"[阿里云上传]:请求上传云回执失败.原因:{result.message}"); } else if (DeviceDataV.FileUpLoadSendReplyTopic == topic)//文件上传Topic { FileUploadModelResult result = Tools.JsonToObjectTools(message); FileUpload.modelResult = result; } else if (DeviceDataV.CancelFileUpLoadSendReplyTopic == topic)//取消文件上传Topic { FileUploadModelResult result = Tools.JsonToObjectTools(message); } } /// /// 获取某个对象中的属性值 /// /// /// public object GetPropertyValue(object info, string field) { if (info == null) return null; Type t = info.GetType(); IEnumerable property = from pi in t.GetProperties() where pi.Name.ToLower() == field.ToLower() select pi; return property.First().GetValue(info, null); } #endregion } } //命令实体类 public class IOTCommandModel { /// /// 设备名称 /// public string deviceName { get; set; } /// /// 命令名称:0 控制类 1 设置属性 2 通知信息类 /// public int CommandName { get; set; } /// /// 命令变量:执行变量 key为属性或时间 value为值或者消息 /// public Dictionary CommandValue { get; set; } }