2025-03-23 15:26:01 +08:00

95 lines
2.9 KiB
C#

using System.Net.Sockets;
using System.Text;
using NetTaste;
using Newtonsoft.Json.Linq;
namespace Seyounth.Hyosung.Core.Scanner;
public class HikScanner(string host, int port,int timeout=1000)
{
public string Host => host;
public int Port => port;
public int Timeout => timeout;
private Socket _socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public async Task ConnectAsync(CancellationToken token)
{
await _socket.ConnectAsync(Host, Port, token);
Console.WriteLine($"scanner[{Host}:{Port}] connected");
}
public async Task CloseAsync(CancellationToken token)
{
await _socket.DisconnectAsync(true, token);
_socket.Dispose();
}
public async Task Restart()
{
try
{
_socket.Close();
}
finally
{
_socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
await _socket.ConnectAsync(Host, Port);
}
}
public async Task Stop()
{
var cmd = "stop"u8.ToArray();
await _socket.SendAsync(cmd);
}
public async Task<string> ScanAsync()
{
var barcode = string.Empty;
try
{
if (!_socket.Connected)
{
_socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
await _socket.ConnectAsync(Host, Port);
}
byte[] _ = new byte[1024];
while (_socket.Available > 0)
{
await _socket.ReceiveAsync(_, SocketFlags.None);
}
_socket.ReceiveTimeout = 1000;
byte[] cmd = "start"u8.ToArray();
await _socket.SendAsync(cmd);
byte[] buffer = new byte[1024];
int len = await _socket.ReceiveAsync(buffer).WaitAsync(TimeSpan.FromMilliseconds(Timeout));
barcode= Encoding.ASCII.GetString(buffer, 0, len);
}
catch (Exception e)
{
_socket.Close();
_socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
await _socket.ConnectAsync(Host, Port);
byte[] _ = new byte[1024];
while (_socket.Available > 0)
{
await _socket.ReceiveAsync(_, SocketFlags.None);
}
_socket.ReceiveTimeout = 1000;
byte[] cmd = "start"u8.ToArray();
await _socket.SendAsync(cmd);
byte[] buffer = new byte[1024];
int len = await _socket.ReceiveAsync(buffer).WaitAsync(TimeSpan.FromMilliseconds(1000));
barcode= Encoding.ASCII.GetString(buffer, 0, len);
}
finally
{
var cmd = "stop"u8.ToArray();
await _socket.SendAsync(cmd);
}
return barcode;
// 清空缓冲区 防止收到之前的数据
}
}