RFIDManagercs.cs 6.0 KB

using Asa.RFID;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OnlineStore.DeviceLibrary
{
    public class RFIDManager
    {
       
        private static int DefaultTrayNum = ConfigAppSettings.GetIntValue(Setting_Init.DefaultTrayNum); 
        private static ReadAll readAll = new ReadAll("TheRFID");
        private static bool IsOpen = false;
        private static ConcurrentDictionary<string, string> LastRfidMap = new ConcurrentDictionary<string, string>();
        public static void Open( )
        {
            if (IsOpen)
            {
                return;
            }
            try
            {
                int port = ConfigAppSettings.GetIntValue(Setting_Init.RfidServer_Port);
                if (port <= 0)
                {
                    port = 13000;
                }
                LogUtil.info("RFID Server Open,port=" + port);
                readAll.Start(port);
                IsOpen = true;
            }
            catch (Exception ex)
            {
                LogUtil.error("Open 出错:" + ex.ToString());
            }
        }   
        public static int GetTrayNum(string deviceName, int subType, bool isClear = false)
        {
            if (DefaultTrayNum > 0)
            {
                return DefaultTrayNum;
            }  
            string ip = GetRFIP(subType);

            if (String.IsNullOrEmpty(ip))
            {
                return 0;
            }
            //获取盘号
            RFIDData data = ReadRFID(ip, isClear);
            if (data != null)
            {
                if (data.RFType.Equals('E'))
                {
                    return data.Num;
                }
                else if (data.RFType > 0)
                {
                    LogUtil.error(deviceName+ "RFID [ " + ip + " ] 读到数据 " + data.NumStr() + " 返回盘号  0");
                }
                else
                {
                    LogUtil.debug(deviceName + "RFID [ " + ip + " ] 读到数据 " + data.NumStr() + " 返回盘号  0");
                }
                return 0;
            }

            return 0;
        }
        public static void ClearTrayNum(int subType)
        {
            try
            {  
                string ip = GetRFIP(subType);
                RFIDData data = ReadRFID(ip, true);
            }
            catch (Exception ex)
            {
                LogUtil.error("ClearTrayNum【" + subType + "】出错:" + ex.ToString());
            }
        }
        public static RFIDData GetShelfId(int deviceId)
        {
            string ip = GetRFIP(deviceId );
            return ReadRFID(ip, true);
        }
         
        public static string GetRFIP(int deviceId )
        {
            string ip = "";
            string rtName = DeviceConfig.RFIP_Str + "_" + deviceId.ToString().PadLeft(3, '0'); 
            if (DeviceConfig.ProRFIpMap.ContainsKey(rtName))
            {
                ip = DeviceConfig.ProRFIpMap[rtName];
            }
            return ip;
        }

        public static RFIDData ReadRFID(string ip, bool isClear = false)
        {
            try
            {
                if (String.IsNullOrEmpty(ip).Equals(false))
                {
                    string outValue = readAll.Read(ip);

                    if (isClear)
                    {
                        readAll.Clear(ip);
                    }
                    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
            {
                if (IsOpen)
                {
                    readAll.Stop();
                    IsOpen = false;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("关闭RFID出错:" + ex.ToString());
            }
        }

    }
    public class RFIDData
    {
        public string StrData = "";

        public char RFType
        {
            get
            { 
                char[] charArray = StrData.ToCharArray();
                if (charArray.Length > 0)
                {
                    return charArray[0];
                } 
                return '0';
            }
        }
        public int Num
        {
            get
            { 
                try
                {
                    if (StrData.Length >= 2)
                    {
                        return Convert.ToInt32(StrData.Substring(1, StrData.Length - 1));
                    }
                }
                catch (Exception ex)
                {
                }
                return 0;
            }
        }

        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;
        }
    }
}