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 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; // 清空缓冲区 防止收到之前的数据 } }