RFIDManager.cs 5.6 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.Tasks;

namespace OnlineStore.DeviceLibrary
{

    public class RFIDManager
    {
        private static Asa.RFID.ReadAll readHao;
        private static Asa.RFID.ReadAll readPu;
        private static bool IsOpen = false;
        private static ConcurrentDictionary<string, List<RfidCacheInfo>> LastRfidMap = new ConcurrentDictionary<string, List<RfidCacheInfo>>();
        public static void Open(string[] iparray)
        {
            if (IsOpen)
            {
                return;
            }
            try
            {
                int port = Setting_Init.RfidServer_Port;
                if (port <= 0)
                {
                    port = 13000;
                }
                LogUtil.info($"RFID Server Open,HaoBin port={port},PuYue port={port + 1}");
                readHao = new Asa.RFID.ReadAll("TheRFID") { Type = Asa.RFID.DeviceType.HaoBin };
                readHao.Received += ReadAll_Received; ;
                readHao.Start(port);
                readPu = new Asa.RFID.ReadAll("TheRFID") { Type = Asa.RFID.DeviceType.PuYue };
                readPu.Received += ReadAll_Received;
                readPu.Start(port + 1);
                IsOpen = true;
            }
            catch (Exception ex)
            {
                LogUtil.error("Open 出错:" + ex.ToString());
            }
        }

        private static void ReadAll_Received(string ip, string id)
        {
            List<RfidCacheInfo> list = LastRfidMap.GetOrAdd(ip, new List<RfidCacheInfo>());
            int count = list.Count;
            if (count > 0)
            {
                RfidCacheInfo last = list[count - 1];
                if (!last.Data.StrData.Equals(id))
                {
                    RFIDData data = new RFIDData(id);
                    list.Add(new RfidCacheInfo(data));
                    if (list.Count > 3)
                    {
                        list.RemoveAt(0);
                    }
                    LogUtil.debug("ReadAll_Received[" + ip + "][" + id + "]加入缓存");
                    LastRfidMap.AddOrUpdate(ip, list, (key, value) => value);
                }
            }
        }

        private static void ReadAll_Log(string ip, string log)
        {
            LogUtil.LOGGER.Info("RFID : [" + ip + "] " + log);
        }


        public static RFIDData ReadRFID(string ip, bool isClear = false)
        {
            try
            {
                if (String.IsNullOrEmpty(ip).Equals(false))
                {
                    Dictionary<string, string> allHao = readHao.Read();
                    string outValue = "";
                    if (allHao.ContainsKey(ip))
                    {
                        outValue = allHao[ip];
                        if (isClear)
                        {
                            readHao.Clear(ip, "00");
                        }
                    }
                    else
                    {
                        Dictionary<string, string> allPu = readPu.Read();
                        if (allPu.ContainsKey(ip))
                        {
                            outValue = allPu[ip];
                            if (isClear)
                            {
                                readPu.Clear(ip, "00");
                            }
                        }
                    }
                    if (outValue.Equals("000"))
                    {
                        //    LogUtil.error("ReadRFID[" + ip + "]=" + outValue);
                    }
                    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
            {
                IsOpen = false;
                readPu.Stop();
                readHao.Stop();
            }
            catch (Exception ex)
            {
                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;
        }
    }
    public class RfidCacheInfo
    {
        public RfidCacheInfo(RFIDData data, bool userd = false)
        {
            this.Data = data;
            this.Used = false;
            this.UpdateTime = DateTime.Now;

        }
        public RFIDData Data { get; set; }

        public bool Used = false;

        public DateTime UpdateTime = DateTime.Now;
    }
}