using CoreAgent.Domain.Interfaces;
using CoreAgent.Domain.Models;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
namespace CoreAgent.Infrastructure.Services;
///
/// 蜂窝网络服务实现
///
public class CellularNetworkService : ICellularNetworkService
{
private readonly ILogger _logger;
public CellularNetworkService(ILogger logger)
{
_logger = logger;
}
public async Task StartAsync(string interfaceName, CellularNetworkConfig config)
{
try
{
_logger.LogInformation("正在启动蜂窝网络接口: {InterfaceName}", interfaceName);
// 启用网络接口
var enableCommand = $"netsh interface set interface \"{interfaceName}\" admin=ENABLED";
await ExecuteCommandAsync(enableCommand);
// 配置网络接口
var configCommand = $"netsh interface cellular set profile name=\"{config.Apn}\" interface=\"{interfaceName}\"";
await ExecuteCommandAsync(configCommand);
_logger.LogInformation("蜂窝网络接口启动成功: {InterfaceName}", interfaceName);
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "启动蜂窝网络接口失败: {InterfaceName}", interfaceName);
return false;
}
}
public async Task StopAsync(string interfaceName)
{
try
{
_logger.LogInformation("正在停止蜂窝网络接口: {InterfaceName}", interfaceName);
var command = $"netsh interface set interface \"{interfaceName}\" admin=DISABLED";
await ExecuteCommandAsync(command);
_logger.LogInformation("蜂窝网络接口停止成功: {InterfaceName}", interfaceName);
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "停止蜂窝网络接口失败: {InterfaceName}", interfaceName);
return false;
}
}
public async Task GetStatusAsync(string interfaceName)
{
try
{
_logger.LogInformation("正在获取蜂窝网络接口状态: {InterfaceName}", interfaceName);
// 获取接口状态
var statusCommand = $"netsh interface show interface \"{interfaceName}\"";
var statusResult = await ExecuteCommandAsync(statusCommand);
// 获取信号强度
var signalCommand = $"netsh interface cellular show interfaces \"{interfaceName}\"";
var signalResult = await ExecuteCommandAsync(signalCommand);
var status = new CellularNetworkStatus
{
IsEnabled = statusResult.Contains("已启用", StringComparison.OrdinalIgnoreCase),
ConnectionState = ParseConnectionState(statusResult),
SignalStrength = ParseSignalStrength(signalResult),
CarrierName = ParseCarrierName(signalResult)
};
_logger.LogInformation("获取蜂窝网络接口状态成功: {InterfaceName}", interfaceName);
return status;
}
catch (Exception ex)
{
_logger.LogError(ex, "获取蜂窝网络接口状态失败: {InterfaceName}", interfaceName);
throw;
}
}
private async Task ExecuteCommandAsync(string command)
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $"/c {command}",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
var output = await process.StandardOutput.ReadToEndAsync();
var error = await process.StandardError.ReadToEndAsync();
await process.WaitForExitAsync();
if (process.ExitCode != 0)
{
throw new Exception($"命令执行失败: {error}");
}
return output;
}
private string ParseConnectionState(string statusResult)
{
if (statusResult.Contains("已连接", StringComparison.OrdinalIgnoreCase))
return "已连接";
if (statusResult.Contains("已断开", StringComparison.OrdinalIgnoreCase))
return "已断开";
return "未知";
}
private int ParseSignalStrength(string signalResult)
{
// 这里需要根据实际输出格式进行解析
// 示例实现,实际使用时需要根据具体输出格式调整
if (signalResult.Contains("信号强度: 强", StringComparison.OrdinalIgnoreCase))
return 4;
if (signalResult.Contains("信号强度: 中", StringComparison.OrdinalIgnoreCase))
return 3;
if (signalResult.Contains("信号强度: 弱", StringComparison.OrdinalIgnoreCase))
return 2;
return 1;
}
private string ParseCarrierName(string signalResult)
{
// 这里需要根据实际输出格式进行解析
// 示例实现,实际使用时需要根据具体输出格式调整
var carrierLine = signalResult.Split('\n')
.FirstOrDefault(line => line.Contains("运营商:", StringComparison.OrdinalIgnoreCase));
return carrierLine?.Split(':').LastOrDefault()?.Trim() ?? "未知";
}
}