155 lines
4.7 KiB
C#
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 });
|
|
}
|
|
}
|
|
}
|