|
|
@ -6,6 +6,9 @@ using CoreAgent.Domain.Interfaces.System.Command; |
|
|
|
using CoreAgent.Domain.Models.Network; |
|
|
|
using CoreAgent.Domain.Models.System; |
|
|
|
using CoreAgent.Infrastructure.Services.Network; |
|
|
|
using CoreAgent.WebSocketTransport.Interfaces; |
|
|
|
using CoreAgent.ProtocolClient.ProtocolEngineCore; |
|
|
|
using CoreAgent.ProtocolClient.Interfaces; |
|
|
|
using Microsoft.Extensions.Logging; |
|
|
|
using Microsoft.Extensions.Options; |
|
|
|
using System.IO; |
|
|
@ -25,9 +28,12 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
private readonly INetworkConfigCopier _configCopier; |
|
|
|
private readonly INetworkInterfaceManager _interfaceManager; |
|
|
|
private readonly INetworkStatusMonitor _statusMonitor; |
|
|
|
private readonly IWebSocketTransport _webSocketTransport; |
|
|
|
private readonly IProtocolLogObserver _protocolLogObserver; |
|
|
|
private readonly IProtocolWsClientManager _protocolWsClientManager; |
|
|
|
private static readonly SemaphoreSlim _startLock = new(1, 1); |
|
|
|
private const int LockTimeoutSeconds = 60; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public CellularNetworkService( |
|
|
|
ILogger<CellularNetworkService> logger, |
|
|
@ -37,7 +43,10 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
ICellularNetworkContext context, |
|
|
|
INetworkConfigCopier configCopier, |
|
|
|
INetworkInterfaceManager interfaceManager, |
|
|
|
INetworkStatusMonitor statusMonitor) |
|
|
|
INetworkStatusMonitor statusMonitor, |
|
|
|
IWebSocketTransport webSocketTransport, |
|
|
|
IProtocolLogObserver protocolLogObserver, |
|
|
|
IProtocolWsClientManager protocolWsClientManager) |
|
|
|
{ |
|
|
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
|
|
|
_loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); |
|
|
@ -47,6 +56,9 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
_configCopier = configCopier ?? throw new ArgumentNullException(nameof(configCopier)); |
|
|
|
_interfaceManager = interfaceManager ?? throw new ArgumentNullException(nameof(interfaceManager)); |
|
|
|
_statusMonitor = statusMonitor; |
|
|
|
_webSocketTransport = webSocketTransport ?? throw new ArgumentNullException(nameof(webSocketTransport)); |
|
|
|
_protocolLogObserver = protocolLogObserver ?? throw new ArgumentNullException(nameof(protocolLogObserver)); |
|
|
|
_protocolWsClientManager = protocolWsClientManager ?? throw new ArgumentNullException(nameof(protocolWsClientManager)); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -163,7 +175,28 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
return CellularNetworkOperationResult.Failure(disableResult.ErrorMessage); |
|
|
|
} |
|
|
|
|
|
|
|
// 5. 收集所有网络端点信息
|
|
|
|
// 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(), |
|
|
@ -171,7 +204,7 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
CnEndPoints = _context.NetworkIPEndPointManager.GetCnEndPoints() |
|
|
|
}; |
|
|
|
|
|
|
|
// 6. 检查网络端点连接状态
|
|
|
|
// 8. 检查网络端点连接状态
|
|
|
|
_logger.LogInformation("开始检查所有网络端点的连接状态"); |
|
|
|
var statusCheckResult = await _statusMonitor.CheckAllEndPointsStatusAsync(endPoints, _context.CurrentConfigType, isStartOperation:false); |
|
|
|
if (!statusCheckResult.IsSuccess) |
|
|
@ -180,7 +213,7 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
return CellularNetworkOperationResult.Failure("网络端点仍然处于连接状态,停止操作失败"); |
|
|
|
} |
|
|
|
|
|
|
|
// 7. 重置上下文并返回成功结果
|
|
|
|
// 9. 重置上下文并返回成功结果
|
|
|
|
_context.Reset(); |
|
|
|
return CellularNetworkOperationResult.Success(NetworkStatus.Disconnected); |
|
|
|
} |
|
|
@ -239,7 +272,13 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
|
|
|
|
private async Task<CellularNetworkOperationResult> StartNetworkAsync(string key) |
|
|
|
{ |
|
|
|
var startTime = DateTime.UtcNow; |
|
|
|
_logger.LogInformation("开始启动网络配置 {ConfigKey},开始时间: {StartTime}", key, startTime.ToString("yyyy-MM-dd HH:mm:ss.fff")); |
|
|
|
|
|
|
|
// 1. 获取并验证网络配置
|
|
|
|
var step1Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤1开始:获取并验证网络配置"); |
|
|
|
|
|
|
|
var config = await _configService.GetByConfigKeyAsync(key); |
|
|
|
if (config == null) |
|
|
|
{ |
|
|
@ -247,15 +286,27 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
_logger.LogError(message); |
|
|
|
return CellularNetworkOperationResult.Failure(message); |
|
|
|
} |
|
|
|
|
|
|
|
var step1Duration = (DateTime.UtcNow - step1Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤1完成:获取并验证网络配置,耗时: {Duration}ms", step1Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 2. 执行网络接口初始化命令
|
|
|
|
var step2Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤2开始:执行网络接口初始化命令"); |
|
|
|
|
|
|
|
var initResult = await _interfaceManager.ExecuteInitializeCommandsAsync(true); |
|
|
|
if (!initResult.IsSuccess) |
|
|
|
{ |
|
|
|
_logger.LogWarning("执行初始化命令失败: {ErrorMessage}", initResult.ErrorMessage); |
|
|
|
} |
|
|
|
|
|
|
|
var step2Duration = (DateTime.UtcNow - step2Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤2完成:执行网络接口初始化命令,耗时: {Duration}ms", step2Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 3. 复制配置值到临时目录
|
|
|
|
var step3Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤3开始:复制配置值到临时目录"); |
|
|
|
|
|
|
|
var copyResult = await _configCopier.CopyConfigValuesToTempAsync(config, _context.GetAppSettings()); |
|
|
|
if (!copyResult.IsSuccess) |
|
|
|
{ |
|
|
@ -263,8 +314,14 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
_logger.LogError(message); |
|
|
|
return CellularNetworkOperationResult.Failure(message); |
|
|
|
} |
|
|
|
|
|
|
|
var step3Duration = (DateTime.UtcNow - step3Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤3完成:复制配置值到临时目录,耗时: {Duration}ms", step3Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 4. 获取并验证 IP 端点信息
|
|
|
|
var step4Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤4开始:获取并验证 IP 端点信息"); |
|
|
|
|
|
|
|
var (endPoints, hasAnyEndPoint) = await _configCopier.GetComAddrInfoAsync(config); |
|
|
|
if (!hasAnyEndPoint) |
|
|
|
{ |
|
|
@ -272,11 +329,23 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
_logger.LogError(message); |
|
|
|
return CellularNetworkOperationResult.Failure(message); |
|
|
|
} |
|
|
|
|
|
|
|
var step4Duration = (DateTime.UtcNow - step4Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤4完成:获取并验证 IP 端点信息,耗时: {Duration}ms", step4Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 5. 更新 IP 端点管理器
|
|
|
|
var step5Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤5开始:更新 IP 端点管理器"); |
|
|
|
|
|
|
|
_context.NetworkIPEndPointManager.UpdateEndPoints(endPoints); |
|
|
|
|
|
|
|
// 5.5. 创建协议客户端配置
|
|
|
|
|
|
|
|
var step5Duration = (DateTime.UtcNow - step5Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤5完成:更新 IP 端点管理器,耗时: {Duration}ms", step5Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 6. 创建协议客户端配置
|
|
|
|
var step6Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤6开始:创建协议客户端配置"); |
|
|
|
|
|
|
|
var protocolConfigFactory = new ProtocolClientConfigFactory(_loggerFactory.CreateLogger<ProtocolClientConfigFactory>(), _context); |
|
|
|
var configCreated = protocolConfigFactory.CreateFromEntities(); |
|
|
|
if (configCreated) |
|
|
@ -288,9 +357,30 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
_logger.LogWarning("协议客户端配置创建失败"); |
|
|
|
return CellularNetworkOperationResult.Failure("协议客户端配置创建失败"); |
|
|
|
} |
|
|
|
|
|
|
|
// 6. 启动网络配置
|
|
|
|
|
|
|
|
var step6Duration = (DateTime.UtcNow - step6Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤6完成:创建协议客户端配置,耗时: {Duration}ms", step6Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 7. 启动 WebSocket 传输连接
|
|
|
|
var step7Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤7开始:启动 WebSocket 传输连接"); |
|
|
|
|
|
|
|
var webSocketConnected = await StartWebSocketTransportAsync(); |
|
|
|
if (!webSocketConnected) |
|
|
|
{ |
|
|
|
_logger.LogError("WebSocket 传输连接启动失败,服务端可能未启动"); |
|
|
|
return CellularNetworkOperationResult.Failure("WebSocket 传输连接启动失败,服务端可能未启动"); |
|
|
|
} |
|
|
|
_logger.LogInformation("WebSocket 传输连接启动成功"); |
|
|
|
|
|
|
|
var step7Duration = (DateTime.UtcNow - step7Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤7完成:启动 WebSocket 传输连接,耗时: {Duration}ms", step7Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 8. 启动网络配置
|
|
|
|
var step8Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤8开始:启动网络配置"); |
|
|
|
_logger.LogInformation("正在启动蜂窝网络配置: {ConfigKey}", key); |
|
|
|
|
|
|
|
var enableResult = await _interfaceManager.EnableAsync(config); |
|
|
|
if (!enableResult.IsSuccess) |
|
|
|
{ |
|
|
@ -298,13 +388,25 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
_logger.LogError(message); |
|
|
|
return CellularNetworkOperationResult.Failure(message); |
|
|
|
} |
|
|
|
|
|
|
|
// 7. 更新网络配置类型
|
|
|
|
|
|
|
|
var step8Duration = (DateTime.UtcNow - step8Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤8完成:启动网络配置,耗时: {Duration}ms", step8Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 9. 更新网络配置类型
|
|
|
|
var step9Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤9开始:更新网络配置类型"); |
|
|
|
|
|
|
|
_context.UpdateNetworkConfigType(enableResult.ConfigType); |
|
|
|
_logger.LogInformation("更新网络配置类型: {ConfigType}", enableResult.ConfigType); |
|
|
|
|
|
|
|
var step9Duration = (DateTime.UtcNow - step9Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤9完成:更新网络配置类型,耗时: {Duration}ms", step9Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 8. 检查网络端点连接状态
|
|
|
|
// 10. 检查网络端点连接状态
|
|
|
|
var step10Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤10开始:检查网络端点连接状态"); |
|
|
|
_logger.LogInformation("开始检查所有网络端点的连接状态"); |
|
|
|
|
|
|
|
var statusCheckResult = await _statusMonitor.CheckAllEndPointsStatusAsync(endPoints, enableResult.ConfigType, isStartOperation:true); |
|
|
|
if (!statusCheckResult.IsSuccess) |
|
|
|
{ |
|
|
@ -313,12 +415,83 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
|
return CellularNetworkOperationResult.Failure($"网络端点状态检查失败: {errorMessage}"); |
|
|
|
} |
|
|
|
_logger.LogInformation("网络端点状态检查完成,所有端点状态正常"); |
|
|
|
|
|
|
|
// 9. 更新网络状态并返回结果
|
|
|
|
|
|
|
|
var step10Duration = (DateTime.UtcNow - step10Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤10完成:检查网络端点连接状态,耗时: {Duration}ms", step10Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 11. 更新网络状态
|
|
|
|
var step11Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤11开始:更新网络状态"); |
|
|
|
|
|
|
|
var state = _context.GetNetworkState(); |
|
|
|
state.MarkAsStarted(); |
|
|
|
_logger.LogInformation("蜂窝网络配置 {ConfigKey} 启动成功,当前状态: {Status}", key, state.CurrentStatus); |
|
|
|
|
|
|
|
var step11Duration = (DateTime.UtcNow - step11Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤11完成:更新网络状态,耗时: {Duration}ms", step11Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 12. 启动所有协议客户端
|
|
|
|
var step12Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤12开始:启动所有协议客户端"); |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
var protocolConfigs = protocolConfigFactory.GetAllConfigs(); |
|
|
|
_protocolWsClientManager.StartAllClients(protocolConfigs); |
|
|
|
_logger.LogInformation("所有协议客户端启动完成"); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogError(ex, "启动协议客户端失败"); |
|
|
|
return CellularNetworkOperationResult.Failure($"启动协议客户端失败: {ex.Message}"); |
|
|
|
} |
|
|
|
|
|
|
|
var step12Duration = (DateTime.UtcNow - step12Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤12完成:启动所有协议客户端,耗时: {Duration}ms", step12Duration.ToString("F2")); |
|
|
|
|
|
|
|
var endTime = DateTime.UtcNow; |
|
|
|
var duration = endTime - startTime; |
|
|
|
_logger.LogInformation("蜂窝网络配置 {ConfigKey} 启动成功,当前状态: {Status},总耗时: {Duration}ms", |
|
|
|
key, state.CurrentStatus, duration.TotalMilliseconds.ToString("F2")); |
|
|
|
|
|
|
|
return CellularNetworkOperationResult.Success(state.CurrentStatus); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 启动 WebSocket 传输连接
|
|
|
|
/// </summary>
|
|
|
|
/// <returns>连接是否成功</returns>
|
|
|
|
private async Task<bool> StartWebSocketTransportAsync() |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
_logger.LogInformation("开始启动 WebSocket 传输连接"); |
|
|
|
await _webSocketTransport.ConnectAsync(); |
|
|
|
return _webSocketTransport.IsConnected; |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogError(ex, "WebSocket 传输连接启动失败"); |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 停止 WebSocket 传输连接
|
|
|
|
/// </summary>
|
|
|
|
/// <returns>停止是否成功</returns>
|
|
|
|
private async Task<bool> StopWebSocketTransportAsync() |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
_logger.LogInformation("开始停止 WebSocket 传输连接"); |
|
|
|
await _webSocketTransport.CloseAsync(); |
|
|
|
return !_webSocketTransport.IsConnected; |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogError(ex, "WebSocket 传输连接停止失败"); |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |