RFIDManager.cs 4.0 KB
using Asa.RFID;
using OnlineStore.Common;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public class RFIDManager
    {
        private static Asa.RFID.ReadAll read;
        private static bool IsOpen = false;
        public static bool IsAuto = false;
        /// <summary>
        /// 是否连接
        /// </summary>
        public static bool IsConnected { get; set; } = false;
        private static Dictionary<string, string> LastRfidMap = new Dictionary<string, string>();

        public static void Open(string[] ip)
        {
            if (IsOpen)
            {
                return;
            }
            try
            {
                read = new ReadAll("TheRFID");
                read.Received += Read_Received;
                read.Start(13001);
                IsOpen = true;
            }
            catch (Exception ex)
            {
                LogUtil.error("Open 出错:" + ex.ToString());
            }
        }
        private static string lastStr = "";

        private static void Read_Received(string ip, string id)
        {
            try
            {
                if(LastRfidMap.ContainsKey(ip))
                {
                    LastRfidMap[ip] = id;
                }
                else
                {
                    LastRfidMap.Add(ip,id);
                }

            }
            catch (ObjectDisposedException ex)
            {
                //程序刚退出,又回传数据
            }
        }

        private static void ReadAll_Log(string ip, string log)
        {
            string str = "RFID : [" + ip + "] " + log;
            if (lastStr.Equals(str))
            {
                return;
            }
            LogUtil.info(str);
            lastStr = str;
        }

        public static RFIDData ReadRFID(string ip,bool isClear= true)
        {
            try
            {
                if (String.IsNullOrEmpty(ip).Equals(false) && read!=null)
                {
                    if (isClear)
                    {
                        read.Clear(ip);
                    }
                    Thread.Sleep(100);
                    string outValue = read.Read(ip);

                    RFIDData data = new RFIDData(outValue);

                    return data;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("ReadRFID[" + ip + "] [" + isClear + "] 出错:" + ex.ToString());
            }
            return new RFIDData();
        }


        public static void Close()
        {
            try
            {
                if(IsOpen)
                {
                    read.Stop();
                    IsOpen = false;
                }
            }
            catch (Exception ex)
            {
                IsOpen = false;
                LogUtil.error("关闭RFID出错:" + ex.ToString());
            }
        }

    }
    public class RFIDData
    {
        public string StrData = "";
        public RFIDData(string data = "00")
        {
            if (String.IsNullOrEmpty(data))
            {
                data = "00";
            }
            this.StrData = data;
        }

        public string NumStr()
        {
            return StrData;
        }

        internal static bool IsRealRfid(string shelfRfid)
        {
            //判断料架号是否是真实的料架号
            if (shelfRfid.StartsWith("C") || shelfRfid.StartsWith("D"))
            {
                int num = -1;
                try
                {
                    num = Convert.ToInt32(shelfRfid.Substring(1, shelfRfid.Length - 1));
                }
                catch (Exception ex)
                {
                }
                if (num > 0)
                {
                    return true;
                }
            }
            return false;
        }
    }
}