using Microsoft.AspNetCore.Mvc; using System.Net; using System.Net.Sockets; using AmtScanner.Api.Data; using AmtScanner.Api.Models; using AmtScanner.Api.Services; namespace AmtScanner.Api.Controllers; [ApiController] [Route("api/[controller]")] public class TestController : ControllerBase { private readonly AppDbContext _db; private readonly IAmtNetworkService _networkService; public TestController(AppDbContext db, IAmtNetworkService networkService) { _db = db; _networkService = networkService; } [HttpGet("network-config/{ip}")] public async Task TestNetworkConfig(string ip, [FromQuery] string username = "admin", [FromQuery] string password = "Guo1wu3shi4!") { try { var config = await _networkService.GetNetworkConfigAsync(ip, username, password); if (config == null) { return Ok(new { success = false, message = "无法获取网络配置" }); } return Ok(new { success = true, config }); } catch (Exception ex) { return Ok(new { success = false, error = ex.Message, stackTrace = ex.StackTrace }); } } [HttpGet("udp/{ip}")] public IActionResult TestUdp(string ip) { try { using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // RMCP Ping packet byte[] pingData = new byte[] { 0x06, 0x00, 0x00, 0x06, // RMCP Header 0x00, 0x00, 0x11, 0xBE, // ASF IANA 0x80, 0x00, 0x00, 0x00 // Presence Ping }; var endpoint = new IPEndPoint(IPAddress.Parse(ip), 623); socket.Connect(endpoint); socket.ReceiveTimeout = 5000; socket.SendTimeout = 5000; // Send ping int sent = socket.Send(pingData); // Try to receive response byte[] buffer = new byte[128]; int received = socket.Receive(buffer); return Ok(new { success = true, sent = sent, received = received, responseHex = BitConverter.ToString(buffer, 0, received) }); } catch (Exception ex) { return Ok(new { success = false, error = ex.Message, errorType = ex.GetType().Name }); } } [HttpGet("udp2/{ip}")] public async Task TestUdp2(string ip) { try { using var udpClient = new UdpClient(); udpClient.Client.ReceiveTimeout = 5000; udpClient.Client.SendTimeout = 5000; // RMCP Ping packet byte[] pingData = new byte[] { 0x06, 0x00, 0x00, 0x06, // RMCP Header 0x00, 0x00, 0x11, 0xBE, // ASF IANA 0x80, 0x00, 0x00, 0x00 // Presence Ping }; var endpoint = new IPEndPoint(IPAddress.Parse(ip), 623); // Send ping int sent = await udpClient.SendAsync(pingData, pingData.Length, endpoint); // Try to receive response with timeout var cts = new CancellationTokenSource(5000); var result = await udpClient.ReceiveAsync(cts.Token); return Ok(new { success = true, sent = sent, received = result.Buffer.Length, responseHex = BitConverter.ToString(result.Buffer), from = result.RemoteEndPoint.ToString() }); } catch (Exception ex) { return Ok(new { success = false, error = ex.Message, errorType = ex.GetType().Name }); } } [HttpGet("add-test-device/{ip}")] public async Task AddTestDevice(string ip) { try { var device = new AmtPendingDevice_new { IpAddress = ip, AmtVersion = "Test", ProvisioningState = "Post", Source = "test", CreatedAt = DateTime.UtcNow, UpdatedAt = DateTime.UtcNow }; _db.AmtPendingDevices_new.Add(device); await _db.SaveChangesAsync(); return Ok(new { success = true, message = "设备添加成功", device }); } catch (Exception ex) { return Ok(new { success = false, error = ex.Message }); } } }