SocketScanner.cs 3.2 KB
using ConfigHelper;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DeviceLibrary
{
    public class SocketScanner:ICustEditor
    {
        static SocketScanner()
        {
            //AdvanceConfigForm.AddCustomEditor<SocketScanner>(Setting_Init.SocketScanner_uri.Key);
        }

        public object ValueEdit(object value)
        {
            //var r = RobotManage.socketScanner.Scan(Setting_Init.SocketScanner_trigger_code, Setting_Init.SocketScanner_pattern_code, out string code);
            //MessageBox.Show($"Scan Result:{r},code:{code}");
            return value;
        }
        public SocketScanner()
        { }
        Uri server;
        int Timeout;
        private TcpClient socket = null;
        public SocketScanner(string uri, int timeout)
        {
            server = new Uri(uri);
            Timeout = timeout;
        }
        public bool StartConnect(out string msg)
        {
            msg = "";
            if (socket == null)
                socket = new TcpClient();
            try
            {
                if (socket.Connected)
                    return true;
                socket.Close();
                socket = new TcpClient();
                socket.ReceiveTimeout = Timeout;
                var stask = socket.ConnectAsync(server.Host, server.Port);
                var result = stask.Wait(3000);
                LogUtil.error("SocketScanner Connect:" + result);
                return result;

            }
            catch (Exception ex)
            {
                LogUtil.error("SocketScanner 出错:" + ex.ToString());
                msg = ex.Message;
                return false;
            }
        }
        ~SocketScanner()
        {
            if (socket != null && socket.Connected)
                socket.Close();
        }

        public bool Scan(string trigger, string pattern, out string result)
        {
            result = "";
            if (!StartConnect(out _))
            {
                return false;
            }
            while (socket.Client.Available > 0) {
                var tmp = new byte[200];
                var l= socket.Client.Receive(tmp);
                LogUtil.error("SocketScanner 读取到缓存区垃圾:" + Encoding.ASCII.GetString(tmp,0,l));
            }
            var bf = Encoding.ASCII.GetBytes(trigger);
            socket.Client.Send(bf);
            var buff = new byte[200];

            int i;
            try
            {
                i = socket.Client.Receive(buff);
            }
            catch
            {
                return false;
            }
            if (i == 0)
                return false;
            var recv = Encoding.ASCII.GetString(buff, 0, i);
            LogUtil.info("收到扫码数据:"+recv);
            var m = Regex.Match(recv, pattern);
            if (m.Success)
            {
                var index = m.Groups.Count - 1;
                result = m.Groups[index].Value;
                LogUtil.info("匹配规则后返回:" + result);
                return true;
            }
            return false;
        }
    }
}