using System.Collections.Immutable; using System.Text.RegularExpressions; namespace LTEMvcApp.Models; /// /// LTE客户端类 - 对应JavaScript中的lte.client对象 /// public class LTEClient { #region 基础属性 /// /// 客户端ID /// public int ClientId { get; set; } /// /// 客户端名称 /// public string Name { get; set; } = string.Empty; /// /// 客户端配置 /// public ClientConfig Config { get; set; } = new(); /// /// 客户端状态 /// public ClientState State { get; set; } = ClientState.Stop; /// /// 版本信息 /// public string? Version { get; set; } /// /// 许可证信息 /// public string? License { get; set; } /// /// 模型类型 /// public string? Model { get; set; } #endregion #region 日志相关属性 /// /// 日志列表 /// public List Logs { get; set; } = new(); /// /// 日志数量 /// public int LogCount => Logs.Count; /// /// 是否已过滤 /// public bool Filtered { get; set; } /// /// 重置标志 /// public bool ResetFlag { get; set; } #endregion #region 解析器状态 /// /// 最后HARQ信息 /// public Dictionary> LastHarq { get; set; } = new(); /// /// 最后NB HARQ信息 /// public Dictionary>> LastNbHarq { get; set; } = new(); /// /// 帧信息 /// public FrameInfo Frame { get; set; } = new(); /// /// TMSI到UE ID的映射 /// public Dictionary TmsiToUeId { get; set; } = new(); /// /// RNTI到UE ID的映射 /// public Dictionary RntiToUeId { get; set; } = new(); /// /// UE列表 /// public Dictionary UeList { get; set; } = new(); /// /// 最后时间戳 /// public long LastTimestamp { get; set; } /// /// 时间戳偏移 /// public long TimestampOffset { get; set; } /// /// 最后小区 /// public int? LastCell { get; set; } #endregion #region 功能标志 /// /// 是否有小区信息 /// public bool HasCell { get; set; } /// /// 是否有物理层信息 /// public bool HasPhy { get; set; } /// /// 是否有数据 /// public bool HasData { get; set; } /// /// 是否有RNTI /// public bool HasRnti { get; set; } /// /// 是否有资源块 /// public bool HasRb { get; set; } /// /// 是否有信号记录 /// public bool HasSignalRecord { get; set; } #endregion #region 参数和组件 /// /// 参数信息 /// public Dictionary Parameters { get; set; } = new(); /// /// 组件列表 /// public Dictionary Components { get; set; } = new(); #endregion #region 构造函数 public LTEClient(ClientConfig config) { Config = config; Name = config.Name; ClientId = GenerateClientId(); ResetParserState(); } /// /// 使用名称创建客户端 /// /// 客户端名称 public LTEClient(string name) { Config = new ClientConfig { Name = name, Enabled = true }; Name = name; ClientId = GenerateClientId(); ResetParserState(); } #endregion #region 公共方法 /// /// 启动客户端 /// public void Start() { SetState(ClientState.Start); } /// /// 停止客户端 /// public void Stop() { SetState(ClientState.Stop); } /// /// 销毁客户端 /// public void Destroy() { SetState(ClientState.Destroy); } /// /// 重置日志 /// public void ResetLogs() { if (LogCount > 0) { ResetFlag = true; Logs.Clear(); ResetParserState(); HasCell = false; HasPhy = false; HasData = false; HasRnti = false; HasRb = false; HasSignalRecord = false; } } /// /// 添加日志 /// public void AddLog(LTELog log) { // 检查时间戳回绕 var timestamp = log.Timestamp + TimestampOffset; if (timestamp < LastTimestamp - 100) { Console.WriteLine($"Log wrap by {LastTimestamp - timestamp}"); timestamp += 86400000; // 24小时 TimestampOffset += 86400000; } LastTimestamp = log.Timestamp = timestamp; log.Client = this; log.Id = GenerateLogId(); } /// /// 设置头信息 /// public void SetHeaders(string[] headers) { // 实现头信息设置逻辑 } /// /// 初始化模型猜测 /// public void LogModelGuessInit() { // 实现模型猜测初始化逻辑 } /// /// 模型猜测 /// public void LogModelGuess(List> logs) { // 实现模型猜测逻辑 } /// /// 方向转换 /// public int DirConvert(LTELog log) { // 实现方向转换逻辑 return 0; } /// /// 字符串转ID /// public int StringToId(string str) { // 实现字符串转ID逻辑 return 0; } #endregion #region 私有方法 /// /// 设置状态 /// private void SetState(ClientState state) { if (State != state) { State = state; switch (state) { case ClientState.Stop: ResetLogs(); break; case ClientState.Start: case ClientState.Connected: break; case ClientState.Destroy: return; } } } /// /// 重置解析器状态 /// private void ResetParserState() { LastHarq.Clear(); LastNbHarq.Clear(); Frame = new FrameInfo(); TmsiToUeId.Clear(); RntiToUeId.Clear(); UeList.Clear(); LastTimestamp = 0; TimestampOffset = 0; LastCell = null; } /// /// 生成客户端ID /// private static int GenerateClientId() { return Interlocked.Increment(ref _clientIdCounter); } /// /// 生成日志ID /// private static int GenerateLogId() { return Interlocked.Increment(ref _logIdCounter); } #endregion #region 静态字段 private static int _clientIdCounter = 0; private static int _logIdCounter = 0; #endregion } /// /// 客户端配置 /// public class ClientConfig { public string Name { get; set; } = string.Empty; public bool Enabled { get; set; } = true; public string? Model { get; set; } public string? Address { get; set; } public bool Ssl { get; set; } public int ReconnectDelay { get; set; } = 15000; public bool Pause { get; set; } public bool Readonly { get; set; } public bool SkipLogMenu { get; set; } public bool Locked { get; set; } public bool Active { get; set; } public string? Password { get; set; } public Dictionary Logs { get; set; } = new(); } /// /// 客户端状态 /// public enum ClientState { Stop, Start, Loading, Connecting, Connected, Error, Destroy } /// /// 帧信息 /// public class FrameInfo { public int Last { get; set; } public int Hfn { get; set; } public long Timestamp { get; set; } = -1; } /// /// UE信息 /// public class UEInfo { public int UeId { get; set; } public string? Imsi { get; set; } public string? Imei { get; set; } public object? Caps { get; set; } }