|
|
@ -174,13 +174,14 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
|
|
|
|
private async Task<CellularNetworkOperationResult> StartNetworkAsync(CellularNetworkConfiguration cellular) |
|
|
|
{ |
|
|
|
string key =cellular.RuntimeCode; |
|
|
|
string key = cellular.RuntimeCode; |
|
|
|
var startTime = DateTime.UtcNow; |
|
|
|
_logger.LogInformation("开始启动网络配置 {ConfigKey},开始时间: {StartTime}", key, startTime.ToString("yyyy-MM-dd HH:mm:ss.fff")); |
|
|
|
|
|
|
|
// 1. 获取并验证网络配置
|
|
|
|
// 步骤1: 创建蜂窝网络配置文件
|
|
|
|
// 根据传入的蜂窝网络配置和应用程序设置,创建临时配置文件
|
|
|
|
var step1Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤1开始:获取并验证网络配置"); |
|
|
|
_logger.LogDebug("步骤1开始:创建蜂窝网络配置文件"); |
|
|
|
|
|
|
|
var (isSuccess, errorMsg, config) = await _configCopier.CreateCellularNetworkConfigurationFile(cellular, _context.GetAppSettings()); |
|
|
|
if (!isSuccess) |
|
|
@ -191,9 +192,37 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
} |
|
|
|
|
|
|
|
var step1Duration = (DateTime.UtcNow - step1Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤1完成:获取并验证网络配置,耗时: {Duration}ms", step1Duration.ToString("F2")); |
|
|
|
_logger.LogDebug("步骤1完成:创建蜂窝网络配置文件,耗时: {Duration}ms", step1Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 2. 执行网络接口初始化命令
|
|
|
|
// 只有步骤1成功才继续执行后续步骤
|
|
|
|
var result = await ExecuteRemainingStepsAsync(config, key, startTime); |
|
|
|
|
|
|
|
// 删除临时配置文件 - 无论成功还是失败都需要执行
|
|
|
|
var deleteResult = _configCopier.DeleteCellularNetworkConfigurationFile(config); |
|
|
|
if (!deleteResult.IsSuccess) |
|
|
|
{ |
|
|
|
_logger.LogWarning("删除临时配置文件失败: {ErrorMessage}", deleteResult.ErrorMessage); |
|
|
|
// 不返回失败,因为网络启动流程已经完成
|
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_logger.LogInformation("临时配置文件删除成功"); |
|
|
|
} |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 执行剩余的启动步骤(步骤2-12)
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="config">网络配置</param>
|
|
|
|
/// <param name="key">配置键</param>
|
|
|
|
/// <param name="startTime">开始时间</param>
|
|
|
|
/// <returns>执行结果</returns>
|
|
|
|
private async Task<CellularNetworkOperationResult> ExecuteRemainingStepsAsync(NetworkConfiguration config, string key, DateTime startTime) |
|
|
|
{ |
|
|
|
// 步骤2: 执行网络接口初始化命令
|
|
|
|
// 初始化网络接口,确保网络环境准备就绪
|
|
|
|
var step2Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤2开始:执行网络接口初始化命令"); |
|
|
|
|
|
|
@ -206,7 +235,8 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var step2Duration = (DateTime.UtcNow - step2Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤2完成:执行网络接口初始化命令,耗时: {Duration}ms", step2Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 3. 复制配置值到临时目录
|
|
|
|
// 步骤3: 复制配置值到临时目录
|
|
|
|
// 将网络配置的关键参数复制到系统临时目录,供后续步骤使用
|
|
|
|
var step3Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤3开始:复制配置值到临时目录"); |
|
|
|
|
|
|
@ -221,31 +251,34 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var step3Duration = (DateTime.UtcNow - step3Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤3完成:复制配置值到临时目录,耗时: {Duration}ms", step3Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 4. 获取并验证 IP 端点信息
|
|
|
|
// 步骤4: 获取并验证IP端点信息
|
|
|
|
// 从配置中提取通信地址信息,验证端点的有效性
|
|
|
|
var step4Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤4开始:获取并验证 IP 端点信息"); |
|
|
|
_logger.LogDebug("步骤4开始:获取并验证IP端点信息"); |
|
|
|
|
|
|
|
var (endPoints, hasAnyEndPoint) = await _configCopier.GetComAddrInfoAsync(config); |
|
|
|
if (!hasAnyEndPoint) |
|
|
|
{ |
|
|
|
var message = "未获取到任何有效的 IP 端点信息"; |
|
|
|
var message = "未获取到任何有效的IP端点信息"; |
|
|
|
_logger.LogError(message); |
|
|
|
return CellularNetworkOperationResult.Failure(message); |
|
|
|
} |
|
|
|
|
|
|
|
var step4Duration = (DateTime.UtcNow - step4Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤4完成:获取并验证 IP 端点信息,耗时: {Duration}ms", step4Duration.ToString("F2")); |
|
|
|
_logger.LogDebug("步骤4完成:获取并验证IP端点信息,耗时: {Duration}ms", step4Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 5. 更新 IP 端点管理器
|
|
|
|
// 步骤5: 更新IP端点管理器
|
|
|
|
// 将获取到的端点信息更新到网络上下文中的端点管理器
|
|
|
|
var step5Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤5开始:更新 IP 端点管理器"); |
|
|
|
_logger.LogDebug("步骤5开始:更新IP端点管理器"); |
|
|
|
|
|
|
|
_context.NetworkIPEndPointManager.UpdateEndPoints(endPoints); |
|
|
|
|
|
|
|
var step5Duration = (DateTime.UtcNow - step5Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤5完成:更新 IP 端点管理器,耗时: {Duration}ms", step5Duration.ToString("F2")); |
|
|
|
_logger.LogDebug("步骤5完成:更新IP端点管理器,耗时: {Duration}ms", step5Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 6. 创建协议客户端配置
|
|
|
|
// 步骤6: 创建协议客户端配置
|
|
|
|
// 基于网络实体信息创建协议客户端配置,为后续的协议通信做准备
|
|
|
|
var step6Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤6开始:创建协议客户端配置"); |
|
|
|
|
|
|
@ -264,22 +297,24 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var step6Duration = (DateTime.UtcNow - step6Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤6完成:创建协议客户端配置,耗时: {Duration}ms", step6Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 7. 启动 WebSocket 传输连接
|
|
|
|
// 步骤7: 启动WebSocket传输连接
|
|
|
|
// 建立与协议服务器的WebSocket连接,为数据传输做准备
|
|
|
|
var step7Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤7开始:启动 WebSocket 传输连接"); |
|
|
|
_logger.LogDebug("步骤7开始:启动WebSocket传输连接"); |
|
|
|
|
|
|
|
var webSocketConnected = await StartWebSocketTransportAsync(); |
|
|
|
if (!webSocketConnected) |
|
|
|
{ |
|
|
|
_logger.LogError("WebSocket 传输连接启动失败,服务端可能未启动"); |
|
|
|
return CellularNetworkOperationResult.Failure("WebSocket 传输连接启动失败,服务端可能未启动"); |
|
|
|
_logger.LogError("WebSocket传输连接启动失败,服务端可能未启动"); |
|
|
|
return CellularNetworkOperationResult.Failure("WebSocket传输连接启动失败,服务端可能未启动"); |
|
|
|
} |
|
|
|
_logger.LogInformation("WebSocket 传输连接启动成功"); |
|
|
|
_logger.LogInformation("WebSocket传输连接启动成功"); |
|
|
|
|
|
|
|
var step7Duration = (DateTime.UtcNow - step7Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤7完成:启动 WebSocket 传输连接,耗时: {Duration}ms", step7Duration.ToString("F2")); |
|
|
|
_logger.LogDebug("步骤7完成:启动WebSocket传输连接,耗时: {Duration}ms", step7Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 8. 启动网络配置
|
|
|
|
// 步骤8: 启动网络配置
|
|
|
|
// 启用网络接口配置,激活蜂窝网络连接
|
|
|
|
var step8Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤8开始:启动网络配置"); |
|
|
|
_logger.LogInformation("正在启动蜂窝网络配置: {ConfigKey}", key); |
|
|
@ -295,7 +330,8 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var step8Duration = (DateTime.UtcNow - step8Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤8完成:启动网络配置,耗时: {Duration}ms", step8Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 9. 更新网络配置类型
|
|
|
|
// 步骤9: 更新网络配置类型
|
|
|
|
// 根据启动结果更新网络配置类型,记录当前使用的配置类型
|
|
|
|
var step9Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤9开始:更新网络配置类型"); |
|
|
|
|
|
|
@ -305,7 +341,8 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var step9Duration = (DateTime.UtcNow - step9Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤9完成:更新网络配置类型,耗时: {Duration}ms", step9Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 10. 检查网络端点连接状态
|
|
|
|
// 步骤10: 检查网络端点连接状态
|
|
|
|
// 验证所有网络端点的连接状态,确保网络连接正常
|
|
|
|
var step10Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤10开始:检查网络端点连接状态"); |
|
|
|
_logger.LogInformation("开始检查所有网络端点的连接状态"); |
|
|
@ -315,6 +352,7 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
{ |
|
|
|
var errorMessage = string.Join("; ", statusCheckResult.ErrorMessage); |
|
|
|
_logger.LogWarning("网络端点状态检查未通过: {ErrorMessage}", errorMessage); |
|
|
|
await RestoreNetworkStateAsync(); |
|
|
|
return CellularNetworkOperationResult.Failure($"网络端点状态检查失败: {errorMessage}"); |
|
|
|
} |
|
|
|
_logger.LogInformation("网络端点状态检查完成,所有端点状态正常"); |
|
|
@ -322,7 +360,8 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var step10Duration = (DateTime.UtcNow - step10Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤10完成:检查网络端点连接状态,耗时: {Duration}ms", step10Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 11. 更新网络状态
|
|
|
|
// 步骤11: 更新网络状态
|
|
|
|
// 将网络状态标记为已启动,更新内部状态管理
|
|
|
|
var step11Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤11开始:更新网络状态"); |
|
|
|
|
|
|
@ -332,20 +371,15 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var step11Duration = (DateTime.UtcNow - step11Start).TotalMilliseconds; |
|
|
|
_logger.LogDebug("步骤11完成:更新网络状态,耗时: {Duration}ms", step11Duration.ToString("F2")); |
|
|
|
|
|
|
|
// 12. 启动所有协议客户端
|
|
|
|
// 步骤12: 启动所有协议客户端
|
|
|
|
// 启动所有协议客户端,开始协议数据采集和传输
|
|
|
|
var step12Start = DateTime.UtcNow; |
|
|
|
_logger.LogDebug("步骤12开始:启动所有协议客户端"); |
|
|
|
|
|
|
|
try |
|
|
|
var result = await StartAllProtocolClientsAsync(protocolConfigFactory); |
|
|
|
if (!result.IsSuccess) |
|
|
|
{ |
|
|
|
var protocolConfigs = protocolConfigFactory.GetAllConfigs(); |
|
|
|
_protocolWsClientManager.StartAllClients(protocolConfigs); |
|
|
|
_logger.LogInformation("所有协议客户端启动完成"); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogError(ex, "启动协议客户端失败"); |
|
|
|
return CellularNetworkOperationResult.Failure($"启动协议客户端失败: {ex.Message}"); |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
var step12Duration = (DateTime.UtcNow - step12Start).TotalMilliseconds; |
|
|
@ -355,18 +389,6 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var duration = endTime - startTime; |
|
|
|
_logger.LogInformation("蜂窝网络配置 {ConfigKey} 启动成功,当前状态: {Status},总耗时: {Duration}ms", |
|
|
|
key, state.CurrentStatus, duration.TotalMilliseconds.ToString("F2")); |
|
|
|
|
|
|
|
// 删除临时配置文件
|
|
|
|
var deleteResult = _configCopier.DeleteCellularNetworkConfigurationFile(config); |
|
|
|
if (!deleteResult.IsSuccess) |
|
|
|
{ |
|
|
|
_logger.LogWarning("删除临时配置文件失败: {ErrorMessage}", deleteResult.ErrorMessage); |
|
|
|
// 不返回失败,因为网络已经启动成功
|
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_logger.LogInformation("临时配置文件删除成功"); |
|
|
|
} |
|
|
|
|
|
|
|
return CellularNetworkOperationResult.Success(state.CurrentStatus); |
|
|
|
} |
|
|
@ -390,5 +412,82 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 恢复网络状态
|
|
|
|
/// 在网络启动过程中出现错误时,尝试恢复到初始状态
|
|
|
|
/// </summary>
|
|
|
|
private async Task RestoreNetworkStateAsync() |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
_logger.LogInformation("开始恢复网络状态"); |
|
|
|
|
|
|
|
// 1. 关闭WebSocket传输连接
|
|
|
|
try |
|
|
|
{ |
|
|
|
if (_webSocketTransport.IsConnected) |
|
|
|
{ |
|
|
|
await _webSocketTransport.CloseAsync(); |
|
|
|
_logger.LogDebug("WebSocket传输连接关闭完成"); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogWarning(ex, "关闭WebSocket传输连接时出现异常,继续执行恢复流程"); |
|
|
|
} |
|
|
|
|
|
|
|
// 2. 执行网络接口初始化命令,重置网络状态
|
|
|
|
try |
|
|
|
{ |
|
|
|
var initResult = await _interfaceManager.ExecuteInitializeCommandsAsync(true); |
|
|
|
if (!initResult.IsSuccess) |
|
|
|
{ |
|
|
|
_logger.LogWarning("执行网络接口初始化命令失败: {ErrorMessage}", initResult.ErrorMessage); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_logger.LogDebug("网络接口初始化命令执行成功"); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogWarning(ex, "执行网络接口初始化命令时出现异常"); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogError(ex, "恢复网络状态过程中出现未预期的异常"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 启动所有协议客户端
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="protocolConfigFactory">协议配置工厂</param>
|
|
|
|
/// <returns>启动结果</returns>
|
|
|
|
private async Task<CellularNetworkOperationResult> StartAllProtocolClientsAsync(ProtocolClientConfigFactory protocolConfigFactory) |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
var protocolConfigs = protocolConfigFactory.GetAllConfigs(); |
|
|
|
var startResult = _protocolWsClientManager.StartAllClients(protocolConfigs); |
|
|
|
if (!startResult) |
|
|
|
{ |
|
|
|
_logger.LogWarning("部分协议客户端启动失败"); |
|
|
|
await RestoreNetworkStateAsync(); |
|
|
|
return CellularNetworkOperationResult.Failure("部分协议客户端启动失败"); |
|
|
|
} |
|
|
|
_logger.LogInformation("所有协议客户端启动完成"); |
|
|
|
return CellularNetworkOperationResult.Success(NetworkStatus.Connected); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogError(ex, "启动协议客户端失败"); |
|
|
|
await RestoreNetworkStateAsync(); |
|
|
|
return CellularNetworkOperationResult.Failure($"启动协议客户端失败: {ex.Message}"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|