using System.Net; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using Peripherals.NetConfigClient; namespace server.Controllers; /// /// 网络配置控制器(仅管理员权限) /// [ApiController] [Route("api/[controller]")] [Authorize("Admin")] public class NetConfigController : ControllerBase { private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); // 固定的实验板IP和端口 private const string BOARD_IP = "169.254.109.0"; private const int BOARD_PORT = 1234; /// /// 获取主机IP地址 /// /// 主机IP地址 [HttpGet("GetHostIP")] [EnableCors("Users")] [ProducesResponseType(typeof(string), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task GetHostIP() { try { var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.GetHostIP(); if (!result.IsSuccessful) { logger.Error($"获取主机IP失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"获取失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "获取主机IP时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "获取失败,请稍后重试"); } } /// /// 获取板卡IP地址 /// /// 板卡IP地址 [HttpGet("GetBoardIP")] [EnableCors("Users")] [ProducesResponseType(typeof(string), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task GetBoardIP() { try { var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.GetBoardIP(); if (!result.IsSuccessful) { logger.Error($"获取板卡IP失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"获取失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "获取板卡IP时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "获取失败,请稍后重试"); } } /// /// 获取主机MAC地址 /// /// 主机MAC地址 [HttpGet("GetHostMAC")] [EnableCors("Users")] [ProducesResponseType(typeof(string), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task GetHostMAC() { try { var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.GetHostMAC(); if (!result.IsSuccessful) { logger.Error($"获取主机MAC地址失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"获取失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "获取主机MAC地址时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "获取失败,请稍后重试"); } } /// /// 获取板卡MAC地址 /// /// 板卡MAC地址 [HttpGet("GetBoardMAC")] [EnableCors("Users")] [ProducesResponseType(typeof(string), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task GetBoardMAC() { try { var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.GetBoardMAC(); if (!result.IsSuccessful) { logger.Error($"获取板卡MAC地址失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"获取失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "获取板卡MAC地址时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "获取失败,请稍后重试"); } } /// /// 获取所有网络配置信息 /// /// 网络配置信息 [HttpGet("GetNetworkConfig")] [EnableCors("Users")] [ProducesResponseType(typeof(NetworkConfigDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task GetNetworkConfig() { try { var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var hostIPResult = await netConfig.GetHostIP(); var boardIPResult = await netConfig.GetBoardIP(); var hostMACResult = await netConfig.GetHostMAC(); var boardMACResult = await netConfig.GetBoardMAC(); var config = new NetworkConfigDto { HostIP = hostIPResult.IsSuccessful ? hostIPResult.Value : "获取失败", BoardIP = boardIPResult.IsSuccessful ? boardIPResult.Value : "获取失败", HostMAC = hostMACResult.IsSuccessful ? hostMACResult.Value : "获取失败", BoardMAC = boardMACResult.IsSuccessful ? boardMACResult.Value : "获取失败" }; return Ok(config); } catch (Exception ex) { logger.Error(ex, "获取网络配置信息时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "获取失败,请稍后重试"); } } /// /// 获取本机所有网络接口信息 /// /// 网络接口信息列表 [HttpGet("GetLocalNetworkInterfaces")] [EnableCors("Users")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public IActionResult GetLocalNetworkInterfaces() { try { var interfaces = System.Net.NetworkInformation.NetworkInterface .GetAllNetworkInterfaces() .Where(nic => nic.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up && nic.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.Loopback) .Select(nic => new NetworkInterfaceDto { Name = nic.Name, Description = nic.Description, Type = nic.NetworkInterfaceType.ToString(), Status = nic.OperationalStatus.ToString(), IPAddresses = nic.GetIPProperties().UnicastAddresses .Where(addr => addr.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) .Select(addr => addr.Address.ToString()) .ToList(), MACAddress = nic.GetPhysicalAddress().ToString() }) .ToList(); return Ok(interfaces); } catch (Exception ex) { logger.Error(ex, "获取本机网络接口信息时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "获取失败,请稍后重试"); } } /// /// 设置主机IP地址 /// /// 主机IP地址 /// 操作结果 [HttpPost("SetHostIP")] [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task SetHostIP(string hostIp) { if (string.IsNullOrWhiteSpace(hostIp)) return BadRequest("主机IP地址不能为空"); if (!IPAddress.TryParse(hostIp, out var hostIpAddress)) return BadRequest("主机IP地址格式不正确"); try { // 创建网络配置客户端 var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.SetHostIP(hostIpAddress); if (!result.IsSuccessful) { logger.Error($"设置主机IP失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"设置失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "设置主机IP时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "设置失败,请稍后重试"); } } /// /// 设置板卡IP地址 /// /// 新的板卡IP地址 /// 操作结果 [HttpPost("SetBoardIP")] [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task SetBoardIP(string newBoardIp) { if (string.IsNullOrWhiteSpace(newBoardIp)) return BadRequest("新的板卡IP地址不能为空"); if (!IPAddress.TryParse(newBoardIp, out var newIpAddress)) return BadRequest("新的板卡IP地址格式不正确"); try { // 创建网络配置客户端 var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.SetBoardIP(newIpAddress); if (!result.IsSuccessful) { logger.Error($"设置板卡IP失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"设置失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "设置板卡IP时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "设置失败,请稍后重试"); } } /// /// 设置主机MAC地址 /// /// 主机MAC地址(格式:AA:BB:CC:DD:EE:FF) /// 操作结果 [HttpPost("SetHostMAC")] [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task SetHostMAC(string hostMac) { if (string.IsNullOrWhiteSpace(hostMac)) return BadRequest("主机MAC地址不能为空"); // 解析MAC地址 if (!TryParseMacAddress(hostMac, out var macBytes)) return BadRequest("MAC地址格式不正确,请使用格式:AA:BB:CC:DD:EE:FF"); try { // 创建网络配置客户端 var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.SetHostMAC(macBytes); if (!result.IsSuccessful) { logger.Error($"设置主机MAC地址失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"设置失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "设置主机MAC地址时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "设置失败,请稍后重试"); } } /// /// 自动获取本机IP地址并设置为实验板主机IP /// /// 操作结果 [HttpPost("UpdateHostIP")] [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task UpdateHostIP() { try { // 获取本机第一个有效的IPv4地址 var ip = System.Net.NetworkInformation.NetworkInterface .GetAllNetworkInterfaces() .Where(nic => nic.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up && nic.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.Loopback) .SelectMany(nic => nic.GetIPProperties().UnicastAddresses) .Where(addr => addr.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) .Select(addr => addr.Address) .FirstOrDefault(); if (ip == null) return StatusCode(StatusCodes.Status500InternalServerError, "无法获取本机IP地址"); var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.SetHostIP(ip); if (!result.IsSuccessful) { logger.Error($"自动设置主机IP失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"设置失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "自动设置主机IP时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "设置失败,请稍后重试"); } } /// /// 更新主机MAC地址 /// /// 操作结果 [HttpPost("UpdateHostMAC")] [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task UpdateHostMAC() { byte[]? macBytes = null; try { // 获取本机第一个可用的MAC地址 macBytes = System.Net.NetworkInformation.NetworkInterface .GetAllNetworkInterfaces() .Where(nic => nic.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up && nic.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.Loopback) .Select(nic => nic.GetPhysicalAddress()?.GetAddressBytes()) .FirstOrDefault(bytes => bytes != null && bytes.Length == 6); if (macBytes == null) return StatusCode(StatusCodes.Status500InternalServerError, "无法获取本机MAC地址"); // 创建网络配置客户端 var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.SetHostMAC(macBytes); if (!result.IsSuccessful) { logger.Error($"设置主机MAC地址失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"设置失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "设置主机MAC地址时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "设置失败,请稍后重试"); } } /// /// 设置板卡MAC地址 /// /// 板卡MAC地址(格式:AA:BB:CC:DD:EE:FF) /// 操作结果 [HttpPost("SetBoardMAC")] [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task SetBoardMAC(string boardMac) { if (string.IsNullOrWhiteSpace(boardMac)) return BadRequest("板卡MAC地址不能为空"); // 解析MAC地址 if (!TryParseMacAddress(boardMac, out var macBytes)) return BadRequest("MAC地址格式不正确,请使用格式:AA:BB:CC:DD:EE:FF"); try { // 创建网络配置客户端 var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); var result = await netConfig.SetBoardMAC(macBytes); if (!result.IsSuccessful) { logger.Error($"设置板卡MAC地址失败: {result.Error}"); return StatusCode(StatusCodes.Status500InternalServerError, $"设置失败: {result.Error}"); } return Ok(result.Value); } catch (Exception ex) { logger.Error(ex, "设置板卡MAC地址时发生异常"); return StatusCode(StatusCodes.Status500InternalServerError, "设置失败,请稍后重试"); } } /// /// 解析MAC地址字符串为字节数组 /// /// MAC地址字符串 /// 解析后的字节数组 /// 是否解析成功 private static bool TryParseMacAddress(string macAddress, out byte[] macBytes) { macBytes = Array.Empty(); if (string.IsNullOrWhiteSpace(macAddress)) return false; // 移除可能的分隔符并统一为冒号 var cleanMac = macAddress.Replace("-", ":").Replace(" ", "").ToUpper(); // 验证格式 if (cleanMac.Length != 17 || cleanMac.Count(c => c == ':') != 5) return false; var parts = cleanMac.Split(':'); if (parts.Length != 6) return false; try { macBytes = new byte[6]; for (int i = 0; i < 6; i++) { macBytes[i] = Convert.ToByte(parts[i], 16); } return true; } catch { macBytes = Array.Empty(); return false; } } } /// /// 网络配置数据传输对象 /// public class NetworkConfigDto { /// /// 主机IP地址 /// public string? HostIP { get; set; } /// /// 板卡IP地址 /// public string? BoardIP { get; set; } /// /// 主机MAC地址 /// public string? HostMAC { get; set; } /// /// 板卡MAC地址 /// public string? BoardMAC { get; set; } } /// /// 网络配置操作结果 /// public class NetworkConfigResult { /// /// 主机IP设置结果 /// public bool? HostIPResult { get; set; } /// /// 主机IP设置错误信息 /// public string? HostIPError { get; set; } /// /// 板卡IP设置结果 /// public bool? BoardIPResult { get; set; } /// /// 板卡IP设置错误信息 /// public string? BoardIPError { get; set; } /// /// 主机MAC设置结果 /// public bool? HostMACResult { get; set; } /// /// 主机MAC设置错误信息 /// public string? HostMACError { get; set; } /// /// 板卡MAC设置结果 /// public bool? BoardMACResult { get; set; } /// /// 板卡MAC设置错误信息 /// public string? BoardMACError { get; set; } } /// /// 网络接口信息数据传输对象 /// public class NetworkInterfaceDto { /// /// 网络接口名称 /// public string Name { get; set; } = string.Empty; /// /// 网络接口描述 /// public string Description { get; set; } = string.Empty; /// /// 网络接口类型 /// public string Type { get; set; } = string.Empty; /// /// 网络接口状态 /// public string Status { get; set; } = string.Empty; /// /// IP地址列表 /// public List IPAddresses { get; set; } = new(); /// /// MAC地址 /// public string MACAddress { get; set; } = string.Empty; }