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.

325 lines
13 KiB

using CoreAgent.Domain.Interfaces.Network;
using CoreAgent.Domain.Interfaces.System.Command;
using CoreAgent.Domain.Models.Network;
using CoreAgent.Domain.Models.System;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace CoreAgent.Infrastructure.Handlers.API;
/// <summary>
/// RAN API 命令处理器实现
/// 负责处理各种RAN相关的API操作命令
/// </summary>
public class RanAPICommandHandler : RanAPICommandHandlerBase, IRanGainControlHandler
{
private readonly ILogger<RanAPICommandHandler> _logger;
private readonly ICellularNetworkContext _context;
public RanAPICommandHandler(
ILogger<RanAPICommandHandler> logger,
ISystemCommandExecutor commandExecutor,
IOptions<AppSettings> appSettings,
ICellularNetworkContext context)
: base(commandExecutor, appSettings.Value)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_context = context ?? throw new ArgumentNullException(nameof(context));
}
/// <summary>
/// 设置 BCCH 日志状态
/// </summary>
/// <param name="enableBcch">是否启用BCCH日志</param>
/// <returns>是否成功设置BCCH日志状态</returns>
public override async Task<bool> SetBcchLogStatusAsync(bool enableBcch)
{
var ranEndPoint = _context.NetworkIPEndPointManager.GetRanEndPoint();
if (!ValidateRanEndPoint(ranEndPoint))
{
_logger.LogWarning("RAN 端点未配置");
return false;
}
try
{
var configCommand = $@"{{""message"":""config_set"",""logs"":{{""bcch"":{enableBcch.ToString().ToLower()}}}}}";
var command = $"{BuildCommandPrefix(ranEndPoint)} '{configCommand}'";
_logger.LogInformation("开始设置BCCH日志状态,地址: {ComAddr}, 启用BCCH: {EnableBcch}", ranEndPoint.ComAddr, enableBcch);
var result = await ExecuteCommandAsync(command, "BCCH日志状态设置");
if (result.IsSuccess)
{
_logger.LogInformation("BCCH日志状态设置成功,地址: {ComAddr}, 启用BCCH: {EnableBcch}", ranEndPoint.ComAddr, enableBcch);
return true;
}
else
{
_logger.LogWarning("BCCH日志状态设置失败,地址: {ComAddr}, 启用BCCH: {EnableBcch}, 错误: {Error}",
ranEndPoint.ComAddr, enableBcch, result.Error);
return false;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "设置BCCH日志状态时发生异常,地址: {ComAddr}, 启用BCCH: {EnableBcch}", ranEndPoint.ComAddr, enableBcch);
return false;
}
}
#region 增益控制方法
/// <summary>
/// 设置发送增益
/// </summary>
/// <param name="gainSettings">增益设置字典,key为端口号(int),value为增益值(double)</param>
/// <returns>是否成功设置增益</returns>
public async Task<bool> SetTxGainAsync(Dictionary<int, double> gainSettings)
{
var ranEndPoint = _context.NetworkIPEndPointManager.GetRanEndPoint();
if (!ValidateRanEndPoint(ranEndPoint))
{
_logger.LogWarning("RAN 端点未配置");
return false;
}
if (gainSettings == null || gainSettings.Count == 0)
{
_logger.LogWarning("增益设置字典为空或无效");
return false;
}
try
{
var successCount = 0;
var totalCount = gainSettings.Count;
_logger.LogInformation("开始批量设置发送增益,地址: {ComAddr}, 端口数量: {PortCount}", ranEndPoint.ComAddr, totalCount);
foreach (var setting in gainSettings)
{
var port = setting.Key;
var setGain = setting.Value;
var configCommand = $@"{{""message"":""rf"",""tx_gain"":{setGain},""tx_channel_index"":{port}}}";
var command = $"{BuildCommandPrefix(ranEndPoint)} '{configCommand}'";
_logger.LogDebug("设置端口 {Port} 的发送增益值为 {SetGain}", port, setGain);
var result = await ExecuteCommandAsync(command, "发送增益设置");
if (result.IsSuccess)
{
successCount++;
_logger.LogDebug("端口 {Port} 发送增益设置成功,增益值: {SetGain}", port, setGain);
}
else
{
_logger.LogWarning("端口 {Port} 发送增益设置失败,增益值: {SetGain}, 错误: {Error}",
port, setGain, result.Error);
}
}
var allSuccess = successCount == totalCount;
if (allSuccess)
{
_logger.LogInformation("所有端口发送增益设置成功,地址: {ComAddr}, 成功数量: {SuccessCount}/{TotalCount}",
ranEndPoint.ComAddr, successCount, totalCount);
}
else
{
_logger.LogWarning("部分端口发送增益设置失败,地址: {ComAddr}, 成功数量: {SuccessCount}/{TotalCount}",
ranEndPoint.ComAddr, successCount, totalCount);
}
return allSuccess;
}
catch (Exception ex)
{
_logger.LogError(ex, "批量设置发送增益时发生异常,地址: {ComAddr}", ranEndPoint.ComAddr);
return false;
}
}
/// <summary>
/// 设置接收增益
/// </summary>
/// <param name="gainSettings">增益设置字典,key为端口号(int),value为增益值(double)</param>
/// <returns>是否成功设置增益</returns>
public async Task<bool> SetRxGainAsync(Dictionary<int, double> gainSettings)
{
var ranEndPoint = _context.NetworkIPEndPointManager.GetRanEndPoint();
if (!ValidateRanEndPoint(ranEndPoint))
{
_logger.LogWarning("RAN 端点未配置");
return false;
}
if (gainSettings == null || gainSettings.Count == 0)
{
_logger.LogWarning("增益设置字典为空或无效");
return false;
}
try
{
var successCount = 0;
var totalCount = gainSettings.Count;
_logger.LogInformation("开始批量设置接收增益,地址: {ComAddr}, 端口数量: {PortCount}", ranEndPoint.ComAddr, totalCount);
foreach (var setting in gainSettings)
{
var port = setting.Key;
var setGain = setting.Value;
var configCommand = $@"{{""message"":""rf"",""rx_gain"":{setGain},""rx_channel_index"":{port}}}";
var command = $"{BuildCommandPrefix(ranEndPoint)} '{configCommand}'";
_logger.LogDebug("设置端口 {Port} 的接收增益值为 {SetGain}", port, setGain);
var result = await ExecuteCommandAsync(command, "接收增益设置");
if (result.IsSuccess)
{
successCount++;
_logger.LogDebug("端口 {Port} 接收增益设置成功,增益值: {SetGain}", port, setGain);
}
else
{
_logger.LogWarning("端口 {Port} 接收增益设置失败,增益值: {SetGain}, 错误: {Error}",
port, setGain, result.Error);
}
}
var allSuccess = successCount == totalCount;
if (allSuccess)
{
_logger.LogInformation("所有端口接收增益设置成功,地址: {ComAddr}, 成功数量: {SuccessCount}/{TotalCount}",
ranEndPoint.ComAddr, successCount, totalCount);
}
else
{
_logger.LogWarning("部分端口接收增益设置失败,地址: {ComAddr}, 成功数量: {SuccessCount}/{TotalCount}",
ranEndPoint.ComAddr, successCount, totalCount);
}
return allSuccess;
}
catch (Exception ex)
{
_logger.LogError(ex, "批量设置接收增益时发生异常,地址: {ComAddr}", ranEndPoint.ComAddr);
return false;
}
}
/// <summary>
/// 设置所有端口的发送增益
/// </summary>
/// <param name="gainValues">所有端口的增益值数组,按端口顺序排列</param>
/// <returns>是否成功设置增益</returns>
public async Task<bool> SetAllTxGainAsync(double[] gainValues)
{
var ranEndPoint = _context.NetworkIPEndPointManager.GetRanEndPoint();
if (!ValidateRanEndPoint(ranEndPoint))
{
_logger.LogWarning("RAN 端点未配置");
return false;
}
if (gainValues == null || gainValues.Length == 0)
{
_logger.LogWarning("增益值数组为空或无效");
return false;
}
try
{
var gainArrayJson = $"[{string.Join(",", gainValues)}]";
var configCommand = $@"{{""message"":""rf"",""tx_gain"":{gainArrayJson}}}";
var command = $"{BuildCommandPrefix(ranEndPoint)} '{configCommand}'";
_logger.LogInformation("开始设置所有端口发送增益,地址: {ComAddr}, 端口数量: {PortCount}, 增益值: {GainValues}",
ranEndPoint.ComAddr, gainValues.Length, string.Join(",", gainValues));
var result = await ExecuteCommandAsync(command, "所有端口发送增益设置");
if (result.IsSuccess)
{
_logger.LogInformation("所有端口发送增益设置成功,地址: {ComAddr}, 端口数量: {PortCount}",
ranEndPoint.ComAddr, gainValues.Length);
return true;
}
else
{
_logger.LogWarning("所有端口发送增益设置失败,地址: {ComAddr}, 端口数量: {PortCount}, 错误: {Error}",
ranEndPoint.ComAddr, gainValues.Length, result.Error);
return false;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "设置所有端口发送增益时发生异常,地址: {ComAddr}, 端口数量: {PortCount}",
ranEndPoint.ComAddr, gainValues?.Length ?? 0);
return false;
}
}
/// <summary>
/// 设置所有端口的接收增益
/// </summary>
/// <param name="gainValues">所有端口的增益值数组,按端口顺序排列</param>
/// <returns>是否成功设置增益</returns>
public async Task<bool> SetAllRxGainAsync(double[] gainValues)
{
var ranEndPoint = _context.NetworkIPEndPointManager.GetRanEndPoint();
if (!ValidateRanEndPoint(ranEndPoint))
{
_logger.LogWarning("RAN 端点未配置");
return false;
}
if (gainValues == null || gainValues.Length == 0)
{
_logger.LogWarning("增益值数组为空或无效");
return false;
}
try
{
var gainArrayJson = $"[{string.Join(",", gainValues)}]";
var configCommand = $@"{{""message"":""rf"",""rx_gain"":{gainArrayJson}}}";
var command = $"{BuildCommandPrefix(ranEndPoint)} '{configCommand}'";
_logger.LogInformation("开始设置所有端口接收增益,地址: {ComAddr}, 端口数量: {PortCount}, 增益值: {GainValues}",
ranEndPoint.ComAddr, gainValues.Length, string.Join(",", gainValues));
var result = await ExecuteCommandAsync(command, "所有端口接收增益设置");
if (result.IsSuccess)
{
_logger.LogInformation("所有端口接收增益设置成功,地址: {ComAddr}, 端口数量: {PortCount}",
ranEndPoint.ComAddr, gainValues.Length);
return true;
}
else
{
_logger.LogWarning("所有端口接收增益设置失败,地址: {ComAddr}, 端口数量: {PortCount}, 错误: {Error}",
ranEndPoint.ComAddr, gainValues.Length, result.Error);
return false;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "设置所有端口接收增益时发生异常,地址: {ComAddr}, 端口数量: {PortCount}",
ranEndPoint.ComAddr, gainValues?.Length ?? 0);
return false;
}
}
#endregion
}