diff --git a/MasstransferCommon/MasstransferCommon.csproj b/MasstransferCommon/MasstransferCommon.csproj
index 4dccdb8..59a383e 100644
--- a/MasstransferCommon/MasstransferCommon.csproj
+++ b/MasstransferCommon/MasstransferCommon.csproj
@@ -7,8 +7,14 @@
-
-
+
+
+
+
+
+
+
+
diff --git a/MasstransferCommon/Scheduler/ExecuteTask.cs b/MasstransferCommon/Scheduler/ExecuteTask.cs
new file mode 100644
index 0000000..22c286e
--- /dev/null
+++ b/MasstransferCommon/Scheduler/ExecuteTask.cs
@@ -0,0 +1,39 @@
+namespace MasstransferCommon.Scheduler;
+
+///
+/// 通过定时执行某个委托方法
+///
+public class ExecuteTask : ITask
+{
+ private readonly Timer _timer;
+
+ public ExecuteTask(string name, Action action, int interval = 100)
+ {
+ Name = name;
+ Interval = interval;
+ Action = action;
+ _timer = new Timer(_ => { Run(); }, null, TimeSpan.Zero, TimeSpan.FromMilliseconds(Interval));
+ }
+
+ public int Interval { get; set; }
+
+ public string Name { get; set; }
+
+ public Action Action { get; set; }
+
+ ///
+ /// 移除任务进行定时任务释放
+ ///
+ public void Dispose()
+ {
+ _timer.Dispose();
+ }
+
+ ///
+ /// 定义一个虚方法, 子类可以重写该方法实现具体的轮询逻辑
+ ///
+ public void Run()
+ {
+ Action.Invoke();
+ }
+}
\ No newline at end of file
diff --git a/MasstransferCommon/Scheduler/ITask.cs b/MasstransferCommon/Scheduler/ITask.cs
new file mode 100644
index 0000000..baedaac
--- /dev/null
+++ b/MasstransferCommon/Scheduler/ITask.cs
@@ -0,0 +1,6 @@
+namespace MasstransferCommon.Scheduler;
+
+public interface ITask : IDisposable
+{
+ public void Run();
+}
\ No newline at end of file
diff --git a/MasstransferCommon/Scheduler/JobScheduler.cs b/MasstransferCommon/Scheduler/JobScheduler.cs
new file mode 100644
index 0000000..986eff8
--- /dev/null
+++ b/MasstransferCommon/Scheduler/JobScheduler.cs
@@ -0,0 +1,44 @@
+using System.Collections.Concurrent;
+using Serilog;
+
+namespace MasstransferCommon.Scheduler;
+
+public class JobScheduler
+{
+ private static readonly ConcurrentDictionary Tasks = new();
+
+ ///
+ /// 添加调度任务
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static void AddTask(string name, Action action, int interval = 100, int delay = 0)
+ {
+ try
+ {
+ if (Tasks.ContainsKey(name)) return;
+
+ if (delay > 0)
+ {
+ Thread.Sleep(delay);
+ }
+
+ Tasks[name] = new ExecuteTask(name, action, interval);
+ }
+ catch (Exception e)
+ {
+ Log.Error(e, $"添加 {name} 任务失败");
+ }
+ }
+
+ ///
+ /// 移除任务
+ ///
+ ///
+ public static void RemoveTask(string name)
+ {
+ if (Tasks.TryRemove(name, out var task)) task.Dispose();
+ }
+}
\ No newline at end of file
diff --git a/MasstransferCommunicate/Mqtt/Model/Message.cs b/MasstransferCommunicate/Mqtt/Model/Message.cs
index 93ecb04..873f474 100644
--- a/MasstransferCommunicate/Mqtt/Model/Message.cs
+++ b/MasstransferCommunicate/Mqtt/Model/Message.cs
@@ -4,5 +4,5 @@ public class Message
{
public string Topic { get; set; }
- public string Payload { get; set; }
+ public Payload Payload { get; set; }
}
\ No newline at end of file
diff --git a/MasstransferCommunicate/Mqtt/Model/Payload.cs b/MasstransferCommunicate/Mqtt/Model/Payload.cs
new file mode 100644
index 0000000..a2e3c2c
--- /dev/null
+++ b/MasstransferCommunicate/Mqtt/Model/Payload.cs
@@ -0,0 +1,10 @@
+namespace MasstransferInfrastructure.Mqtt.Model;
+
+public class Payload
+{
+ public string MsgId { get; set; }
+
+ public DateTime ConsumeTime { get; set; }
+
+ public object Data { get; set; }
+}
\ No newline at end of file
diff --git a/MasstransferExporter/MasstransferExporter.csproj b/MasstransferExporter/MasstransferExporter.csproj
index 2b14c81..25c03ab 100644
--- a/MasstransferExporter/MasstransferExporter.csproj
+++ b/MasstransferExporter/MasstransferExporter.csproj
@@ -7,4 +7,15 @@
enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MasstransferExporter/Program.cs b/MasstransferExporter/Program.cs
index e5dff12..4506e9c 100644
--- a/MasstransferExporter/Program.cs
+++ b/MasstransferExporter/Program.cs
@@ -1,3 +1,13 @@
-// See https://aka.ms/new-console-template for more information
+using MasstransferCommon.Scheduler;
+using MasstransferExporter.Stat;
-Console.WriteLine("Hello, World!");
\ No newline at end of file
+class Program
+{
+ static void Main()
+ {
+ JobScheduler.AddTask("Test", SystemStatExporter.Collect, 3000);
+
+
+ Console.ReadLine();
+ }
+}
\ No newline at end of file
diff --git a/MasstransferExporter/Stat/Model/CpuLoad.cs b/MasstransferExporter/Stat/Model/CpuLoad.cs
new file mode 100644
index 0000000..1ba7244
--- /dev/null
+++ b/MasstransferExporter/Stat/Model/CpuLoad.cs
@@ -0,0 +1,11 @@
+namespace MasstransferExporter.Stat.DTO;
+
+///
+/// CPU 负载信息
+///
+public class CpuLoad
+{
+ public int Core { get; set; }
+
+ public int Usage { get; set; }
+}
\ No newline at end of file
diff --git a/MasstransferExporter/Stat/Model/DiskStat.cs b/MasstransferExporter/Stat/Model/DiskStat.cs
new file mode 100644
index 0000000..2b469ae
--- /dev/null
+++ b/MasstransferExporter/Stat/Model/DiskStat.cs
@@ -0,0 +1,15 @@
+namespace MasstransferExporter.Stat.DTO;
+
+///
+/// 磁盘信息
+///
+public class DiskStat
+{
+ public string Name { get; set; } = string.Empty;
+
+ public long Total { get; set; }
+
+ public long Used { get; set; }
+
+ public long Free { get; set; }
+}
\ No newline at end of file
diff --git a/MasstransferExporter/Stat/Model/MemoryStat.cs b/MasstransferExporter/Stat/Model/MemoryStat.cs
new file mode 100644
index 0000000..1cdc2be
--- /dev/null
+++ b/MasstransferExporter/Stat/Model/MemoryStat.cs
@@ -0,0 +1,13 @@
+namespace MasstransferExporter.Stat.DTO;
+
+///
+/// 内存状态统计信息
+///
+public class MemoryStat
+{
+ public ulong TotalMemory { get; set; }
+
+ public ulong AvailableMemory { get; set; }
+
+ public ulong UsedMemory { get; set; }
+}
\ No newline at end of file
diff --git a/MasstransferExporter/Stat/Model/NetworkStat.cs b/MasstransferExporter/Stat/Model/NetworkStat.cs
new file mode 100644
index 0000000..dd75067
--- /dev/null
+++ b/MasstransferExporter/Stat/Model/NetworkStat.cs
@@ -0,0 +1,11 @@
+namespace MasstransferExporter.Stat.DTO;
+
+///
+/// 网络状态统计信息
+///
+public class NetworkStat
+{
+
+
+
+}
\ No newline at end of file
diff --git a/MasstransferExporter/Stat/Model/OSInfo.cs b/MasstransferExporter/Stat/Model/OSInfo.cs
new file mode 100644
index 0000000..896d001
--- /dev/null
+++ b/MasstransferExporter/Stat/Model/OSInfo.cs
@@ -0,0 +1,15 @@
+namespace MasstransferExporter.Stat.DTO;
+
+///
+/// 操作系统信息
+///
+public class OSInfo
+{
+ public string Platform { get; set; } = string.Empty;
+
+ public string Version { get; set; } = string.Empty;
+
+ public string ServicePack { get; set; } = string.Empty;
+
+ public string Architecture { get; set; } = string.Empty;
+}
\ No newline at end of file
diff --git a/MasstransferExporter/Stat/Model/SystemStat.cs b/MasstransferExporter/Stat/Model/SystemStat.cs
new file mode 100644
index 0000000..841275a
--- /dev/null
+++ b/MasstransferExporter/Stat/Model/SystemStat.cs
@@ -0,0 +1,6 @@
+namespace MasstransferExporter.Stat.DTO;
+
+public class SystemStat
+{
+
+}
\ No newline at end of file
diff --git a/MasstransferExporter/Stat/SystemStatExporter.cs b/MasstransferExporter/Stat/SystemStatExporter.cs
new file mode 100644
index 0000000..b184129
--- /dev/null
+++ b/MasstransferExporter/Stat/SystemStatExporter.cs
@@ -0,0 +1,153 @@
+using System.Management;
+using System.Net.NetworkInformation;
+using MasstransferCommon.Utils;
+using MasstransferExporter.Stat.DTO;
+using Serilog;
+
+namespace MasstransferExporter.Stat;
+
+///
+/// 系统状态统计信息
+/// 定时触发,30s 一次
+///
+public class SystemStatExporter
+{
+ ///
+ /// 收集系统状态信息
+ ///
+ public static void Collect()
+ {
+ try
+ {
+ var osInfo = CollectOsInformation();
+ var cpuLoad = CollectCpuStat();
+ var memoryStat = CollectMemoryStat();
+ var diskStat = CollectDiskStat();
+
+ Console.WriteLine(JsonUtil.ToJson(osInfo));
+ Console.WriteLine(JsonUtil.ToJson(cpuLoad));
+ Console.WriteLine(JsonUtil.ToJson(memoryStat));
+ Console.WriteLine(JsonUtil.ToJson(diskStat));
+ }
+ catch (Exception e)
+ {
+ Log.Error(e, "收集系统状态信息失败");
+ }
+ }
+
+ ///
+ /// 收集操作系统信息
+ ///
+ private static OSInfo CollectOsInformation()
+ {
+ // 获取操作系统版本
+ var os = Environment.OSVersion;
+ // 获取平台
+ var platform = os.Platform;
+ // 获取版本号
+ var version = os.Version;
+
+ // 是否为 64 位
+ var is64Bit = Environment.Is64BitOperatingSystem;
+
+ return new OSInfo
+ {
+ Platform = platform.ToString(),
+ Version = version.ToString(),
+ ServicePack = os.ServicePack,
+ Architecture = is64Bit ? "x64" : "x86"
+ };
+ }
+
+ ///
+ /// 收集CPU信息
+ ///
+ private static CpuLoad CollectCpuStat()
+ {
+ // 获取CPU总数
+ var cpuLoad = new CpuLoad
+ {
+ Core = Environment.ProcessorCount
+ };
+ // 获取每个处理器的使用率
+ var searcher = new ManagementObjectSearcher("select * from Win32_Processor");
+ foreach (var item in searcher.Get())
+ {
+ var loadPercentage = item["LoadPercentage"];
+ if (loadPercentage != null)
+ {
+ cpuLoad.Usage = (ushort)loadPercentage;
+ }
+ }
+
+ return cpuLoad;
+ }
+
+ ///
+ /// 收集内存信息
+ ///
+ private static MemoryStat CollectMemoryStat()
+ {
+ var wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
+ var searcher = new ManagementObjectSearcher(wql);
+ foreach (ManagementObject result in searcher.Get())
+ {
+ var totalVisibleMemorySize = (ulong)result["TotalVisibleMemorySize"];
+ var freePhysicalMemory = (ulong)result["FreePhysicalMemory"];
+
+ var usedMemory = totalVisibleMemorySize - freePhysicalMemory;
+
+ return new MemoryStat
+ {
+ TotalMemory = totalVisibleMemorySize,
+ UsedMemory = usedMemory,
+ AvailableMemory = freePhysicalMemory
+ };
+ }
+
+ return default;
+ }
+
+ ///
+ /// 收集磁盘信息
+ ///
+ private static List CollectDiskStat()
+ {
+ // 获取所有的驱动器信息
+ var drives = DriveInfo.GetDrives();
+
+ return (from drive in drives
+ where drive.IsReady
+ select new DiskStat
+ {
+ Name = drive.Name, Total = drive.TotalSize / (1024 * 1024 * 1024),
+ Used = (drive.TotalSize - drive.AvailableFreeSpace) / (1024 * 1024 * 1024),
+ Free = drive.AvailableFreeSpace / (1024 * 1024 * 1024)
+ }).ToList();
+ }
+
+ ///
+ /// 收集网络信息
+ ///
+ private static void CollectNetworkStat()
+ {
+ }
+
+ ///
+ /// 统计获取网络延时
+ ///
+ ///
+ private static long GetNetworkLatency(string host)
+ {
+ try
+ {
+ var ping = new Ping();
+ var reply = ping.Send(host);
+ return reply.Status == IPStatus.Success ? reply.RoundtripTime : 999;
+ }
+ catch (Exception _)
+ {
+ return 999;
+ }
+ }
+}
\ No newline at end of file
diff --git a/MasstransferExporter/obj/rider.project.model.nuget.info b/MasstransferExporter/obj/rider.project.model.nuget.info
index 99674da..bf4ae2c 100644
--- a/MasstransferExporter/obj/rider.project.model.nuget.info
+++ b/MasstransferExporter/obj/rider.project.model.nuget.info
@@ -1 +1 @@
-17173810876283690
\ No newline at end of file
+17181740462385706
\ No newline at end of file