Browse Source
- 重构IRanGainControlHandler接口,移除RanIPEndPoint参数,统一从ICellularNetworkContext获取端点信息 - 修复SetTxGainCommand构造函数,添加参数验证 - 创建SetAllTxGainCommand和SetAllTxGainCommandHandler,支持批量设置发送增益 - 创建RanAPIController,提供统一的RAN API访问接口 - 优化依赖注入配置,统一使用工厂模式feature/protocol-log-Perfect
17 changed files with 1611 additions and 639 deletions
@ -0,0 +1,89 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using CoreAgent.Application.Commands.RanAPI; |
|||
using CoreAgent.Domain.Models.Common; |
|||
using MediatR; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Microsoft.Extensions.Logging; |
|||
|
|||
namespace CoreAgent.API.Controllers; |
|||
|
|||
/// <summary>
|
|||
/// RAN API 控制器
|
|||
/// 负责处理RAN相关的API操作
|
|||
/// </summary>
|
|||
[ApiController] |
|||
[Route("api/[controller]")]
|
|||
public class RanAPIController : BaseApiController |
|||
{ |
|||
private readonly IMediator _mediator; |
|||
private readonly ILogger<RanAPIController> _logger; |
|||
|
|||
/// <summary>
|
|||
/// 构造函数
|
|||
/// </summary>
|
|||
/// <param name="mediator">MediatR中介者</param>
|
|||
/// <param name="logger">日志记录器</param>
|
|||
public RanAPIController(IMediator mediator, ILogger<RanAPIController> logger) |
|||
{ |
|||
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); |
|||
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 设置发送增益
|
|||
/// </summary>
|
|||
/// <param name="gainSettings">增益设置字典,key为端口号(int),value为增益值(double)</param>
|
|||
/// <returns>设置结果</returns>
|
|||
[HttpPost("set-tx-gain")] |
|||
public async Task<ApiActionResult<bool>> SetTxGain([FromBody] Dictionary<int, double> gainSettings) |
|||
{ |
|||
try |
|||
{ |
|||
_logger.LogInformation("收到设置发送增益请求,端口数量: {PortCount}", gainSettings?.Count); |
|||
|
|||
var command = new SetTxGainCommand(gainSettings); |
|||
var result = await _mediator.Send(command); |
|||
|
|||
_logger.LogInformation("设置发送增益请求处理完成"); |
|||
return result; |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "处理设置发送增益请求时发生异常"); |
|||
return ApiActionResult<bool>.Error( |
|||
$"处理请求失败: {ex.Message}", |
|||
"INTERNAL_ERROR", |
|||
System.Net.HttpStatusCode.InternalServerError); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 设置所有端口发送增益
|
|||
/// </summary>
|
|||
/// <param name="gainValues">所有端口的增益值数组,按端口顺序排列</param>
|
|||
/// <returns>设置结果</returns>
|
|||
[HttpPost("set-all-tx-gain")] |
|||
public async Task<ApiActionResult<bool>> SetAllTxGain([FromBody] double[] gainValues) |
|||
{ |
|||
try |
|||
{ |
|||
_logger.LogInformation("收到设置所有端口发送增益请求,端口数量: {PortCount}", gainValues?.Length); |
|||
|
|||
var command = new SetAllTxGainCommand(gainValues); |
|||
var result = await _mediator.Send(command); |
|||
|
|||
_logger.LogInformation("设置所有端口发送增益请求处理完成"); |
|||
return result; |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "处理设置所有端口发送增益请求时发生异常"); |
|||
return ApiActionResult<bool>.Error( |
|||
$"处理请求失败: {ex.Message}", |
|||
"INTERNAL_ERROR", |
|||
System.Net.HttpStatusCode.InternalServerError); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
using System; |
|||
using CoreAgent.Domain.Models.Common; |
|||
using MediatR; |
|||
|
|||
namespace CoreAgent.Application.Commands.RanAPI; |
|||
|
|||
/// <summary>
|
|||
/// 设置所有端口发送增益命令
|
|||
/// </summary>
|
|||
public class SetAllTxGainCommand : IRequest<ApiActionResult<bool>> |
|||
{ |
|||
/// <summary>
|
|||
/// 所有端口的增益值数组,按端口顺序排列
|
|||
/// </summary>
|
|||
public double[] GainValues { get; } |
|||
|
|||
/// <summary>
|
|||
/// 构造函数
|
|||
/// </summary>
|
|||
/// <param name="gainValues">所有端口的增益值数组</param>
|
|||
public SetAllTxGainCommand(double[] gainValues) |
|||
{ |
|||
GainValues = gainValues ?? throw new ArgumentNullException(nameof(gainValues)); |
|||
} |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
using System; |
|||
using CoreAgent.Domain.Models.Common; |
|||
using MediatR; |
|||
|
|||
namespace CoreAgent.Application.Commands.RanAPI; |
|||
|
|||
/// <summary>
|
|||
/// 设置发送增益命令
|
|||
/// </summary>
|
|||
public class SetTxGainCommand : IRequest<ApiActionResult<bool>> |
|||
{ |
|||
/// <summary>
|
|||
/// 增益设置字典,key为端口号(int),value为增益值(double)
|
|||
/// </summary>
|
|||
public Dictionary<int, double> GainSettings { get; } |
|||
|
|||
/// <summary>
|
|||
/// 构造函数
|
|||
/// </summary>
|
|||
/// <param name="gainSettings">增益设置字典</param>
|
|||
public SetTxGainCommand(Dictionary<int, double> gainSettings) |
|||
{ |
|||
GainSettings = gainSettings ?? throw new ArgumentNullException(nameof(gainSettings)); |
|||
} |
|||
} |
|||
@ -0,0 +1,73 @@ |
|||
using System; |
|||
using System.Net; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using CoreAgent.Application.Commands.RanAPI; |
|||
using CoreAgent.Domain.Interfaces.Network; |
|||
using CoreAgent.Domain.Models.Common; |
|||
using MediatR; |
|||
using Microsoft.Extensions.Logging; |
|||
|
|||
namespace CoreAgent.Application.Handlers.RanAPI; |
|||
|
|||
/// <summary>
|
|||
/// 设置所有端口发送增益命令处理器
|
|||
/// </summary>
|
|||
public class SetAllTxGainCommandHandler : IRequestHandler<SetAllTxGainCommand, ApiActionResult<bool>> |
|||
{ |
|||
private readonly IRanAPICommandHandlerFactory _ranAPICommandHandlerFactory; |
|||
private readonly ILogger<SetAllTxGainCommandHandler> _logger; |
|||
|
|||
/// <summary>
|
|||
/// 构造函数
|
|||
/// </summary>
|
|||
/// <param name="ranAPICommandHandlerFactory">RAN API命令处理器工厂</param>
|
|||
/// <param name="logger">日志记录器</param>
|
|||
public SetAllTxGainCommandHandler( |
|||
IRanAPICommandHandlerFactory ranAPICommandHandlerFactory, |
|||
ILogger<SetAllTxGainCommandHandler> logger) |
|||
{ |
|||
_ranAPICommandHandlerFactory = ranAPICommandHandlerFactory ?? throw new ArgumentNullException(nameof(ranAPICommandHandlerFactory)); |
|||
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 处理设置所有端口发送增益命令
|
|||
/// </summary>
|
|||
/// <param name="request">设置所有端口发送增益命令</param>
|
|||
/// <param name="cancellationToken">取消令牌</param>
|
|||
/// <returns>设置所有端口发送增益结果</returns>
|
|||
public async Task<ApiActionResult<bool>> Handle(SetAllTxGainCommand request, CancellationToken cancellationToken) |
|||
{ |
|||
try |
|||
{ |
|||
_logger.LogInformation("正在设置所有端口发送增益,端口数量: {PortCount}", request.GainValues?.Length); |
|||
|
|||
// 通过工厂获取RAN增益控制处理器并执行操作
|
|||
var ranGainControlHandler = _ranAPICommandHandlerFactory.CreateGainControlHandler(); |
|||
var result = await ranGainControlHandler.SetAllTxGainAsync(request.GainValues); |
|||
|
|||
if (result) |
|||
{ |
|||
_logger.LogInformation("所有端口发送增益设置成功"); |
|||
return ApiActionResult<bool>.Ok(true, "所有端口发送增益设置成功"); |
|||
} |
|||
else |
|||
{ |
|||
_logger.LogWarning("所有端口发送增益设置失败"); |
|||
return ApiActionResult<bool>.Error( |
|||
"所有端口发送增益设置失败", |
|||
"ALL_TX_GAIN_SET_FAILED", |
|||
HttpStatusCode.BadRequest); |
|||
} |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "设置所有端口发送增益失败"); |
|||
return ApiActionResult<bool>.Error( |
|||
$"设置所有端口发送增益失败: {ex.Message}", |
|||
"INTERNAL_ERROR", |
|||
HttpStatusCode.InternalServerError); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,73 @@ |
|||
using System; |
|||
using System.Net; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using CoreAgent.Application.Commands.RanAPI; |
|||
using CoreAgent.Domain.Interfaces.Network; |
|||
using CoreAgent.Domain.Models.Common; |
|||
using MediatR; |
|||
using Microsoft.Extensions.Logging; |
|||
|
|||
namespace CoreAgent.Application.Handlers.RanAPI; |
|||
|
|||
/// <summary>
|
|||
/// 设置发送增益命令处理器
|
|||
/// </summary>
|
|||
public class SetTxGainCommandHandler : IRequestHandler<SetTxGainCommand, ApiActionResult<bool>> |
|||
{ |
|||
private readonly IRanAPICommandHandlerFactory _ranAPICommandHandlerFactory; |
|||
private readonly ILogger<SetTxGainCommandHandler> _logger; |
|||
|
|||
/// <summary>
|
|||
/// 构造函数
|
|||
/// </summary>
|
|||
/// <param name="ranAPICommandHandlerFactory">RAN API命令处理器工厂</param>
|
|||
/// <param name="logger">日志记录器</param>
|
|||
public SetTxGainCommandHandler( |
|||
IRanAPICommandHandlerFactory ranAPICommandHandlerFactory, |
|||
ILogger<SetTxGainCommandHandler> logger) |
|||
{ |
|||
_ranAPICommandHandlerFactory = ranAPICommandHandlerFactory ?? throw new ArgumentNullException(nameof(ranAPICommandHandlerFactory)); |
|||
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 处理设置发送增益命令
|
|||
/// </summary>
|
|||
/// <param name="request">设置发送增益命令</param>
|
|||
/// <param name="cancellationToken">取消令牌</param>
|
|||
/// <returns>设置发送增益结果</returns>
|
|||
public async Task<ApiActionResult<bool>> Handle(SetTxGainCommand request, CancellationToken cancellationToken) |
|||
{ |
|||
try |
|||
{ |
|||
_logger.LogInformation("正在设置发送增益,端口数量: {PortCount}", request.GainSettings?.Count); |
|||
|
|||
// 通过工厂获取RAN增益控制处理器并执行操作
|
|||
var ranGainControlHandler = _ranAPICommandHandlerFactory.CreateGainControlHandler(); |
|||
var result = await ranGainControlHandler.SetTxGainAsync(request.GainSettings); |
|||
|
|||
if (result) |
|||
{ |
|||
_logger.LogInformation("发送增益设置成功"); |
|||
return ApiActionResult<bool>.Ok(true, "发送增益设置成功"); |
|||
} |
|||
else |
|||
{ |
|||
_logger.LogWarning("发送增益设置失败"); |
|||
return ApiActionResult<bool>.Error( |
|||
"发送增益设置失败", |
|||
"TX_GAIN_SET_FAILED", |
|||
HttpStatusCode.BadRequest); |
|||
} |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "设置发送增益失败"); |
|||
return ApiActionResult<bool>.Error( |
|||
$"设置发送增益失败: {ex.Message}", |
|||
"INTERNAL_ERROR", |
|||
HttpStatusCode.InternalServerError); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,39 @@ |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
|
|||
namespace CoreAgent.Domain.Interfaces.Common; |
|||
|
|||
/// <summary>
|
|||
/// 服务作用域管理器接口
|
|||
/// 用于在单例服务中创建瞬时服务
|
|||
/// </summary>
|
|||
public interface IServiceScopeManager |
|||
{ |
|||
/// <summary>
|
|||
/// 在作用域中执行操作
|
|||
/// </summary>
|
|||
/// <typeparam name="T">返回类型</typeparam>
|
|||
/// <param name="operation">要执行的操作</param>
|
|||
/// <returns>操作结果</returns>
|
|||
Task<T> ExecuteInScopeAsync<T>(Func<IServiceProvider, Task<T>> operation); |
|||
|
|||
/// <summary>
|
|||
/// 在作用域中执行操作(无返回值)
|
|||
/// </summary>
|
|||
/// <param name="operation">要执行的操作</param>
|
|||
/// <returns>任务</returns>
|
|||
Task ExecuteInScopeAsync(Func<IServiceProvider, Task> operation); |
|||
|
|||
/// <summary>
|
|||
/// 在作用域中执行操作(同步)
|
|||
/// </summary>
|
|||
/// <typeparam name="T">返回类型</typeparam>
|
|||
/// <param name="operation">要执行的操作</param>
|
|||
/// <returns>操作结果</returns>
|
|||
T ExecuteInScope<T>(Func<IServiceProvider, T> operation); |
|||
|
|||
/// <summary>
|
|||
/// 在作用域中执行操作(同步,无返回值)
|
|||
/// </summary>
|
|||
/// <param name="operation">要执行的操作</param>
|
|||
void ExecuteInScope(Action<IServiceProvider> operation); |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
using CoreAgent.Domain.Models.Network; |
|||
|
|||
namespace CoreAgent.Domain.Interfaces.Network; |
|||
|
|||
/// <summary>
|
|||
/// RAN API 命令处理器工厂接口
|
|||
/// 负责创建和管理RAN API命令处理器实例
|
|||
/// </summary>
|
|||
public interface IRanAPICommandHandlerFactory |
|||
{ |
|||
/// <summary>
|
|||
/// 创建RAN API命令处理器
|
|||
/// </summary>
|
|||
/// <returns>RAN API命令处理器实例</returns>
|
|||
IRanAPICommandHandler CreateHandler(); |
|||
|
|||
/// <summary>
|
|||
/// 创建RAN增益控制处理器
|
|||
/// </summary>
|
|||
/// <returns>RAN增益控制处理器实例</returns>
|
|||
IRanGainControlHandler CreateGainControlHandler(); |
|||
} |
|||
@ -1,42 +0,0 @@ |
|||
using CoreAgent.Domain.Models.Network; |
|||
|
|||
namespace CoreAgent.Domain.Interfaces.Network; |
|||
|
|||
/// <summary>
|
|||
/// RAN API 功率控制接口
|
|||
/// 负责处理发送和接收功率相关的操作
|
|||
/// </summary>
|
|||
public interface IRanPowerControlHandler |
|||
{ |
|||
/// <summary>
|
|||
/// 设置发送功率
|
|||
/// </summary>
|
|||
/// <param name="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="powerSettings">功率设置字典,key为端口号(int),value为功率值(double)</param>
|
|||
/// <returns>是否成功设置功率</returns>
|
|||
Task<bool> SetTxPowerAsync(RanIPEndPoint ranEndPoint, Dictionary<int, double> powerSettings); |
|||
|
|||
/// <summary>
|
|||
/// 设置接收功率
|
|||
/// </summary>
|
|||
/// <param name="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="powerSettings">功率设置字典,key为端口号(int),value为功率值(double)</param>
|
|||
/// <returns>是否成功设置功率</returns>
|
|||
Task<bool> SetRxPowerAsync(RanIPEndPoint ranEndPoint, Dictionary<int, double> powerSettings); |
|||
|
|||
/// <summary>
|
|||
/// 设置所有端口的发送功率
|
|||
/// </summary>
|
|||
/// <param name="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="powerValues">所有端口的功率值数组,按端口顺序排列</param>
|
|||
/// <returns>是否成功设置功率</returns>
|
|||
Task<bool> SetAllTxPowerAsync(RanIPEndPoint ranEndPoint, double[] powerValues); |
|||
|
|||
/// <summary>
|
|||
/// 设置所有端口的接收功率
|
|||
/// </summary>
|
|||
/// <param name="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="powerValues">所有端口的功率值数组,按端口顺序排列</param>
|
|||
/// <returns>是否成功设置功率</returns>
|
|||
Task<bool> SetAllRxPowerAsync(RanIPEndPoint ranEndPoint, double[] powerValues); |
|||
} |
|||
@ -0,0 +1,325 @@ |
|||
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
|
|||
} |
|||
@ -0,0 +1,49 @@ |
|||
using CoreAgent.Domain.Interfaces.Network; |
|||
using CoreAgent.Domain.Interfaces.System.Command; |
|||
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 RanAPICommandHandlerFactory : IRanAPICommandHandlerFactory |
|||
{ |
|||
private readonly ILogger<RanAPICommandHandler> _logger; |
|||
private readonly ISystemCommandExecutor _commandExecutor; |
|||
private readonly IOptions<AppSettings> _appSettings; |
|||
private readonly ICellularNetworkContext _context; |
|||
|
|||
public RanAPICommandHandlerFactory( |
|||
ILogger<RanAPICommandHandler> logger, |
|||
ISystemCommandExecutor commandExecutor, |
|||
IOptions<AppSettings> appSettings, |
|||
ICellularNetworkContext context) |
|||
{ |
|||
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
|||
_commandExecutor = commandExecutor ?? throw new ArgumentNullException(nameof(commandExecutor)); |
|||
_appSettings = appSettings ?? throw new ArgumentNullException(nameof(appSettings)); |
|||
_context = context ?? throw new ArgumentNullException(nameof(context)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 创建RAN API命令处理器
|
|||
/// </summary>
|
|||
/// <returns>RAN API命令处理器实例</returns>
|
|||
public IRanAPICommandHandler CreateHandler() |
|||
{ |
|||
return new RanAPICommandHandler(_logger, _commandExecutor, _appSettings, _context); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 创建RAN增益控制处理器
|
|||
/// </summary>
|
|||
/// <returns>RAN增益控制处理器实例</returns>
|
|||
public IRanGainControlHandler CreateGainControlHandler() |
|||
{ |
|||
return new RanAPICommandHandler(_logger, _commandExecutor, _appSettings, _context); |
|||
} |
|||
} |
|||
@ -0,0 +1,130 @@ |
|||
using CoreAgent.Domain.Interfaces.Common; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Logging; |
|||
|
|||
namespace CoreAgent.Infrastructure.Services.Common; |
|||
|
|||
/// <summary>
|
|||
/// 服务作用域管理器实现
|
|||
/// 用于在单例服务中创建瞬时服务
|
|||
/// </summary>
|
|||
public class ServiceScopeManager : IServiceScopeManager |
|||
{ |
|||
private readonly IServiceScopeFactory _scopeFactory; |
|||
private readonly ILogger<ServiceScopeManager> _logger; |
|||
|
|||
public ServiceScopeManager( |
|||
IServiceScopeFactory scopeFactory, |
|||
ILogger<ServiceScopeManager> logger) |
|||
{ |
|||
_scopeFactory = scopeFactory ?? throw new ArgumentNullException(nameof(scopeFactory)); |
|||
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 在作用域中执行异步操作
|
|||
/// </summary>
|
|||
/// <typeparam name="T">返回类型</typeparam>
|
|||
/// <param name="operation">要执行的操作</param>
|
|||
/// <returns>操作结果</returns>
|
|||
public async Task<T> ExecuteInScopeAsync<T>(Func<IServiceProvider, Task<T>> operation) |
|||
{ |
|||
if (operation == null) |
|||
throw new ArgumentNullException(nameof(operation)); |
|||
|
|||
using var scope = _scopeFactory.CreateScope(); |
|||
var serviceProvider = scope.ServiceProvider; |
|||
|
|||
try |
|||
{ |
|||
_logger.LogDebug("开始在执行作用域中执行异步操作"); |
|||
var result = await operation(serviceProvider); |
|||
_logger.LogDebug("在执行作用域中执行异步操作完成"); |
|||
return result; |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "在执行作用域中执行异步操作时发生异常"); |
|||
throw; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 在作用域中执行异步操作(无返回值)
|
|||
/// </summary>
|
|||
/// <param name="operation">要执行的操作</param>
|
|||
/// <returns>任务</returns>
|
|||
public async Task ExecuteInScopeAsync(Func<IServiceProvider, Task> operation) |
|||
{ |
|||
if (operation == null) |
|||
throw new ArgumentNullException(nameof(operation)); |
|||
|
|||
using var scope = _scopeFactory.CreateScope(); |
|||
var serviceProvider = scope.ServiceProvider; |
|||
|
|||
try |
|||
{ |
|||
_logger.LogDebug("开始在执行作用域中执行异步操作"); |
|||
await operation(serviceProvider); |
|||
_logger.LogDebug("在执行作用域中执行异步操作完成"); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "在执行作用域中执行异步操作时发生异常"); |
|||
throw; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 在作用域中执行同步操作
|
|||
/// </summary>
|
|||
/// <typeparam name="T">返回类型</typeparam>
|
|||
/// <param name="operation">要执行的操作</param>
|
|||
/// <returns>操作结果</returns>
|
|||
public T ExecuteInScope<T>(Func<IServiceProvider, T> operation) |
|||
{ |
|||
if (operation == null) |
|||
throw new ArgumentNullException(nameof(operation)); |
|||
|
|||
using var scope = _scopeFactory.CreateScope(); |
|||
var serviceProvider = scope.ServiceProvider; |
|||
|
|||
try |
|||
{ |
|||
_logger.LogDebug("开始在执行作用域中执行同步操作"); |
|||
var result = operation(serviceProvider); |
|||
_logger.LogDebug("在执行作用域中执行同步操作完成"); |
|||
return result; |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "在执行作用域中执行同步操作时发生异常"); |
|||
throw; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 在作用域中执行同步操作(无返回值)
|
|||
/// </summary>
|
|||
/// <param name="operation">要执行的操作</param>
|
|||
public void ExecuteInScope(Action<IServiceProvider> operation) |
|||
{ |
|||
if (operation == null) |
|||
throw new ArgumentNullException(nameof(operation)); |
|||
|
|||
using var scope = _scopeFactory.CreateScope(); |
|||
var serviceProvider = scope.ServiceProvider; |
|||
|
|||
try |
|||
{ |
|||
_logger.LogDebug("开始在执行作用域中执行同步操作"); |
|||
operation(serviceProvider); |
|||
_logger.LogDebug("在执行作用域中执行同步操作完成"); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "在执行作用域中执行同步操作时发生异常"); |
|||
throw; |
|||
} |
|||
} |
|||
} |
|||
@ -1,564 +0,0 @@ |
|||
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.Services.Network; |
|||
|
|||
/// <summary>
|
|||
/// RAN API 命令处理器实现
|
|||
/// 负责处理各种RAN相关的API操作命令
|
|||
/// </summary>
|
|||
public class RanAPICommandHandler : RanAPICommandHandlerBase, IRanPowerControlHandler, IRanGainControlHandler |
|||
{ |
|||
private readonly ILogger<RanAPICommandHandler> _logger; |
|||
|
|||
public RanAPICommandHandler( |
|||
ILogger<RanAPICommandHandler> logger, |
|||
ISystemCommandExecutor commandExecutor, |
|||
IOptions<AppSettings> appSettings) |
|||
: base(commandExecutor, appSettings.Value) |
|||
{ |
|||
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 设置 RAN 日志配置
|
|||
/// </summary>
|
|||
/// <param name="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="enableBcch">是否启用BCCH日志</param>
|
|||
/// <returns>是否成功设置配置</returns>
|
|||
public override async Task<bool> SetRanLogsConfigAsync(RanIPEndPoint ranEndPoint, bool enableBcch) |
|||
{ |
|||
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("开始设置RAN日志配置,地址: {ComAddr}, 启用BCCH: {EnableBcch}", ranEndPoint.ComAddr, enableBcch); |
|||
|
|||
var result = await ExecuteCommandAsync(command, "RAN日志配置设置"); |
|||
|
|||
if (result.IsSuccess) |
|||
{ |
|||
_logger.LogInformation("RAN日志配置设置成功,地址: {ComAddr}, 启用BCCH: {EnableBcch}", ranEndPoint.ComAddr, enableBcch); |
|||
return true; |
|||
} |
|||
else |
|||
{ |
|||
_logger.LogWarning("RAN日志配置设置失败,地址: {ComAddr}, 启用BCCH: {EnableBcch}, 错误: {Error}", |
|||
ranEndPoint.ComAddr, enableBcch, result.Error); |
|||
return false; |
|||
} |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "设置RAN日志配置时发生异常,地址: {ComAddr}, 启用BCCH: {EnableBcch}", ranEndPoint.ComAddr, enableBcch); |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
#region 功率控制方法
|
|||
|
|||
/// <summary>
|
|||
/// 设置发送功率
|
|||
/// </summary>
|
|||
/// <param name="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="powerSettings">功率设置字典,key为端口号(int),value为功率值(double)</param>
|
|||
/// <returns>是否成功设置功率</returns>
|
|||
public async Task<bool> SetTxPowerAsync(RanIPEndPoint ranEndPoint, Dictionary<int, double> powerSettings) |
|||
{ |
|||
if (!ValidateRanEndPoint(ranEndPoint)) |
|||
{ |
|||
_logger.LogWarning("RAN 端点未配置"); |
|||
return false; |
|||
} |
|||
|
|||
if (powerSettings == null || powerSettings.Count == 0) |
|||
{ |
|||
_logger.LogWarning("功率设置字典为空或无效"); |
|||
return false; |
|||
} |
|||
|
|||
try |
|||
{ |
|||
var successCount = 0; |
|||
var totalCount = powerSettings.Count; |
|||
|
|||
_logger.LogInformation("开始批量设置发送功率,地址: {ComAddr}, 端口数量: {PortCount}", ranEndPoint.ComAddr, totalCount); |
|||
|
|||
foreach (var setting in powerSettings) |
|||
{ |
|||
var port = setting.Key; |
|||
var setPower = setting.Value; |
|||
|
|||
var cmd_setPower = $"{BuildCommandPrefix(ranEndPoint)} '{{""message"":""rf"",""tx_power"":{setPower},""tx_channel_index"":{port}}}'"; |
|||
|
|||
_logger.LogDebug("设置端口 {Port} 的发送功率值为 {SetPower}", port, setPower); |
|||
|
|||
var result = await ExecuteCommandAsync(cmd_setPower, "发送功率设置"); |
|||
|
|||
if (result.IsSuccess) |
|||
{ |
|||
successCount++; |
|||
_logger.LogDebug("端口 {Port} 发送功率设置成功,功率值: {SetPower}", port, setPower); |
|||
} |
|||
else |
|||
{ |
|||
_logger.LogWarning("端口 {Port} 发送功率设置失败,功率值: {SetPower}, 错误: {Error}", |
|||
port, setPower, 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="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="powerSettings">功率设置字典,key为端口号(int),value为功率值(double)</param>
|
|||
/// <returns>是否成功设置功率</returns>
|
|||
public async Task<bool> SetRxPowerAsync(RanIPEndPoint ranEndPoint, Dictionary<int, double> powerSettings) |
|||
{ |
|||
if (!ValidateRanEndPoint(ranEndPoint)) |
|||
{ |
|||
_logger.LogWarning("RAN 端点未配置"); |
|||
return false; |
|||
} |
|||
|
|||
if (powerSettings == null || powerSettings.Count == 0) |
|||
{ |
|||
_logger.LogWarning("功率设置字典为空或无效"); |
|||
return false; |
|||
} |
|||
|
|||
try |
|||
{ |
|||
var successCount = 0; |
|||
var totalCount = powerSettings.Count; |
|||
|
|||
_logger.LogInformation("开始批量设置接收功率,地址: {ComAddr}, 端口数量: {PortCount}", ranEndPoint.ComAddr, totalCount); |
|||
|
|||
foreach (var setting in powerSettings) |
|||
{ |
|||
var port = setting.Key; |
|||
var setPower = setting.Value; |
|||
|
|||
var cmd_setPower = $"{BuildCommandPrefix(ranEndPoint)} '{{""message"":""rf"",""rx_power"":{setPower},""rx_channel_index"":{port}}}'"; |
|||
|
|||
_logger.LogDebug("设置端口 {Port} 的接收功率值为 {SetPower}", port, setPower); |
|||
|
|||
var result = await ExecuteCommandAsync(cmd_setPower, "接收功率设置"); |
|||
|
|||
if (result.IsSuccess) |
|||
{ |
|||
successCount++; |
|||
_logger.LogDebug("端口 {Port} 接收功率设置成功,功率值: {SetPower}", port, setPower); |
|||
} |
|||
else |
|||
{ |
|||
_logger.LogWarning("端口 {Port} 接收功率设置失败,功率值: {SetPower}, 错误: {Error}", |
|||
port, setPower, 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="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="powerValues">所有端口的功率值数组,按端口顺序排列</param>
|
|||
/// <returns>是否成功设置功率</returns>
|
|||
public async Task<bool> SetAllTxPowerAsync(RanIPEndPoint ranEndPoint, double[] powerValues) |
|||
{ |
|||
if (!ValidateRanEndPoint(ranEndPoint)) |
|||
{ |
|||
_logger.LogWarning("RAN 端点未配置"); |
|||
return false; |
|||
} |
|||
|
|||
if (powerValues == null || powerValues.Length == 0) |
|||
{ |
|||
_logger.LogWarning("功率值数组为空或无效"); |
|||
return false; |
|||
} |
|||
|
|||
try |
|||
{ |
|||
var powerArrayJson = $"[{string.Join(",", powerValues)}]"; |
|||
var cmd_setAllPower = $"{BuildCommandPrefix(ranEndPoint)} '{{""message"":""rf"",""tx_power"":{powerArrayJson}}}'"; |
|||
|
|||
_logger.LogInformation("开始设置所有端口发送功率,地址: {ComAddr}, 端口数量: {PortCount}, 功率值: {PowerValues}", |
|||
ranEndPoint.ComAddr, powerValues.Length, string.Join(",", powerValues)); |
|||
|
|||
var result = await ExecuteCommandAsync(cmd_setAllPower, "所有端口发送功率设置"); |
|||
|
|||
if (result.IsSuccess) |
|||
{ |
|||
_logger.LogInformation("所有端口发送功率设置成功,地址: {ComAddr}, 端口数量: {PortCount}", |
|||
ranEndPoint.ComAddr, powerValues.Length); |
|||
return true; |
|||
} |
|||
else |
|||
{ |
|||
_logger.LogWarning("所有端口发送功率设置失败,地址: {ComAddr}, 端口数量: {PortCount}, 错误: {Error}", |
|||
ranEndPoint.ComAddr, powerValues.Length, result.Error); |
|||
return false; |
|||
} |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "设置所有端口发送功率时发生异常,地址: {ComAddr}, 端口数量: {PortCount}", |
|||
ranEndPoint.ComAddr, powerValues?.Length ?? 0); |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 设置所有端口的接收功率
|
|||
/// </summary>
|
|||
/// <param name="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="powerValues">所有端口的功率值数组,按端口顺序排列</param>
|
|||
/// <returns>是否成功设置功率</returns>
|
|||
public async Task<bool> SetAllRxPowerAsync(RanIPEndPoint ranEndPoint, double[] powerValues) |
|||
{ |
|||
if (!ValidateRanEndPoint(ranEndPoint)) |
|||
{ |
|||
_logger.LogWarning("RAN 端点未配置"); |
|||
return false; |
|||
} |
|||
|
|||
if (powerValues == null || powerValues.Length == 0) |
|||
{ |
|||
_logger.LogWarning("功率值数组为空或无效"); |
|||
return false; |
|||
} |
|||
|
|||
try |
|||
{ |
|||
var powerArrayJson = $"[{string.Join(",", powerValues)}]"; |
|||
var cmd_setAllPower = $"{BuildCommandPrefix(ranEndPoint)} '{{""message"":""rf"",""rx_power"":{powerArrayJson}}}'"; |
|||
|
|||
_logger.LogInformation("开始设置所有端口接收功率,地址: {ComAddr}, 端口数量: {PortCount}, 功率值: {PowerValues}", |
|||
ranEndPoint.ComAddr, powerValues.Length, string.Join(",", powerValues)); |
|||
|
|||
var result = await ExecuteCommandAsync(cmd_setAllPower, "所有端口接收功率设置"); |
|||
|
|||
if (result.IsSuccess) |
|||
{ |
|||
_logger.LogInformation("所有端口接收功率设置成功,地址: {ComAddr}, 端口数量: {PortCount}", |
|||
ranEndPoint.ComAddr, powerValues.Length); |
|||
return true; |
|||
} |
|||
else |
|||
{ |
|||
_logger.LogWarning("所有端口接收功率设置失败,地址: {ComAddr}, 端口数量: {PortCount}, 错误: {Error}", |
|||
ranEndPoint.ComAddr, powerValues.Length, result.Error); |
|||
return false; |
|||
} |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_logger.LogError(ex, "设置所有端口接收功率时发生异常,地址: {ComAddr}, 端口数量: {PortCount}", |
|||
ranEndPoint.ComAddr, powerValues?.Length ?? 0); |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
#endregion
|
|||
|
|||
#region 增益控制方法
|
|||
|
|||
/// <summary>
|
|||
/// 设置发送增益
|
|||
/// </summary>
|
|||
/// <param name="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="gainSettings">增益设置字典,key为端口号(int),value为增益值(double)</param>
|
|||
/// <returns>是否成功设置增益</returns>
|
|||
public async Task<bool> SetTxGainAsync(RanIPEndPoint ranEndPoint, Dictionary<int, double> gainSettings) |
|||
{ |
|||
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 cmd_setGain = $"{BuildCommandPrefix(ranEndPoint)} '{{""message"":""rf"",""tx_gain"":{setGain},""tx_channel_index"":{port}}}'"; |
|||
|
|||
_logger.LogDebug("设置端口 {Port} 的发送增益值为 {SetGain}", port, setGain); |
|||
|
|||
var result = await ExecuteCommandAsync(cmd_setGain, "发送增益设置"); |
|||
|
|||
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="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="gainSettings">增益设置字典,key为端口号(int),value为增益值(double)</param>
|
|||
/// <returns>是否成功设置增益</returns>
|
|||
public async Task<bool> SetRxGainAsync(RanIPEndPoint ranEndPoint, Dictionary<int, double> gainSettings) |
|||
{ |
|||
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 cmd_setGain = $"{BuildCommandPrefix(ranEndPoint)} '{{""message"":""rf"",""rx_gain"":{setGain},""rx_channel_index"":{port}}}'"; |
|||
|
|||
_logger.LogDebug("设置端口 {Port} 的接收增益值为 {SetGain}", port, setGain); |
|||
|
|||
var result = await ExecuteCommandAsync(cmd_setGain, "接收增益设置"); |
|||
|
|||
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="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="gainValues">所有端口的增益值数组,按端口顺序排列</param>
|
|||
/// <returns>是否成功设置增益</returns>
|
|||
public async Task<bool> SetAllTxGainAsync(RanIPEndPoint ranEndPoint, double[] gainValues) |
|||
{ |
|||
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 cmd_setAllGain = $"{BuildCommandPrefix(ranEndPoint)} '{{""message"":""rf"",""tx_gain"":{gainArrayJson}}}'"; |
|||
|
|||
_logger.LogInformation("开始设置所有端口发送增益,地址: {ComAddr}, 端口数量: {PortCount}, 增益值: {GainValues}", |
|||
ranEndPoint.ComAddr, gainValues.Length, string.Join(",", gainValues)); |
|||
|
|||
var result = await ExecuteCommandAsync(cmd_setAllGain, "所有端口发送增益设置"); |
|||
|
|||
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="ranEndPoint">RAN 端点信息</param>
|
|||
/// <param name="gainValues">所有端口的增益值数组,按端口顺序排列</param>
|
|||
/// <returns>是否成功设置增益</returns>
|
|||
public async Task<bool> SetAllRxGainAsync(RanIPEndPoint ranEndPoint, double[] gainValues) |
|||
{ |
|||
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 cmd_setAllGain = $"{BuildCommandPrefix(ranEndPoint)} '{{""message"":""rf"",""rx_gain"":{gainArrayJson}}}'"; |
|||
|
|||
_logger.LogInformation("开始设置所有端口接收增益,地址: {ComAddr}, 端口数量: {PortCount}, 增益值: {GainValues}", |
|||
ranEndPoint.ComAddr, gainValues.Length, string.Join(",", gainValues)); |
|||
|
|||
var result = await ExecuteCommandAsync(cmd_setAllGain, "所有端口接收增益设置"); |
|||
|
|||
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
|
|||
} |
|||
Loading…
Reference in new issue