diff --git a/CoreAgent.API/Controllers/CellularNetworkController.cs b/CoreAgent.API/Controllers/CellularNetworkController.cs index f710564..848bb07 100644 --- a/CoreAgent.API/Controllers/CellularNetworkController.cs +++ b/CoreAgent.API/Controllers/CellularNetworkController.cs @@ -37,6 +37,21 @@ public class CellularNetworkController : BaseApiController return await HandleRequest>(command); } + /// + /// 启动蜂窝网络 + /// + /// 启动命令 + /// 操作结果 + [HttpPost("generalStart")] + [ProducesResponseType(typeof(ApiActionResult), 200)] + [ProducesResponseType(typeof(ApiActionResult), 400)] + [ProducesResponseType(typeof(ApiActionResult), 500)] + public async Task GeneralStart([FromBody] StartGeneralCellularNetworkCommand command) + { + _logger.LogInformation("收到启动蜂窝网络请求: {ConfigKey}", command.CellularNetwork?.RuntimeCode); + return await HandleRequest>(command); + } + /// /// 停止蜂窝网络 /// diff --git a/CoreAgent.Application/Commands/CellularNetwork/StartGeneralCellularNetworkCommand.cs b/CoreAgent.Application/Commands/CellularNetwork/StartGeneralCellularNetworkCommand.cs new file mode 100644 index 0000000..2f5c893 --- /dev/null +++ b/CoreAgent.Application/Commands/CellularNetwork/StartGeneralCellularNetworkCommand.cs @@ -0,0 +1,16 @@ +using CoreAgent.Domain.Models.Common; +using CoreAgent.Domain.Models.Network; +using MediatR; + +namespace CoreAgent.Application.Commands.CellularNetwork; + +/// +/// 启动蜂窝网络命令 +/// +public class StartGeneralCellularNetworkCommand : IRequest> +{ + /// + /// 网络配置键 + /// + public CellularNetworkConfiguration CellularNetwork { get; set; } +} \ No newline at end of file diff --git a/CoreAgent.Application/Handlers/CellularNetwork/StartGeneralCellularNetworkCommandHandler.cs b/CoreAgent.Application/Handlers/CellularNetwork/StartGeneralCellularNetworkCommandHandler.cs new file mode 100644 index 0000000..079cab0 --- /dev/null +++ b/CoreAgent.Application/Handlers/CellularNetwork/StartGeneralCellularNetworkCommandHandler.cs @@ -0,0 +1,59 @@ +using CoreAgent.Application.Commands.CellularNetwork; +using CoreAgent.Domain.Interfaces.Network; +using CoreAgent.Domain.Models.Common; +using CoreAgent.Domain.Models.Network; +using MediatR; +using Microsoft.Extensions.Logging; +using System.Net; + +namespace CoreAgent.Application.Handlers.CellularNetwork; + +/// +/// 启动蜂窝网络命令处理器 +/// +public class StartGeneralCellularNetworkCommandHandler : IRequestHandler> +{ + private readonly IGeneralCellularNetworkService _cellularNetworkService; + private readonly ILogger _logger; + + public StartGeneralCellularNetworkCommandHandler( + IGeneralCellularNetworkService cellularNetworkService, + ILogger logger) + { + _cellularNetworkService = cellularNetworkService; + _logger = logger; + } + + public async Task> Handle(StartGeneralCellularNetworkCommand request, CancellationToken cancellationToken) + { + try + { + _logger.LogInformation("正在启动蜂窝网络配置: {ConfigKey}", request?.CellularNetwork?.RuntimeCode); + + // 启动网络 + var result = await _cellularNetworkService.StartAsync(request.CellularNetwork); + + if (result.IsSuccess) + { + _logger.LogInformation("蜂窝网络配置 {ConfigKey} 启动成功", request?.CellularNetwork?.RuntimeCode); + return ApiActionResult.Ok(result.NetworkStatus, "蜂窝网络启动成功"); + } + else + { + _logger.LogWarning("蜂窝网络配置 {ConfigKey} 启动失败: {Error}", request?.CellularNetwork?.RuntimeCode, result.ErrorMessage); + return ApiActionResult.Error( + result.ErrorMessage, + "NETWORK_START_ERROR", + HttpStatusCode.BadRequest); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "启动蜂窝网络配置 {ConfigKey} 失败", request?.CellularNetwork?.RuntimeCode); + return ApiActionResult.Error( + $"启动蜂窝网络失败: {ex.Message}", + "INTERNAL_ERROR", + HttpStatusCode.InternalServerError); + } + } +} \ No newline at end of file diff --git a/CoreAgent.Domain/Interfaces/Network/IGeneralCellularNetworkService.cs b/CoreAgent.Domain/Interfaces/Network/IGeneralCellularNetworkService.cs index e3d651e..290f393 100644 --- a/CoreAgent.Domain/Interfaces/Network/IGeneralCellularNetworkService.cs +++ b/CoreAgent.Domain/Interfaces/Network/IGeneralCellularNetworkService.cs @@ -15,11 +15,5 @@ namespace CoreAgent.Domain.Interfaces.Network /// 网络配置映射Key /// 启动结果 Task StartAsync(CellularNetworkConfiguration cellular); - - /// - /// 停止蜂窝网络 - /// - /// 停止结果 - Task StopAsync(string RuntimeCode); } } diff --git a/CoreAgent.Infrastructure/Extensions/ServiceCollection/CommandServiceExtensions.cs b/CoreAgent.Infrastructure/Extensions/ServiceCollection/CommandServiceExtensions.cs index 5bd9615..9c6db1d 100644 --- a/CoreAgent.Infrastructure/Extensions/ServiceCollection/CommandServiceExtensions.cs +++ b/CoreAgent.Infrastructure/Extensions/ServiceCollection/CommandServiceExtensions.cs @@ -57,6 +57,7 @@ public static class CommandServiceExtensions services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/CoreAgent.Infrastructure/Services/Network/GeneralCellularNetworkService.cs b/CoreAgent.Infrastructure/Services/Network/GeneralCellularNetworkService.cs index 252662d..e493792 100644 --- a/CoreAgent.Infrastructure/Services/Network/GeneralCellularNetworkService.cs +++ b/CoreAgent.Infrastructure/Services/Network/GeneralCellularNetworkService.cs @@ -124,107 +124,6 @@ namespace CoreAgent.Infrastructure.Services.Network } } - /// - /// 停止蜂窝网络 - /// - /// 网络配置键 - /// 停止操作的结果 - public async Task StopAsync(string key) - { - string neConfigKey = _context.GetNeConfigKey(); - try - { - // 检查是否是相同的配置 - if (key != neConfigKey) - { - var message = $"停止操作失败:当前运行配置 {neConfigKey} 与请求停止的配置 {key} 不匹配"; - _logger.LogWarning(message); - return CellularNetworkOperationResult.Failure(message); - } - - // 1. 检查当前网络状态 - var state = _context.GetNetworkState(); - if (state.CurrentStatus == NetworkStatus.Disconnected || state.CurrentStatus == NetworkStatus.Unknown) - { - _logger.LogWarning("蜂窝网络已经处于断开或未知状态,无需停止"); - _context.Reset(); // 重置上下文状态 - return CellularNetworkOperationResult.Success(NetworkStatus.Disconnected); - } - - // 2. 检查 RAN 退出状态(仅当配置类型为 BothRagAndCore 或 RagOnly 时) - if (_context.CurrentConfigType is NetworkConfigType.BothRagAndCore or NetworkConfigType.RagOnly) - { - var isRanQuit = await _statusMonitor.CheckRanQuitAsync(_context.NetworkIPEndPointManager.GetRanEndPoint()); - if (!isRanQuit) - { - _logger.LogWarning("RAN 退出状态检查失败"); - return CellularNetworkOperationResult.Failure("RAN 退出状态检查失败"); - } - } - - // 3. 执行网络接口初始化命令 - var initResult = await _interfaceManager.ExecuteInitializeCommandsAsync(); - if (!initResult.IsSuccess) - { - _logger.LogWarning("执行初始化命令失败: {ErrorMessage}", initResult.ErrorMessage); - } - - // 4. 禁用网络配置 - var disableResult = await _interfaceManager.DisableAsync(neConfigKey); - if (!disableResult.IsSuccess) - { - return CellularNetworkOperationResult.Failure(disableResult.ErrorMessage); - } - - // 5. 停止所有协议客户端 - try - { - _logger.LogInformation("开始停止所有协议客户端"); - _protocolWsClientManager.StopAllClients(); - _logger.LogInformation("所有协议客户端停止完成"); - } - catch (Exception ex) - { - _logger.LogError(ex, "停止协议客户端失败"); - // 不返回失败,继续执行后续步骤 - } - - // 6. 停止 WebSocket 传输连接 - var webSocketConnected = await StopWebSocketTransportAsync(); - if (!webSocketConnected) - { - _logger.LogError("WebSocket 传输连接停止失败,服务端可能未启动"); - return CellularNetworkOperationResult.Failure("WebSocket 传输连接停止失败"); - } - _logger.LogInformation("WebSocket 传输连接停止成功"); - // 7. 收集所有网络端点信息 - var endPoints = new NetworkIPEndPointCollection - { - RanEndPoint = _context.NetworkIPEndPointManager.GetRanEndPoint(), - ImsEndPoints = _context.NetworkIPEndPointManager.GetImsEndPoints(), - CnEndPoints = _context.NetworkIPEndPointManager.GetCnEndPoints() - }; - - // 8. 检查网络端点连接状态 - _logger.LogInformation("开始检查所有网络端点的连接状态"); - var statusCheckResult = await _statusMonitor.CheckAllEndPointsStatusAsync(endPoints, _context.CurrentConfigType, isStartOperation: false); - if (!statusCheckResult.IsSuccess) - { - _logger.LogWarning("网络端点仍然处于连接状态,停止操作失败"); - return CellularNetworkOperationResult.Failure("网络端点仍然处于连接状态,停止操作失败"); - } - - // 9. 重置上下文并返回成功结果 - _context.Reset(); - return CellularNetworkOperationResult.Success(NetworkStatus.Disconnected); - } - catch (Exception ex) - { - _logger.LogError(ex, "停止蜂窝网络配置 {ConfigKey} 失败", neConfigKey); - return CellularNetworkOperationResult.Failure($"停止蜂窝网络失败: {ex.Message}"); - } - } - /// /// 检查网络状态 ///