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"] = "统计数据";
}
-
+
+
+
-
-
-
-
-
-
-
-
客户端数量
-
0
+
+
+
-
-
-
-
-
-
-
最后更新
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
- 客户端 |
- 实例ID |
- CPU使用率 |
- 小区数量 |
- RF端口 |
- 消息ID |
- 持续时间 |
- 接收时间 |
- 操作 |
-
-
-
-
-
-
-
+
+
+
+
+
+ 客户端 |
+ 实例ID |
+ CPU使用率 |
+ 小区数量 |
+ RF端口 |
+ 消息ID |
+ 持续时间 |
+ 接收时间 |
+ 操作 |
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
- 小区ID |
- 下行比特率 |
- 上行比特率 |
- 下行使用率(平均) |
- 上行使用率(平均) |
- UE数量(平均) |
- ERAB数量(平均) |
- 调度用户(下行) |
- 调度用户(上行) |
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ 小区ID |
+ 下行比特率 |
+ 上行比特率 |
+ 下行使用率(平均) |
+ 上行使用率(平均) |
+ UE数量(平均) |
+ ERAB数量(平均) |
+ 调度用户(下行) |
+ 调度用户(上行) |
+
+
+
+
+
+
+
+
@@ -140,18 +293,247 @@
@section Scripts {
+
+
+