|
|
@@ -0,0 +1,237 @@ |
|
|
|
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; } |
|
|
|
|
|
|
|
|
|
|
|
#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(); |
|
|
|
screenController = new ScreenController(); |
|
|
|
|
|
|
|
} |
|
|
|
#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】连接失败"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
IOTDevServer.UNConnectMqtt += new Action<string>((o) => { ConsoleHelper.WriteSuccessLine(o); }); |
|
|
|
|
|
|
|
Subscribe(IOTDevServer.HeartbeatSubTopic); |
|
|
|
|
|
|
|
IOTDevServer.DevIOTAction += DevIOTActionHandler; |
|
|
|
|
|
|
|
ConsoleHelper.WriteSuccessLine("开始接收数据,执行队列任务!"); |
|
|
|
} |
|
|
|
|
|
|
|
/// <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 = "1", |
|
|
|
LogMessage = $"设备{receiveModel.status.value}了!", |
|
|
|
LogVla = "上下线通知" |
|
|
|
}); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
LoadingShopInformation(); |
|
|
|
} |
|
|
|
} |
|
|
|
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> |
|
|
|
/// 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); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |