using System; using System.Collections.Generic; 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(); /// /// 小区信息 /// 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信息 if (data["cpu"] is JObject cpuObj) { stats.Cpu.Global = cpuObj["global"]?.Value() ?? 0; } // 解析小区信息 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 }; // 解析计数器 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; } } } stats.Cells[cell.Key] = cellInfo; } } } // 解析RF端口信息 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; } } } // 解析全局计数器 if (data["counters"] is JObject globalCountersObj) { if (globalCountersObj["messages"] is JObject messagesObj) { foreach (var msg in messagesObj) { stats.Counters.Messages[msg.Key] = msg.Value?.Value() ?? 0; } } if (globalCountersObj["errors"] is JObject errorsObj) { foreach (var err in errorsObj) { stats.Counters.Errors[err.Key] = err.Value?.Value() ?? 0; } } } return stats; } } /// /// CPU信息 /// public class CpuInfo { public double Global { 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) { return _statsQueue.ToList(); } } /// /// 获取最新的统计数据 /// 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; } } } } }