diff --git a/LTEMvcApp/Models/StatisticsData.cs b/LTEMvcApp/Models/StatisticsData.cs index 365c186..1da76c3 100644 --- a/LTEMvcApp/Models/StatisticsData.cs +++ b/LTEMvcApp/Models/StatisticsData.cs @@ -25,6 +25,16 @@ namespace LTEMvcApp.Models /// public CpuInfo Cpu { get; set; } = new CpuInfo(); + /// + /// RF信息 + /// + public RfInfo Rf { get; set; } = new RfInfo(); + + /// + /// 样本信息 + /// + public SamplesInfo Samples { get; set; } = new SamplesInfo(); + /// /// 小区信息 /// @@ -81,12 +91,105 @@ namespace LTEMvcApp.Models }; // 解析CPU信息 + ParseCpuInfo(data, stats); + + // 解析RF信息 + ParseRfInfo(data, stats); + + // 解析样本信息 + ParseSamplesInfo(data, stats); + + // 解析小区信息 + ParseCellsInfo(data, stats); + + // 解析RF端口信息 + ParseRfPortsInfo(data, stats); + + // 解析全局计数器 + ParseGlobalCounters(data, stats); + + return stats; + } + + /// + /// 解析CPU信息 + /// + private static void ParseCpuInfo(JObject data, StatisticsData stats) + { if (data["cpu"] is JObject cpuObj) { stats.Cpu.Global = cpuObj["global"]?.Value() ?? 0; } + } - // 解析小区信息 + /// + /// 解析RF信息 + /// + private static void ParseRfInfo(JObject data, StatisticsData stats) + { + if (data["rf"] is JObject rfObj) + { + stats.Rf.RxSampleRate = rfObj["rx_sample_rate"]?.Value() ?? 0; + stats.Rf.TxSampleRate = rfObj["tx_sample_rate"]?.Value() ?? 0; + stats.Rf.RxCpuTime = rfObj["rx_cpu_time"]?.Value() ?? 0; + stats.Rf.TxCpuTime = rfObj["tx_cpu_time"]?.Value() ?? 0; + stats.Rf.RxtxDelayMin = rfObj["rxtx_delay_min"]?.Value() ?? 0; + stats.Rf.RxtxDelayAvg = rfObj["rxtx_delay_avg"]?.Value() ?? 0; + stats.Rf.RxtxDelayMax = rfObj["rxtx_delay_max"]?.Value() ?? 0; + stats.Rf.RxtxDelaySd = rfObj["rxtx_delay_sd"]?.Value() ?? 0; + } + } + + /// + /// 解析样本信息 + /// + private static void ParseSamplesInfo(JObject data, StatisticsData stats) + { + if (data["samples"] is JObject samplesObj) + { + // 解析TX样本 + if (samplesObj["tx"] is JArray txArray) + { + foreach (var txSample in txArray) + { + if (txSample is JObject txObj) + { + stats.Samples.TxSamples.Add(new SampleInfo + { + Rms = txObj["rms"]?.Value() ?? 0, + Max = txObj["max"]?.Value() ?? 0, + Sat = txObj["sat"]?.Value() ?? 0, + Count = txObj["count"]?.Value() ?? 0 + }); + } + } + } + + // 解析RX样本 + if (samplesObj["rx"] is JArray rxArray) + { + foreach (var rxSample in rxArray) + { + if (rxSample is JObject rxObj) + { + stats.Samples.RxSamples.Add(new SampleInfo + { + Rms = rxObj["rms"]?.Value() ?? 0, + Max = rxObj["max"]?.Value() ?? 0, + Sat = rxObj["sat"]?.Value() ?? 0, + Count = rxObj["count"]?.Value() ?? 0 + }); + } + } + } + } + } + + /// + /// 解析小区信息 + /// + private static void ParseCellsInfo(JObject data, StatisticsData stats) + { if (data["cells"] is JObject cellsObj) { foreach (var cell in cellsObj) @@ -127,31 +230,20 @@ namespace LTEMvcApp.Models UlGbrUseAvg = cellObj["ul_gbr_use_avg"]?.Value() ?? 0 }; - // 解析计数器 - if (cellObj["counters"] is JObject countersObj) - { - if (countersObj["messages"] is JObject messagesObj) - { - foreach (var msg in messagesObj) - { - cellInfo.Counters.Messages[msg.Key] = msg.Value?.Value() ?? 0; - } - } - if (countersObj["errors"] is JObject errorsObj) - { - foreach (var err in errorsObj) - { - cellInfo.Counters.Errors[err.Key] = err.Value?.Value() ?? 0; - } - } - } + // 解析小区计数器 + ParseCounters(cellObj, cellInfo.Counters); stats.Cells[cell.Key] = cellInfo; } } } + } - // 解析RF端口信息 + /// + /// 解析RF端口信息 + /// + private static void ParseRfPortsInfo(JObject data, StatisticsData stats) + { if (data["rf_ports"] is JObject rfPortsObj) { foreach (var port in rfPortsObj) @@ -170,27 +262,38 @@ namespace LTEMvcApp.Models } } } + } - // 解析全局计数器 + /// + /// 解析全局计数器 + /// + private static void ParseGlobalCounters(JObject data, StatisticsData stats) + { if (data["counters"] is JObject globalCountersObj) { - if (globalCountersObj["messages"] is JObject messagesObj) + ParseCounters(globalCountersObj, stats.Counters); + } + } + + /// + /// 解析计数器信息 + /// + private static void ParseCounters(JObject countersObj, CountersInfo counters) + { + if (countersObj["messages"] is JObject messagesObj) + { + foreach (var msg in messagesObj) { - foreach (var msg in messagesObj) - { - stats.Counters.Messages[msg.Key] = msg.Value?.Value() ?? 0; - } + counters.Messages[msg.Key] = msg.Value?.Value() ?? 0; } - if (globalCountersObj["errors"] is JObject errorsObj) + } + if (countersObj["errors"] is JObject errorsObj) + { + foreach (var err in errorsObj) { - foreach (var err in errorsObj) - { - stats.Counters.Errors[err.Key] = err.Value?.Value() ?? 0; - } + counters.Errors[err.Key] = err.Value?.Value() ?? 0; } } - - return stats; } } @@ -202,6 +305,41 @@ namespace LTEMvcApp.Models public double Global { get; set; } } + /// + /// RF信息 + /// + public class RfInfo + { + public double RxSampleRate { get; set; } + public double TxSampleRate { get; set; } + public double RxCpuTime { get; set; } + public double TxCpuTime { get; set; } + public double RxtxDelayMin { get; set; } + public double RxtxDelayAvg { get; set; } + public double RxtxDelayMax { get; set; } + public double RxtxDelaySd { get; set; } + } + + /// + /// 样本信息 + /// + public class SamplesInfo + { + public List TxSamples { get; set; } = new List(); + public List RxSamples { get; set; } = new List(); + } + + /// + /// 单个样本信息 + /// + public class SampleInfo + { + public double Rms { get; set; } + public double Max { get; set; } + public int Sat { get; set; } + public long Count { get; set; } + } + /// /// 小区信息 /// diff --git a/LTEMvcApp/Views/Statistics/Index.cshtml b/LTEMvcApp/Views/Statistics/Index.cshtml index c787f0d..a33622a 100644 --- a/LTEMvcApp/Views/Statistics/Index.cshtml +++ b/LTEMvcApp/Views/Statistics/Index.cshtml @@ -2,7 +2,80 @@ ViewData["Title"] = "统计数据"; } -
+ + +
@@ -20,114 +93,194 @@
-
- -
-
-
- -
- 客户端数量 - 0 +
+
+
+ +
+
+
+ +
+ 客户端数量 + 0 +
+
-
-
-
-
- -
- 队列大小 - 0 +
+
+ +
+ 队列大小 + 0 +
+
+
+
+
+ +
+ 最后更新 + - +
+
+
+
+
+ +
+ SSE状态 + 未连接 +
+
-
-
-
- -
- 最后更新 - - + + +
+
+
+ + +
+
+
+
+ + +
-
-
-
- -
- SSE状态 - 未连接 + + +
+ +
+
+
+
CPU使用率
+
+
+
+ +
+
+
+
+ + +
+
+
+
RF采样率
+
+
+
+ +
+
+
-
-
- -
-
-
- - + +
+
+
+
+
小区性能指标
+
+
+
+ +
+
+
+
-
-
-
- - + + +
+
+
+
+
TX样本数据
+
+
+
+ +
+
+
+
+ +
+
+
+
RX样本数据
+
+
+
+ +
+
+
+
-
-
- -
- - - - - - - - - - - - - - - - - -
客户端实例IDCPU使用率小区数量RF端口消息ID持续时间接收时间操作
-
+ +
+ + + + + + + + + + + + + + + + + +
客户端实例IDCPU使用率小区数量RF端口消息ID持续时间接收时间操作
+
- -