|
@ -40,12 +40,12 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
_context = context ?? throw new ArgumentNullException(nameof(context)); |
|
|
_context = context ?? throw new ArgumentNullException(nameof(context)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public async Task<bool> StartAsync(string key) |
|
|
public async Task<CellularNetworkOperationResult> StartAsync(string key) |
|
|
{ |
|
|
{ |
|
|
if (string.IsNullOrEmpty(key)) |
|
|
if (string.IsNullOrEmpty(key)) |
|
|
{ |
|
|
{ |
|
|
_logger.LogError("启动蜂窝网络失败:配置键为空"); |
|
|
_logger.LogError("启动蜂窝网络失败:配置键为空"); |
|
|
return false; |
|
|
return CellularNetworkOperationResult.Failure("启动蜂窝网络失败:配置键为空"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
try |
|
|
try |
|
@ -53,17 +53,26 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
if (!await _startLock.WaitAsync(TimeSpan.FromSeconds(LockTimeoutSeconds))) |
|
|
if (!await _startLock.WaitAsync(TimeSpan.FromSeconds(LockTimeoutSeconds))) |
|
|
{ |
|
|
{ |
|
|
_logger.LogWarning("蜂窝网络启动操作被锁定,可能已有其他启动操作正在进行"); |
|
|
_logger.LogWarning("蜂窝网络启动操作被锁定,可能已有其他启动操作正在进行"); |
|
|
return false; |
|
|
return CellularNetworkOperationResult.Failure("蜂窝网络启动操作被锁定,可能已有其他启动操作正在进行"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 检查网络状态
|
|
|
|
|
|
var stateCheckResult = CheckNetworkState(key); |
|
|
|
|
|
if (!stateCheckResult.IsSuccess) |
|
|
|
|
|
{ |
|
|
|
|
|
return stateCheckResult; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 初始化网络上下文
|
|
|
// 初始化网络上下文
|
|
|
_context.Initialize(); |
|
|
_context.Initialize(key); |
|
|
var result = await StartInternalAsync(key); |
|
|
var result = await StartNetworkAsync(key); |
|
|
if (!result) |
|
|
if (!result.IsSuccess) |
|
|
{ |
|
|
{ |
|
|
_logger.LogWarning("启动蜂窝网络内部操作失败,重置上下文"); |
|
|
_logger.LogWarning("启动蜂窝网络内部操作失败,重置上下文"); |
|
|
_context.Reset(); |
|
|
_context.Reset(); |
|
|
|
|
|
return result; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return result; |
|
|
return result; |
|
|
} |
|
|
} |
|
|
catch (Exception ex) |
|
|
catch (Exception ex) |
|
@ -71,7 +80,7 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
_logger.LogError(ex, "启动蜂窝网络失败"); |
|
|
_logger.LogError(ex, "启动蜂窝网络失败"); |
|
|
// 重置上下文
|
|
|
// 重置上下文
|
|
|
_context.Reset(); |
|
|
_context.Reset(); |
|
|
return false; |
|
|
return CellularNetworkOperationResult.Failure($"启动蜂窝网络失败: {ex.Message}"); |
|
|
} |
|
|
} |
|
|
finally |
|
|
finally |
|
|
{ |
|
|
{ |
|
@ -79,10 +88,55 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 检查网络状态
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="newConfigKey">新的网络配置键</param>
|
|
|
|
|
|
/// <returns>检查结果</returns>
|
|
|
|
|
|
private CellularNetworkOperationResult CheckNetworkState(string newConfigKey) |
|
|
|
|
|
{ |
|
|
|
|
|
try |
|
|
|
|
|
{ |
|
|
|
|
|
// 获取当前网络状态
|
|
|
|
|
|
var currentKey = _context.GetNeConfigKey(); |
|
|
|
|
|
var currentState = _context.GetNetworkState(); |
|
|
|
|
|
|
|
|
|
|
|
// 检查是否已初始化
|
|
|
|
|
|
if (!string.IsNullOrEmpty(currentKey)) |
|
|
|
|
|
{ |
|
|
|
|
|
// 检查是否是相同的配置
|
|
|
|
|
|
if (currentKey == newConfigKey) |
|
|
|
|
|
{ |
|
|
|
|
|
// 检查当前状态
|
|
|
|
|
|
if (currentState.CurrentStatus == NetworkStatus.Connected) |
|
|
|
|
|
{ |
|
|
|
|
|
return CellularNetworkOperationResult.Failure("当前网络配置已经处于连接状态"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
// 检查当前网络状态
|
|
|
|
|
|
if (currentState.CurrentStatus == NetworkStatus.Connected) |
|
|
|
|
|
{ |
|
|
|
|
|
var message = $"检测到不同的网络配置,当前运行配置: {currentKey},新配置: {newConfigKey},请先停止当前网络"; |
|
|
|
|
|
_logger.LogWarning(message); |
|
|
|
|
|
return CellularNetworkOperationResult.Failure(message); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return CellularNetworkOperationResult.Success(NetworkStatus.Unknown); |
|
|
|
|
|
} |
|
|
|
|
|
catch (Exception ex) |
|
|
|
|
|
{ |
|
|
|
|
|
_logger.LogError(ex, "检查网络状态失败"); |
|
|
|
|
|
return CellularNetworkOperationResult.Failure($"检查网络状态失败: {ex.Message}"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public async Task<bool> StopAsync() |
|
|
public async Task<CellularNetworkOperationResult> StopAsync() |
|
|
{ |
|
|
{ |
|
|
string NeConfigKey = _context.GetNeConfigKey(); |
|
|
string neConfigKey = _context.GetNeConfigKey(); |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
// 1. 检查网络状态
|
|
|
// 1. 检查网络状态
|
|
@ -91,14 +145,14 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
{ |
|
|
{ |
|
|
_logger.LogWarning("蜂窝网络已经处于断开或未知状态,无需停止"); |
|
|
_logger.LogWarning("蜂窝网络已经处于断开或未知状态,无需停止"); |
|
|
_context.Reset(); // 即使不需要停止,也重置状态
|
|
|
_context.Reset(); // 即使不需要停止,也重置状态
|
|
|
return true; |
|
|
return CellularNetworkOperationResult.Success(NetworkStatus.Disconnected); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 2. 执行初始化命令
|
|
|
// 2. 执行初始化命令
|
|
|
await ExecuteInitializeCommandsAsync(); |
|
|
await ExecuteInitializeCommandsAsync(); |
|
|
|
|
|
|
|
|
// 3. 执行停止命令
|
|
|
// 3. 执行停止命令
|
|
|
_logger.LogInformation("正在执行停止命令: {InterfaceName}", NeConfigKey); |
|
|
_logger.LogInformation("正在执行停止命令: {ConfigKey}", neConfigKey); |
|
|
var commands = _context.GetNetworkCommandConfig(); |
|
|
var commands = _context.GetNetworkCommandConfig(); |
|
|
if (commands?.NetworkCommands != null) |
|
|
if (commands?.NetworkCommands != null) |
|
|
{ |
|
|
{ |
|
@ -115,64 +169,54 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 4. 停止网络接口
|
|
|
// 4. 停止网络配置
|
|
|
if (!await DisableNetworkInterfaceAsync(NeConfigKey)) |
|
|
if (!await DisableNetworkInterfaceAsync(neConfigKey)) |
|
|
{ |
|
|
{ |
|
|
return false; |
|
|
return CellularNetworkOperationResult.Failure("停止网络配置失败"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 5. 更新状态
|
|
|
// 5. 更新状态
|
|
|
_logger.LogInformation($"蜂窝网络 {NeConfigKey} 停止成功"); |
|
|
_logger.LogInformation($"蜂窝网络配置 {neConfigKey} 停止成功"); |
|
|
|
|
|
|
|
|
// 6. 重置上下文
|
|
|
// 6. 重置上下文
|
|
|
_context.Reset(); |
|
|
_context.Reset(); |
|
|
return true; |
|
|
return CellularNetworkOperationResult.Success(NetworkStatus.Disconnected); |
|
|
} |
|
|
} |
|
|
catch (Exception ex) |
|
|
catch (Exception ex) |
|
|
{ |
|
|
{ |
|
|
_logger.LogError(ex, $"停止蜂窝网络 {NeConfigKey} 失败"); |
|
|
_logger.LogError(ex, $"停止蜂窝网络配置 {neConfigKey} 失败"); |
|
|
return false; |
|
|
return CellularNetworkOperationResult.Failure($"停止蜂窝网络失败: {ex.Message}"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private async Task<bool> StartInternalAsync(string key) |
|
|
private async Task<CellularNetworkOperationResult> StartNetworkAsync(string key) |
|
|
{ |
|
|
{ |
|
|
// 1. 获取并验证配置
|
|
|
// 1. 获取并验证配置
|
|
|
var config = await _configService.GetByConfigKeyAsync(key); |
|
|
var config = await _configService.GetByConfigKeyAsync(key); |
|
|
if (config == null) |
|
|
if (config == null) |
|
|
{ |
|
|
{ |
|
|
_logger.LogError("未找到网络配置: {ConfigKey}", key); |
|
|
var message = $"未找到网络配置: {key}"; |
|
|
return false; |
|
|
_logger.LogError(message); |
|
|
|
|
|
return CellularNetworkOperationResult.Failure(message); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 2. 检查网络状态
|
|
|
// 2. 执行初始化命令
|
|
|
var state = _context.GetNetworkState(); |
|
|
|
|
|
if (state.CurrentStatus == NetworkStatus.Connected) |
|
|
|
|
|
{ |
|
|
|
|
|
_logger.LogWarning("蜂窝网络已经处于连接状态,不能重复启动"); |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 3. 执行初始化命令
|
|
|
|
|
|
await ExecuteInitializeCommandsAsync(true); |
|
|
await ExecuteInitializeCommandsAsync(true); |
|
|
|
|
|
|
|
|
// 4. 启动网络接口
|
|
|
// 3. 启动网络配置
|
|
|
_logger.LogInformation("正在启动蜂窝网络接口: {InterfaceName}", key); |
|
|
_logger.LogInformation("正在启动蜂窝网络配置: {ConfigKey}", key); |
|
|
if (!await EnableNetworkInterfaceAsync(config)) |
|
|
if (!await EnableNetworkInterfaceAsync(config)) |
|
|
{ |
|
|
{ |
|
|
return false; |
|
|
var message = $"启动网络配置失败: {key}"; |
|
|
|
|
|
_logger.LogError(message); |
|
|
|
|
|
return CellularNetworkOperationResult.Failure(message); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 5. 等待连接
|
|
|
// 4. 更新状态
|
|
|
//if (!await WaitForConnectionAsync(key))
|
|
|
var state = _context.GetNetworkState(); |
|
|
//{
|
|
|
|
|
|
// return false;
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
// 6. 更新状态
|
|
|
|
|
|
state.MarkAsStarted(); |
|
|
state.MarkAsStarted(); |
|
|
_logger.LogInformation("蜂窝网络接口 {InterfaceName} 启动成功", key); |
|
|
_logger.LogInformation("蜂窝网络配置 {ConfigKey} 启动成功", key); |
|
|
return true; |
|
|
return CellularNetworkOperationResult.Success(state.CurrentStatus); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private async Task ExecuteInitializeCommandsAsync(bool bStartInit = false) |
|
|
private async Task ExecuteInitializeCommandsAsync(bool bStartInit = false) |
|
@ -487,26 +531,26 @@ public class CellularNetworkService : ICellularNetworkService |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private async Task<bool> DisableNetworkInterfaceAsync(string interfaceName) |
|
|
private async Task<bool> DisableNetworkInterfaceAsync(string neConfigKey) |
|
|
{ |
|
|
{ |
|
|
var result = await _commandExecutor.ExecuteCommandAsync( |
|
|
var result = await _commandExecutor.ExecuteCommandAsync( |
|
|
$"netsh interface cellular set interface \"{interfaceName}\" admin=disable", |
|
|
$"netsh interface cellular set interface \"{neConfigKey}\" admin=disable", |
|
|
new CancellationTokenSource()); |
|
|
new CancellationTokenSource()); |
|
|
|
|
|
|
|
|
if (!result.IsSuccess) |
|
|
if (!result.IsSuccess) |
|
|
{ |
|
|
{ |
|
|
_logger.LogError("停止蜂窝网络接口失败"); |
|
|
_logger.LogError("停止网络配置失败"); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private async Task<bool> WaitForConnectionAsync(string interfaceName) |
|
|
private async Task<bool> WaitForConnectionAsync(string neConfigKey) |
|
|
{ |
|
|
{ |
|
|
for (int i = 0; i < MaxConnectionAttempts; i++) |
|
|
for (int i = 0; i < MaxConnectionAttempts; i++) |
|
|
{ |
|
|
{ |
|
|
var status = await _commandExecutor.ExecuteCommandAsync( |
|
|
var status = await _commandExecutor.ExecuteCommandAsync( |
|
|
$"netsh interface cellular show interfaces \"{interfaceName}\"", |
|
|
$"netsh interface cellular show interfaces \"{neConfigKey}\"", |
|
|
new CancellationTokenSource()); |
|
|
new CancellationTokenSource()); |
|
|
|
|
|
|
|
|
if (status.IsSuccess && status.Output.Contains("已连接", StringComparison.OrdinalIgnoreCase)) |
|
|
if (status.IsSuccess && status.Output.Contains("已连接", StringComparison.OrdinalIgnoreCase)) |
|
|