using System.Collections.Concurrent; using Newtonsoft.Json.Linq; namespace LTEMvcApp.Models { /// /// 统计数据模型 /// public class StatisticsData { /// /// 消息类型 /// public string Message { get; set; } = ""; /// /// 实例ID /// public string InstanceId { get; set; } = ""; /// /// CPU信息 /// public CpuInfo Cpu { get; set; } = new CpuInfo(); /// /// RF信息 /// public RfInfo Rf { get; set; } = new RfInfo(); /// /// 样本信息 /// public SamplesInfo Samples { get; set; } = new SamplesInfo(); /// /// 小区信息 /// public Dictionary Cells { get; set; } = new Dictionary(); /// /// RF端口信息 /// public Dictionary RfPorts { get; set; } = new Dictionary(); /// /// 计数器信息 /// public CountersInfo Counters { get; set; } = new CountersInfo(); /// /// 持续时间 /// public double Duration { get; set; } /// /// 消息ID /// public int MessageId { get; set; } /// /// 时间戳 /// public double Time { get; set; } /// /// 接收时间 /// public DateTime ReceivedAt { get; set; } = DateTime.Now; /// /// 客户端名称 /// public string ClientName { get; set; } = ""; /// /// 从JObject创建StatisticsData /// public static StatisticsData FromJObject(JObject data, string clientName) { var stats = new StatisticsData { Message = data["message"]?.ToString() ?? "", InstanceId = data["instance_id"]?.ToString() ?? "", Duration = data["duration"]?.Value() ?? 0, MessageId = data["message_id"]?.Value() ?? 0, Time = data["time"]?.Value() ?? 0, ClientName = clientName }; // 解析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) { if (cell.Value is JObject cellObj) { var cellInfo = new CellInfo { DlBitrate = cellObj["dl_bitrate"]?.Value() ?? 0, UlBitrate = cellObj["ul_bitrate"]?.Value() ?? 0, DlTx = cellObj["dl_tx"]?.Value() ?? 0, UlTx = cellObj["ul_tx"]?.Value() ?? 0, DlRetx = cellObj["dl_retx"]?.Value() ?? 0, UlRetx = cellObj["ul_retx"]?.Value() ?? 0, DlUseMin = cellObj["dl_use_min"]?.Value() ?? 0, DlUseMax = cellObj["dl_use_max"]?.Value() ?? 0, DlUseAvg = cellObj["dl_use_avg"]?.Value() ?? 0, UlUseMin = cellObj["ul_use_min"]?.Value() ?? 0, UlUseMax = cellObj["ul_use_max"]?.Value() ?? 0, UlUseAvg = cellObj["ul_use_avg"]?.Value() ?? 0, DlSchedUsersMin = cellObj["dl_sched_users_min"]?.Value() ?? 0, DlSchedUsersMax = cellObj["dl_sched_users_max"]?.Value() ?? 0, DlSchedUsersAvg = cellObj["dl_sched_users_avg"]?.Value() ?? 0, UlSchedUsersMin = cellObj["ul_sched_users_min"]?.Value() ?? 0, UlSchedUsersMax = cellObj["ul_sched_users_max"]?.Value() ?? 0, UlSchedUsersAvg = cellObj["ul_sched_users_avg"]?.Value() ?? 0, UeCountMin = cellObj["ue_count_min"]?.Value() ?? 0, UeCountMax = cellObj["ue_count_max"]?.Value() ?? 0, UeCountAvg = cellObj["ue_count_avg"]?.Value() ?? 0, ErabCountMin = cellObj["erab_count_min"]?.Value() ?? 0, ErabCountMax = cellObj["erab_count_max"]?.Value() ?? 0, ErabCountAvg = cellObj["erab_count_avg"]?.Value() ?? 0, DlGbrUseMin = cellObj["dl_gbr_use_min"]?.Value() ?? 0, DlGbrUseMax = cellObj["dl_gbr_use_max"]?.Value() ?? 0, DlGbrUseAvg = cellObj["dl_gbr_use_avg"]?.Value() ?? 0, UlGbrUseMin = cellObj["ul_gbr_use_min"]?.Value() ?? 0, UlGbrUseMax = cellObj["ul_gbr_use_max"]?.Value() ?? 0, UlGbrUseAvg = cellObj["ul_gbr_use_avg"]?.Value() ?? 0 }; // 解析小区计数器 ParseCounters(cellObj, cellInfo.Counters); stats.Cells[cell.Key] = cellInfo; } } } } /// /// 解析RF端口信息 /// private static void ParseRfPortsInfo(JObject data, StatisticsData stats) { if (data["rf_ports"] is JObject rfPortsObj) { foreach (var port in rfPortsObj) { if (port.Value is JObject portObj) { var rfPortInfo = new RfPortInfo(); if (portObj["rxtx_delay"] is JObject delayObj) { foreach (var delay in delayObj) { rfPortInfo.RxtxDelay[delay.Key] = delay.Value?.Value() ?? 0; } } stats.RfPorts[port.Key] = rfPortInfo; } } } } /// /// 解析全局计数器 /// private static void ParseGlobalCounters(JObject data, StatisticsData stats) { if (data["counters"] is JObject globalCountersObj) { ParseCounters(globalCountersObj, stats.Counters); } } /// /// 解析计数器信息 /// private static void ParseCounters(JObject countersObj, CountersInfo counters) { if (countersObj["messages"] is JObject messagesObj) { foreach (var msg in messagesObj) { counters.Messages[msg.Key] = msg.Value?.Value() ?? 0; } } if (countersObj["errors"] is JObject errorsObj) { foreach (var err in errorsObj) { counters.Errors[err.Key] = err.Value?.Value() ?? 0; } } } } /// /// CPU信息 /// public class CpuInfo { 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; } } /// /// 小区信息 /// public class CellInfo { public double DlBitrate { get; set; } public double UlBitrate { get; set; } public double DlTx { get; set; } public double UlTx { get; set; } public double DlRetx { get; set; } public double UlRetx { get; set; } public double DlUseMin { get; set; } public double DlUseMax { get; set; } public double DlUseAvg { get; set; } public double UlUseMin { get; set; } public double UlUseMax { get; set; } public double UlUseAvg { get; set; } public double DlSchedUsersMin { get; set; } public double DlSchedUsersMax { get; set; } public double DlSchedUsersAvg { get; set; } public double UlSchedUsersMin { get; set; } public double UlSchedUsersMax { get; set; } public double UlSchedUsersAvg { get; set; } public double UeCountMin { get; set; } public double UeCountMax { get; set; } public double UeCountAvg { get; set; } public double ErabCountMin { get; set; } public double ErabCountMax { get; set; } public double ErabCountAvg { get; set; } public double DlGbrUseMin { get; set; } public double DlGbrUseMax { get; set; } public double DlGbrUseAvg { get; set; } public double UlGbrUseMin { get; set; } public double UlGbrUseMax { get; set; } public double UlGbrUseAvg { get; set; } public CountersInfo Counters { get; set; } = new CountersInfo(); } /// /// RF端口信息 /// public class RfPortInfo { public Dictionary RxtxDelay { get; set; } = new Dictionary(); } /// /// 计数器信息 /// public class CountersInfo { public Dictionary Messages { get; set; } = new Dictionary(); public Dictionary Errors { get; set; } = new Dictionary(); } /// /// 统计数据队列管理器 /// public class StatisticsQueueManager { private readonly ConcurrentQueue _statsQueue = new ConcurrentQueue(); private readonly int _maxQueueSize = 1000; // 最大队列大小 private readonly object _lockObject = new object(); /// /// 添加统计数据到队列 /// public void EnqueueStats(StatisticsData stats) { lock (_lockObject) { _statsQueue.Enqueue(stats); // 维持队列大小 while (_statsQueue.Count > _maxQueueSize) { _statsQueue.TryDequeue(out _); } } } /// /// 获取队列中的所有统计数据 /// public List GetAllStats() { lock (_lockObject) { var result = new List(); foreach (var item in _statsQueue) { if (item != null) result.Add(item); } return result; } } /// /// 获取最新的统计数据 /// public StatisticsData? GetLatestStats() { lock (_lockObject) { return _statsQueue.TryPeek(out var stats) ? stats : null; } } /// /// 清空队列 /// public void Clear() { lock (_lockObject) { while (_statsQueue.TryDequeue(out _)) { // 清空所有数据 } } } /// /// 获取队列大小 /// public int Count { get { lock (_lockObject) { return _statsQueue.Count; } } } } }