237 lines
9.3 KiB
C#
237 lines
9.3 KiB
C#
/*
|
||
* <copyright>
|
||
Company="公司"
|
||
2020-2025
|
||
Author=JCH
|
||
Path=XiaoZhiSharp_ConsoleApp.Core.TickTimer.cs
|
||
* <copyright>
|
||
* --------------------------------------------------------------
|
||
* 机器名称:JCH
|
||
* 文件名:TickTimer.cs
|
||
* 版本号:V1.0.0.0
|
||
* 创建人:JCH
|
||
* 创建时间:2025/9/25 17:37:10
|
||
* 描述:
|
||
* --------------------------------------------------------------
|
||
* 修改时间:2025/9/25 17:37:10
|
||
* 修改人:JCH
|
||
* 版本号:V1.0.0.0
|
||
* 描述:
|
||
* --------------------------------------------------------------
|
||
*/
|
||
|
||
using Newtonsoft.Json.Linq;
|
||
using XiaoZhiSharp;
|
||
using XiaoZhiSharp.Kernels;
|
||
using XiaoZhiSharp.Utils;
|
||
|
||
namespace XiaoZhiSharp_ConsoleApp.Core
|
||
{
|
||
public class TickTimer
|
||
{
|
||
#region Singleton
|
||
private static volatile TickTimer instance;
|
||
private static readonly object syncRoot = new object();
|
||
private TickTimer()
|
||
{
|
||
|
||
}
|
||
public static TickTimer TT
|
||
{
|
||
get
|
||
{
|
||
if (instance == null)
|
||
{
|
||
lock (syncRoot)
|
||
{
|
||
if (instance == null)
|
||
{
|
||
instance = new TickTimer();
|
||
}
|
||
}
|
||
}
|
||
|
||
return instance;
|
||
}
|
||
}
|
||
|
||
#endregion Singleton
|
||
|
||
#region Properties
|
||
public PushTimer PushTimer { get { return PushFactory.Push.PushTimer; } }
|
||
|
||
#endregion Properties
|
||
|
||
private XiaoZhiAgent _agent;
|
||
private SystemMonitor monitor = new SystemMonitor();
|
||
public void RunTimer(XiaoZhiAgent agent)
|
||
{
|
||
_agent = agent;
|
||
string appsettingJson = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "Configs", "AppSettingConfig.json"));
|
||
// 快速从json文件中获取配置信息
|
||
var appsetting = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(appsettingJson);
|
||
var pushTimerIntervalStr = appsetting?["App"]?["UploadSysInfoInterval"]?.ToString();
|
||
int pushTimerInterval = 1000; // 默认值1秒钟
|
||
if (int.TryParse(pushTimerIntervalStr, out pushTimerInterval))
|
||
{
|
||
PushTimer.PushTimerInterval = pushTimerInterval;
|
||
}
|
||
PushTimer.OnPushTimer += OnSystemMessagePushTickTimer;
|
||
PushTimer.IsPushTimer = true;
|
||
}
|
||
|
||
private void OnSystemMessagePushTickTimer(object? sender, EventArgs e)
|
||
{
|
||
try
|
||
{
|
||
var sessionId = string.Empty;
|
||
if (_agent.ConnectState != System.Net.WebSockets.WebSocketState.Open)
|
||
{
|
||
#region 操作系统资源使用情况
|
||
var hardwareInfo = XiaoZhiSharp.Global.HardwareInfo;
|
||
hardwareInfo.RefreshCPUList(includePercentProcessorTime: true);
|
||
hardwareInfo.RefreshVideoControllerList();
|
||
hardwareInfo.RefreshMemoryStatus();
|
||
hardwareInfo.RefreshDriveList();
|
||
|
||
foreach (var cpuItem in hardwareInfo.CpuList)
|
||
{
|
||
//Console.WriteLine(cpuItem);
|
||
|
||
foreach (var cpuCore in cpuItem.CpuCoreList)
|
||
{
|
||
//Console.WriteLine(cpuCore);
|
||
}
|
||
}
|
||
var cpu = hardwareInfo.CpuList.Count > 0 ? hardwareInfo.CpuList.First().PercentProcessorTime : 0;
|
||
/*-----------------*/
|
||
foreach (var hardware in hardwareInfo.VideoControllerList)
|
||
{
|
||
//Console.WriteLine(hardware);
|
||
}
|
||
var gpu = 0d;//XiaoZhiSharp.Global.FormatBytes(hardwareInfo.VideoControllerList.Last().AdapterRAM);
|
||
|
||
var gpuInfo = monitor.GetHardwareInfo();
|
||
gpu = gpuInfo.GpuUsage;
|
||
/*-----------------*/
|
||
//Console.WriteLine(hardwareInfo.MemoryStatus);
|
||
double memory = ((double)hardwareInfo.MemoryStatus.TotalPhysical - hardwareInfo.MemoryStatus.AvailablePhysical) / hardwareInfo.MemoryStatus.TotalPhysical * 100;
|
||
/*-----------------*/
|
||
double totalDisk = 0;
|
||
double usedDisk = 0;
|
||
foreach (var drive in hardwareInfo.DriveList)
|
||
{
|
||
//Console.WriteLine(drive);
|
||
|
||
foreach (var partition in drive.PartitionList.Where(p => p.PrimaryPartition))
|
||
{
|
||
//Console.WriteLine(partition);
|
||
|
||
foreach (var volume in partition.VolumeList)
|
||
{
|
||
//Console.WriteLine(volume);
|
||
|
||
totalDisk += volume.Size;
|
||
usedDisk += (volume.Size - volume.FreeSpace);
|
||
}
|
||
}
|
||
}
|
||
var disk = usedDisk / totalDisk * 100;
|
||
var os = new XiaoZhiSharp.Models.OSModel
|
||
{
|
||
CPU = cpu,
|
||
GPU = gpu,
|
||
Memory = memory,
|
||
Disk = disk
|
||
};
|
||
#endregion 操作系统资源使用情况
|
||
#region GPS定位信息
|
||
var timestamp = DateTime.Now;
|
||
var gps = new XiaoZhiSharp.Models.GPSModel
|
||
{
|
||
Year = timestamp.Year,
|
||
Month = timestamp.Month,
|
||
Day = timestamp.Day,
|
||
Hour = timestamp.Hour,
|
||
Minute = timestamp.Minute,
|
||
Second = timestamp.Second,
|
||
Longitude = 0,
|
||
Latitude = 0,
|
||
Altitude = 0,
|
||
Speed = 0,
|
||
Heading = 0,
|
||
//Course = 0,
|
||
//CrabAngle = 0,
|
||
GPSSatellitesInView = 0,
|
||
GPSSatellitesUsed = 0,
|
||
BDSatellitesInView = 0,
|
||
BDSatellitesUsed = 0,
|
||
PDOP = 0,
|
||
HDOP = 0,
|
||
VDOP = 0,
|
||
//TDOP = 0
|
||
};
|
||
string appsettingJson = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "Configs", "AppSettingConfig.json"));
|
||
// 快速从json文件中获取配置信息
|
||
var appsetting = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(appsettingJson);
|
||
var gpsDataFilePath = appsetting?["App"]?["GPSDataFilePath"]?.ToString();
|
||
if (!string.IsNullOrEmpty(gpsDataFilePath) && File.Exists(gpsDataFilePath))
|
||
{
|
||
var gpsDataJson = File.ReadAllText(gpsDataFilePath);
|
||
gps = Newtonsoft.Json.JsonConvert.DeserializeObject<XiaoZhiSharp.Models.GPSModel>(gpsDataJson);
|
||
}
|
||
else
|
||
{
|
||
LogConsole.Warning("GPS数据文件路径无效或文件不存在,无法获取GPS定位信息");
|
||
#if DEBUG
|
||
gpsDataFilePath = Path.Combine(Environment.CurrentDirectory, "Configs", "gpsdata.json");
|
||
var gpsDataJson = File.ReadAllText(gpsDataFilePath);
|
||
gps = Newtonsoft.Json.JsonConvert.DeserializeObject<XiaoZhiSharp.Models.GPSModel>(gpsDataJson);
|
||
#endif
|
||
}
|
||
#endregion GPS定位信息
|
||
|
||
#region /* --采用 Newtonsoft.Json.Linq 构建 JSON 对象--*/
|
||
/*
|
||
JObject jsonObj = new JObject
|
||
{
|
||
["session_id"] = sessionId,
|
||
["type"] = "msgpush",
|
||
["OS"] = new JObject
|
||
{
|
||
["CPU"] = cpu,
|
||
["GPU"] = gpu,
|
||
["Memory"] = memory,
|
||
["Disk"] = disk
|
||
},
|
||
["GPS"] = new JObject
|
||
{
|
||
["DateTime"] = cpu,
|
||
["GPU"] = gpu,
|
||
["Memory"] = memory,
|
||
["Disk"] = disk
|
||
}
|
||
};*/
|
||
#endregion /* --采用 Newtonsoft.Json.Linq 构建 JSON 对象--*/
|
||
var jsonObj = new XiaoZhiSharp.Models.MsgPushModel
|
||
{
|
||
SessionId = sessionId,
|
||
Type = "msgpush",
|
||
OS = os,
|
||
GPS = gps
|
||
};
|
||
|
||
string msg = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj);
|
||
LogConsole.InfoLine(msg);
|
||
|
||
this._agent.ChatMessage(msg);
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogConsole.Warning(ex.Message);
|
||
}
|
||
}
|
||
}
|
||
}
|