using ProjectBase.Data.BaseDAL; using ProjectBase.Data.Logs; using SIMDP.BLL; using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Timers; namespace SIMDP.Device { public class RecvScanner { Socket socketScanner = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); System.Timers.Timer timerScanner = null; IPEndPoint epServer = null; string address = ""; bool running = false; Action receiveAct = null; public RecvScanner(double interval = 1000) { socketScanner.Blocking = true; timerScanner = new System.Timers.Timer(interval); timerScanner.AutoReset = false; timerScanner.Elapsed += ReceiveScanner; } /// /// 启动扫码枪接收线程 /// /// /// public void Start(string Ip, int Port, Action action) { if (running) { LogHelper.log.Error($"接收扫码器({address})正在运行中,无法重复启动({Ip})"); return; } address = $"{Ip}:{Port.ToString()}"; LogHelper.log.Info($"接收扫码器({address})启动"); epServer = new IPEndPoint(IPAddress.Parse(Ip), Port); receiveAct = action; running = true; timerScanner.Start(); } public void Stop() { running = false; } private void ReceiveScanner(object sender, ElapsedEventArgs e) { if (!socketScanner.Connected) { try { socketScanner.Connect(epServer); LogHelper.log.Info($"接收扫码器({address})已连接,开始接收数据..."); } catch { } } else { TryReceive(); } if (running) timerScanner.Start(); } private void TryReceive() { string data = ""; try { byte[] temp = new byte[1024]; while (socketScanner.Poll(2000, SelectMode.SelectRead)) { int nRead = socketScanner.Receive(temp); if (nRead == 0) { LogHelper.log.Warn($"接收扫码器({address})通信断开,自动重连..."); socketScanner.Close(); return; } data += Encoding.UTF8.GetString(temp, 0, nRead).Trim('\n').Trim('\r'); } } catch (Exception ex) { socketScanner.Close(); LogHelper.log.Error($"接收扫码器({address})数据发生异常:{ex}"); //Tool.LogAndNotice("生产过程报警", 3, $"接收扫码器({address})数据发生异常:{ex}"); } if (data.Length > 0) // 收到数据后执行动作 { receiveAct(data); } } } }