|
@ -25,6 +25,16 @@ namespace LTEMvcApp.Models |
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
public CpuInfo Cpu { get; set; } = new CpuInfo(); |
|
|
public CpuInfo Cpu { get; set; } = new CpuInfo(); |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// RF信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public RfInfo Rf { get; set; } = new RfInfo(); |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 样本信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public SamplesInfo Samples { get; set; } = new SamplesInfo(); |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 小区信息
|
|
|
/// 小区信息
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
@ -81,12 +91,105 @@ namespace LTEMvcApp.Models |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// 解析CPU信息
|
|
|
// 解析CPU信息
|
|
|
|
|
|
ParseCpuInfo(data, stats); |
|
|
|
|
|
|
|
|
|
|
|
// 解析RF信息
|
|
|
|
|
|
ParseRfInfo(data, stats); |
|
|
|
|
|
|
|
|
|
|
|
// 解析样本信息
|
|
|
|
|
|
ParseSamplesInfo(data, stats); |
|
|
|
|
|
|
|
|
|
|
|
// 解析小区信息
|
|
|
|
|
|
ParseCellsInfo(data, stats); |
|
|
|
|
|
|
|
|
|
|
|
// 解析RF端口信息
|
|
|
|
|
|
ParseRfPortsInfo(data, stats); |
|
|
|
|
|
|
|
|
|
|
|
// 解析全局计数器
|
|
|
|
|
|
ParseGlobalCounters(data, stats); |
|
|
|
|
|
|
|
|
|
|
|
return stats; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 解析CPU信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private static void ParseCpuInfo(JObject data, StatisticsData stats) |
|
|
|
|
|
{ |
|
|
if (data["cpu"] is JObject cpuObj) |
|
|
if (data["cpu"] is JObject cpuObj) |
|
|
{ |
|
|
{ |
|
|
stats.Cpu.Global = cpuObj["global"]?.Value<double>() ?? 0; |
|
|
stats.Cpu.Global = cpuObj["global"]?.Value<double>() ?? 0; |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 解析小区信息
|
|
|
/// <summary>
|
|
|
|
|
|
/// 解析RF信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private static void ParseRfInfo(JObject data, StatisticsData stats) |
|
|
|
|
|
{ |
|
|
|
|
|
if (data["rf"] is JObject rfObj) |
|
|
|
|
|
{ |
|
|
|
|
|
stats.Rf.RxSampleRate = rfObj["rx_sample_rate"]?.Value<double>() ?? 0; |
|
|
|
|
|
stats.Rf.TxSampleRate = rfObj["tx_sample_rate"]?.Value<double>() ?? 0; |
|
|
|
|
|
stats.Rf.RxCpuTime = rfObj["rx_cpu_time"]?.Value<double>() ?? 0; |
|
|
|
|
|
stats.Rf.TxCpuTime = rfObj["tx_cpu_time"]?.Value<double>() ?? 0; |
|
|
|
|
|
stats.Rf.RxtxDelayMin = rfObj["rxtx_delay_min"]?.Value<double>() ?? 0; |
|
|
|
|
|
stats.Rf.RxtxDelayAvg = rfObj["rxtx_delay_avg"]?.Value<double>() ?? 0; |
|
|
|
|
|
stats.Rf.RxtxDelayMax = rfObj["rxtx_delay_max"]?.Value<double>() ?? 0; |
|
|
|
|
|
stats.Rf.RxtxDelaySd = rfObj["rxtx_delay_sd"]?.Value<double>() ?? 0; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 解析样本信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
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<double>() ?? 0, |
|
|
|
|
|
Max = txObj["max"]?.Value<double>() ?? 0, |
|
|
|
|
|
Sat = txObj["sat"]?.Value<int>() ?? 0, |
|
|
|
|
|
Count = txObj["count"]?.Value<long>() ?? 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<double>() ?? 0, |
|
|
|
|
|
Max = rxObj["max"]?.Value<double>() ?? 0, |
|
|
|
|
|
Sat = rxObj["sat"]?.Value<int>() ?? 0, |
|
|
|
|
|
Count = rxObj["count"]?.Value<long>() ?? 0 |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 解析小区信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private static void ParseCellsInfo(JObject data, StatisticsData stats) |
|
|
|
|
|
{ |
|
|
if (data["cells"] is JObject cellsObj) |
|
|
if (data["cells"] is JObject cellsObj) |
|
|
{ |
|
|
{ |
|
|
foreach (var cell in cellsObj) |
|
|
foreach (var cell in cellsObj) |
|
@ -127,31 +230,20 @@ namespace LTEMvcApp.Models |
|
|
UlGbrUseAvg = cellObj["ul_gbr_use_avg"]?.Value<double>() ?? 0 |
|
|
UlGbrUseAvg = cellObj["ul_gbr_use_avg"]?.Value<double>() ?? 0 |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// 解析计数器
|
|
|
// 解析小区计数器
|
|
|
if (cellObj["counters"] is JObject countersObj) |
|
|
ParseCounters(cellObj, cellInfo.Counters); |
|
|
{ |
|
|
|
|
|
if (countersObj["messages"] is JObject messagesObj) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var msg in messagesObj) |
|
|
|
|
|
{ |
|
|
|
|
|
cellInfo.Counters.Messages[msg.Key] = msg.Value?.Value<int>() ?? 0; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (countersObj["errors"] is JObject errorsObj) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var err in errorsObj) |
|
|
|
|
|
{ |
|
|
|
|
|
cellInfo.Counters.Errors[err.Key] = err.Value?.Value<int>() ?? 0; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
stats.Cells[cell.Key] = cellInfo; |
|
|
stats.Cells[cell.Key] = cellInfo; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 解析RF端口信息
|
|
|
/// <summary>
|
|
|
|
|
|
/// 解析RF端口信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private static void ParseRfPortsInfo(JObject data, StatisticsData stats) |
|
|
|
|
|
{ |
|
|
if (data["rf_ports"] is JObject rfPortsObj) |
|
|
if (data["rf_ports"] is JObject rfPortsObj) |
|
|
{ |
|
|
{ |
|
|
foreach (var port in rfPortsObj) |
|
|
foreach (var port in rfPortsObj) |
|
@ -170,27 +262,38 @@ namespace LTEMvcApp.Models |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 解析全局计数器
|
|
|
/// <summary>
|
|
|
|
|
|
/// 解析全局计数器
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private static void ParseGlobalCounters(JObject data, StatisticsData stats) |
|
|
|
|
|
{ |
|
|
if (data["counters"] is JObject globalCountersObj) |
|
|
if (data["counters"] is JObject globalCountersObj) |
|
|
{ |
|
|
{ |
|
|
if (globalCountersObj["messages"] is JObject messagesObj) |
|
|
ParseCounters(globalCountersObj, stats.Counters); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 解析计数器信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
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<int>() ?? 0; |
|
|
counters.Messages[msg.Key] = msg.Value?.Value<int>() ?? 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<int>() ?? 0; |
|
|
counters.Errors[err.Key] = err.Value?.Value<int>() ?? 0; |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return stats; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -202,6 +305,41 @@ namespace LTEMvcApp.Models |
|
|
public double Global { get; set; } |
|
|
public double Global { get; set; } |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// RF信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
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; } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 样本信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class SamplesInfo |
|
|
|
|
|
{ |
|
|
|
|
|
public List<SampleInfo> TxSamples { get; set; } = new List<SampleInfo>(); |
|
|
|
|
|
public List<SampleInfo> RxSamples { get; set; } = new List<SampleInfo>(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 单个样本信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class SampleInfo |
|
|
|
|
|
{ |
|
|
|
|
|
public double Rms { get; set; } |
|
|
|
|
|
public double Max { get; set; } |
|
|
|
|
|
public int Sat { get; set; } |
|
|
|
|
|
public long Count { get; set; } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 小区信息
|
|
|
/// 小区信息
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|