You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.6 KiB
5.6 KiB
LTEClient SetModel 方法实现说明
概述
本文档说明了在 LTEClient
类中实现的 SetModel
方法,该方法参考了 JavaScript 版本 client.js
中的 setModel
方法。
实现的功能
1. SetModel 方法
public bool SetModel(string model, bool force = false)
功能:
- 设置客户端的模型类型(如 ENB、UE、MME 等)
- 根据模型类型设置相应的传输方向
- 配置层方向映射
- 通知日志管理器更新网格列
参数:
model
: 模型名称(如 "ENB", "UE", "MME" 等)force
: 是否强制设置,即使模型相同也重新设置
返回值:
true
: 设置成功false
: 设置失败
2. TryModelHint 方法
public bool TryModelHint(List<string> models)
功能:
- 根据模型提示信息尝试设置合适的模型
- 使用正则表达式匹配模型提示
- 如果匹配成功,调用
SetModel
方法
3. SetModelHint 方法
public void SetModelHint(string hint)
功能:
- 设置模型提示信息
- 用于后续的模型自动识别
模型配置
支持的模型类型
private static readonly Dictionary<string, ClientModelConfig> 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" } }
};
模型配置属性
public class ClientModelConfig
{
public string? Icon { get; set; } // 图标
public string? ModelHint { get; set; } // 模型提示(正则表达式)
public string? Title { get; set; } // 标题
public Dictionary<string, Dictionary<string, int>>? LayerDir { get; set; } // 层方向配置
}
传输方向设置
根据不同的模型类型,自动设置传输方向:
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. 直接设置模型
var client = new LTEClient(config, logsManager);
client.SetModel("ENB"); // 设置为基站模型
2. 强制重新设置模型
client.SetModel("UE", force: true); // 强制设置为UE模型
3. 使用模型提示
client.SetModelHint("enb-001"); // 设置模型提示
var models = new List<string> { "ENB", "UE", "MME" };
client.TryModelHint(models); // 尝试根据提示设置模型
与 JavaScript 版本的对比
JavaScript 版本 (client.js)
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)
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<string, Dictionary<string, int>>();
}
else
{
_layerDir.Clear();
}
_lteLogs.GridColumnsUpdate();
return true;
}
主要差异
- 数组处理: JavaScript 版本支持模型数组,C# 版本简化了这部分逻辑
- 组件更新: JavaScript 版本更新主标签图标,C# 版本只更新网格列
- 错误处理: C# 版本增加了更多的空值检查
- 类型安全: C# 版本提供了更好的类型安全性
依赖关系
LogsManager
: 用于更新网格列ClientConfig
: 存储模型配置Regex
: 用于模型提示匹配
注意事项
- 模型名称: 模型名称不区分大小写
- 强制设置: 使用
force
参数可以强制重新设置相同模型 - 配置更新: 设置模型后会自动更新相关配置
- 网格更新: 模型变更会触发网格列的更新