155 lines
4.7 KiB
C#

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<IActionResult> 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<IActionResult> 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<IActionResult> 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 });
}
}
}