# LTEClient SetModel 方法实现说明 ## 概述 本文档说明了在 `LTEClient` 类中实现的 `SetModel` 方法,该方法参考了 JavaScript 版本 `client.js` 中的 `setModel` 方法。 ## 实现的功能 ### 1. SetModel 方法 ```csharp public bool SetModel(string model, bool force = false) ``` **功能:** - 设置客户端的模型类型(如 ENB、UE、MME 等) - 根据模型类型设置相应的传输方向 - 配置层方向映射 - 通知日志管理器更新网格列 **参数:** - `model`: 模型名称(如 "ENB", "UE", "MME" 等) - `force`: 是否强制设置,即使模型相同也重新设置 **返回值:** - `true`: 设置成功 - `false`: 设置失败 ### 2. TryModelHint 方法 ```csharp public bool TryModelHint(List models) ``` **功能:** - 根据模型提示信息尝试设置合适的模型 - 使用正则表达式匹配模型提示 - 如果匹配成功,调用 `SetModel` 方法 ### 3. SetModelHint 方法 ```csharp public void SetModelHint(string hint) ``` **功能:** - 设置模型提示信息 - 用于后续的模型自动识别 ## 模型配置 ### 支持的模型类型 ```csharp private static readonly Dictionary ClientModelConfig = new() { { "RUE", new ClientModelConfig { Icon = "icon-ue2" } }, { "UE", new ClientModelConfig { Icon = "icon-ue" } }, { "PROBE", new ClientModelConfig() }, { "ENB", new ClientModelConfig { Icon = "icon-air", ModelHint = "enb|gnb|bbu", Title = "RAN" } }, { "N3IWF", new ClientModelConfig { Icon = "icon-air", ModelHint = "n3iwf", Title = "N3IWF" } }, { "MME", new ClientModelConfig { Icon = "icon-server", ModelHint = "epc|mme|amf", Title = "CN" } }, { "MBMSGW", new ClientModelConfig { Icon = "icon-download", ModelHint = "mbms" } }, { "IMS", new ClientModelConfig { Icon = "icon-dial" } }, { "MONITOR", new ClientModelConfig { Icon = "icon-monitor" } }, { "LICENSE", new ClientModelConfig { Icon = "icon-file" } } }; ``` ### 模型配置属性 ```csharp public class ClientModelConfig { public string? Icon { get; set; } // 图标 public string? ModelHint { get; set; } // 模型提示(正则表达式) public string? Title { get; set; } // 标题 public Dictionary>? LayerDir { get; set; } // 层方向配置 } ``` ## 传输方向设置 根据不同的模型类型,自动设置传输方向: ```csharp switch (model?.ToUpper()) { case "ENB": TxDir = 2; // DIR_DL (下行) RxDir = 1; // DIR_UL (上行) RanIds.Clear(); break; case "UE": TxDir = 1; // DIR_UL (上行) RxDir = 2; // DIR_DL (下行) break; default: break; } ``` ## 使用示例 ### 1. 直接设置模型 ```csharp var client = new LTEClient(config, logsManager); client.SetModel("ENB"); // 设置为基站模型 ``` ### 2. 强制重新设置模型 ```csharp client.SetModel("UE", force: true); // 强制设置为UE模型 ``` ### 3. 使用模型提示 ```csharp client.SetModelHint("enb-001"); // 设置模型提示 var models = new List { "ENB", "UE", "MME" }; client.TryModelHint(models); // 尝试根据提示设置模型 ``` ## 与 JavaScript 版本的对比 ### JavaScript 版本 (client.js) ```javascript setModel: function (model, force) { if (model instanceof Array) { if (this.tryModelHint(model)) return true; model = model[0]; } if (model === this.config.model && !force) return true; this.config.model = model; switch (model) { case 'ENB': this.txDir = DIR_DL; this.rxDir = DIR_UL; this.ranIds = []; break; case 'UE': this.txDir = DIR_UL; this.rxDir = DIR_DL; break; default: break; } if (modelConfig[model]) { this._layerDir = modelConfig[model].layerDir; } else { this._layerDir = {}; } var mainTab = this.getComponent("mainTab"); if (mainTab) mainTab.setIconCls(this.getClientIcon()); lteLogs.gridColumnsUpdate(); return true; } ``` ### C# 版本 (LTEClient.cs) ```csharp public bool SetModel(string model, bool force = false) { if (model == Config.Model && !force) return true; Config.Model = model; switch (model?.ToUpper()) { case "ENB": TxDir = 2; // DIR_DL RxDir = 1; // DIR_UL RanIds.Clear(); break; case "UE": TxDir = 1; // DIR_UL RxDir = 2; // DIR_DL break; default: break; } if (ClientModelConfig.TryGetValue(model ?? "", out var config)) { _layerDir = config.LayerDir ?? new Dictionary>(); } else { _layerDir.Clear(); } _lteLogs.GridColumnsUpdate(); return true; } ``` ## 主要差异 1. **数组处理**: JavaScript 版本支持模型数组,C# 版本简化了这部分逻辑 2. **组件更新**: JavaScript 版本更新主标签图标,C# 版本只更新网格列 3. **错误处理**: C# 版本增加了更多的空值检查 4. **类型安全**: C# 版本提供了更好的类型安全性 ## 依赖关系 - `LogsManager`: 用于更新网格列 - `ClientConfig`: 存储模型配置 - `Regex`: 用于模型提示匹配 ## 注意事项 1. **模型名称**: 模型名称不区分大小写 2. **强制设置**: 使用 `force` 参数可以强制重新设置相同模型 3. **配置更新**: 设置模型后会自动更新相关配置 4. **网格更新**: 模型变更会触发网格列的更新