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.

229 lines
5.6 KiB

1 month ago
# 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<string> models)
```
**功能:**
- 根据模型提示信息尝试设置合适的模型
- 使用正则表达式匹配模型提示
- 如果匹配成功,调用 `SetModel` 方法
### 3. SetModelHint 方法
```csharp
public void SetModelHint(string hint)
```
**功能:**
- 设置模型提示信息
- 用于后续的模型自动识别
## 模型配置
### 支持的模型类型
```csharp
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" } }
};
```
### 模型配置属性
```csharp
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; } // 层方向配置
}
```
## 传输方向设置
根据不同的模型类型,自动设置传输方向:
```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<string> { "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<string, Dictionary<string, int>>();
}
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. **网格更新**: 模型变更会触发网格列的更新