using BroadcastModule;
using db;
using Monitor;
using MySql.Data.MySqlClient;
using NumMachine;
using parkMonitor.language;
using parkMonitor.model;
using PLCS7;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using WebServer;
namespace Monitor
{
public class Monitor : IMonitor
{
///
/// 监控模块单例
///
public static Monitor ins { get; set; }
///
/// 中控系统总状态
///
public static bool globalStatus = false;
///
/// 初始化步骤
///
public static int initializeState = 0;
///
/// PLC对象句柄
///
public static AbstractPLCLinker PLC = null;
public static string plcIPAddr { get; set; }
public static int plcRack { get; set; }
public static int plcSlot { get; set; }
public static string[] plcDatablockConfig { get; set; }
public static int plcTerminalCount { get; set; }
public static int plcParkingSpaceCount { get; set; }
public static int plcRefreshInterval { get; set; }
public static MainBlockStru mainBlockInfo { get; set; }
public static List parkingSpaceInfo { get; set; }
///
/// 远程数据库操作句柄
///
public static DBOperation remoteDBOper;
///
/// 本地数据库操作句柄
///
public static DBOperation localDBOper;
///
/// 显示板操作对象句柄
///
public static BroadcastBoard allInOneMachine;
public static string allInOneMachineIP { get; set; }
public static int allInOneMachinePort { get; set; }
///
/// 号牌机操作句柄
///
public static INumMachineLinker numMachineLinker;
public static IntPtr flpHandle;
///
/// 本地web操作句柄
///
public static IWebServer webServer;
public static int webPort { get; set; }
///
/// 系统初始化器句柄
///
internal static SystemInitializer sysInitializer;
///
/// 系统关闭状态
///
bool isClosing;
///
/// 车库ID
///
public static int garageID;
private void PLCUpdate()
{
while (!isClosing)
{
if (PLC != null && PLC.isConnected)
{
List received = PLC.ReadFromPLC(PLCDataType.terminal, 0);
//首先获取所有终端信息
try
{
//终端总数相同
if (Terminal.Terminal.terminalInfo.Count == plcTerminalCount)
{
for (int i = 0; i < plcTerminalCount; i++)
{
//一旦发现差异立刻更新
if (!Terminal.Terminal.terminalInfo[i].Equals(received[i]))
{
Terminal.Terminal.terminalInfo[i] = (TerminalStru)received[i];
}
}
}
else
{
//初始化终端信息列表
Terminal.Terminal.terminalInfo.Clear();
for (int i = 0; i < plcTerminalCount; i++)
{
Terminal.Terminal.terminalInfo.Add((TerminalStru)received[i]);
Terminal.Terminal.termUsedMap.Add(((TerminalStru)received[i]).terminalID, false);
}
}
}
catch (Exception e) { Console.WriteLine("PLC监控终端数据," + e.Message); }
//接下来获取中控监控信息
try
{
received = PLC.ReadFromPLC(PLCDataType.central, 0);
if (received.Count > 0 && !mainBlockInfo.Equals(received[0]))
{
mainBlockInfo = (MainBlockStru)received[0];
}
}
catch (Exception e) { Console.WriteLine("PLC监控中控数据," + e.Message); }
//最后获得所有车位信息
try
{
received = PLC.ReadFromPLC(PLCDataType.parkingSpace, 0);
//Console.WriteLine(parkingSpaceInfo.Count+","+ plcParkingSpaceCount);
//车位总数相同
if (parkingSpaceInfo.Count == plcParkingSpaceCount)
{
for (int i = 0; i < plcParkingSpaceCount; i++)
{
//一旦发现差异立刻更新
if (!parkingSpaceInfo[i].Equals(received[i]))
{
parkingSpaceInfo[i] = (ParkingSpaceStru)received[i];
}
}
}
else
{
parkingSpaceInfo.Clear();
for (int i = 0; i < plcParkingSpaceCount; i++)
{
parkingSpaceInfo.Add((ParkingSpaceStru)received[i]);
}
}
}
catch (Exception e) { Console.WriteLine("PLC监控车位数据," + e.Message); }
}
Thread.Sleep(500);
}
}
///
/// CPU名
///
///
private static string getCPUName()
{
try
{
string str = string.Empty;
ManagementClass mcCPU = new ManagementClass("Win32_Processor");
ManagementObjectCollection mocCPU = mcCPU.GetInstances();
foreach (ManagementObject m in mocCPU)
{
string name = m["Name"].ToString();
return name;
}
}
catch { }
return "";
}
///
/// 操作系统版本
///
public static string getOsVersion()
{
string str = "Windows 10";
try
{
string hdId = string.Empty;
ManagementClass hardDisk = new ManagementClass("Win32_OperatingSystem");
ManagementObjectCollection hardDiskC = hardDisk.GetInstances();
foreach (ManagementObject m in hardDiskC)
{
str = m["Name"].ToString().Split('|')[0].Replace("Microsoft", "").Trim();
break;
}
}
catch
{
}
return str;
}
///
/// 显卡名
///
public static string getGPUName()
{
string result = "";
try
{
ManagementClass hardDisk = new ManagementClass("Win32_VideoController");
ManagementObjectCollection hardDiskC = hardDisk.GetInstances();
foreach (ManagementObject m in hardDiskC)
{
result = m["VideoProcessor"].ToString();
break;
}
}
catch
{
}
return result;
}
///
/// 获取系统内存大小
///
public static string getMenSize()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher(); //用于查询一些如系统信息的管理对象
searcher.Query = new SelectQuery("Win32_PhysicalMemory", "", new string[] { "Capacity" });//设置查询条件
ManagementObjectCollection collection = searcher.Get(); //获取内存容量
ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator();
long capacity = 0;
while (em.MoveNext())
{
ManagementBaseObject baseObj = em.Current;
if (baseObj.Properties["Capacity"].Value != null)
{
try
{
capacity += long.Parse(baseObj.Properties["Capacity"].Value.ToString());
}
catch
{
return "-GB";
}
}
}
int gb = 1024 * 1024 * 1024;
return ((double)capacity / gb).ToString("0.0") + "GB";
}
//************************************ 公有方法 **********************************
public Monitor(IntPtr flpHandle)
{
Monitor.flpHandle = flpHandle;
parkingSpaceInfo = new List();
mainBlockInfo = new MainBlockStru();
}
public void DisplayPLCInfo()
{
}
public void DisplayTerminalState()
{
}
public void DisplayLicensePlate()
{
}
public void DisplayImage()
{
}
public static string GetSysInfo()
{
string info = "";
Language lng = Language.ins;
try
{
string endl = "\r\n";
info += lng.autoPackSys + " " + lng.centralPort + endl+ endl;
info += lng.version + ":" + SysConst.version() + endl + endl;
info += lng.hostNmae + ":" + Dns.GetHostName() + endl + endl;
info += lng.os + ":" + getOsVersion() + endl + endl;
info += lng.cpu + ":" + getCPUName() + endl + endl;
info += lng.mem + ":" + getMenSize() + endl + endl;
info += lng.gpu + ":" + getGPUName() + endl + endl;
}
catch (Exception) { }
return info;
}
public static List GetParkingRecords()
{
DateTime now = DateTime.Now;
DateTime yesterday = DateTime.Now - (new TimeSpan(1, 0, 0, 0));
DateTime twoDaysAgo = DateTime.Now - (new TimeSpan(2, 0, 0, 0));
string getParkingRecordsSql = "select parkingRecordsID,userID,numberPlate,parkingSpaceID,realParkTime,realGetTime,receiptNum,parkingPrice from parkingrecords where realParkTime like '" + yesterday.ToString("yyyy-MM-dd") + "' or '" + now.ToString("yyyy-MM-dd") + "' or '" + twoDaysAgo.ToString("yyyy-MM-dd") + "';";
MySqlDataReader reader = localDBOper.Query(getParkingRecordsSql);
List result = new List();
while (reader != null && reader.Read())
{
if (reader.HasRows)
{
object[] temp = new object[reader.FieldCount];
reader.GetValues(temp);
result.Add(temp);
}
}
try
{
if (reader != null) {
reader.Close();
reader.Dispose();
}
}
catch { }
return result;
}
public static List GetOrderRecords()
{
return null;
}
public void Start()
{
if (flpHandle != IntPtr.Zero)
{
//初始化系统
if (sysInitializer == null)
{
sysInitializer = new SystemInitializer();
}
Task.Factory.StartNew(() =>
{
sysInitializer.Init(flpHandle);
});
//更新PLC数据
Task.Factory.StartNew(() =>
{
PLCUpdate();
});
}
}
public void Stop()
{
sysInitializer.Stop();
}
}
//public class ParkingRecord
//{
// int parkingRecordsID;
// int userID;
// string numberPlate;
// int parkingSpaceID;
//}
}