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
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. **网格更新**: 模型变更会触发网格列的更新
|