RFIDManagercs.cs 5.6 KB

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

namespace OnlineStore.DeviceLibrary
{
    public class RFIDManager
    {
        public static List<string> ShelfIpList = new List<string>();
        public static List<string> TrayIpList = new List<string>();
        private static int DefaultTrayNum = ConfigAppSettings.GetIntValue(Setting_Init.DefaultTrayNum);

        public static void Open()
        { 
            Dictionary<string, string> rfidMap = DeviceConfig.ProRFIpMap;
            foreach (string key in rfidMap.Keys)
            {
                if (key.EndsWith("-1"))
                {
                    ShelfIpList.Add(rfidMap[key]);
                }
                else
                {
                    TrayIpList.Add(rfidMap[key]);
                }
            }
            RFIDAutoReader.Open(null, new List<string>(rfidMap.Values).ToArray());
        }

        /// <summary>
        /// 获取托盘编码
        /// </summary> 
        public static int GetTrayNum(int subType, bool isClear = false)
        {
            if (DefaultTrayNum > 0)
            {
                return DefaultTrayNum;
            }
            //  return 9;
            if (subType.Equals(104))
            {
                return LineManager.Line.Sw23TrayNum;
            }
            else if (subType.Equals(101))
            {
                return LineManager.Line.Sw41TrayNum;
            }

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

            return 0;
        }
        public static RFIDData GetShelfId(int subType)
        {
            string ip = GetRFIP(subType, 1);
            RFIDData data = ReadRFID(ip, true);
         
            return data;
        }

        public static RFIDData ReadRFID(string ip, bool isClear = false)
        {
            try
            {
                if (String.IsNullOrEmpty(ip).Equals(false)  )
                //if (String.IsNullOrEmpty(ip).Equals(false) && LineManager.Line.rfidList.Contains(ip))
                    {
                    byte[] bdata = null;
                    if (isClear)
                    {
                        bdata = RFIDAutoReader.ReadAndClear(ip);
                    }
                    else
                    {
                        bdata = RFIDAutoReader.Read(ip);

                    }
                    if (bdata == null)
                    {
                        LogUtil.error("RFID [ " + ip + " ] 读到数据=null");
                    }
                    RFIDData data = new RFIDData(bdata);
                    return data;
                }
            }
            catch (Exception ex)
            {
                //LogUtil.error("ReadRFID["+ip+"]出错:",ex);
            }
            return new RFIDData( );
        }

        public static string GetRFIP(int subType, int rtType = 0)
        {
            string ip = "";
            string rtName = DeviceConfig.RFIP_Str + "_" + subType.ToString().PadLeft(3, '0');
            if (rtType > 0)
            {
                rtName += "-" + rtType.ToString();
            }
            if (DeviceConfig.ProRFIpMap.ContainsKey(rtName))
            {
                ip = DeviceConfig.ProRFIpMap[rtName];
            }
            return ip;
        }

        public static void Close()
        {
            try
            {
                RFIDAutoReader.CloseAll();
            }
            catch (Exception ex)
            {
                LogUtil.error("关闭RFID出错:", ex);
            }
        }
    }
    public class RFIDData
    {
        /// <summary>
        /// RFID类型,区分是料架还是托盘,托盘E=69,包装料料架A=65,料串=B
        /// </summary>
        public char RFType = '0';
        /// <summary>
        /// 托盘编号,从1-32
        /// </summary>
        public int Num = 0;


        public RFIDData(int num=0, int t=0)
        {
            if (t < 65)
            {
                RFType = '0';
            }
            else
            {
                this.RFType = (char)t;
            }
            this.Num = num;
        }

        public RFIDData(byte[] data)
        {
            try
            {
                if (data != null && data.Length > 2)
                {
                    if (data[1] < 65)
                    {
                        RFType = '0';
                    }
                    else
                    {
                        RFType = (char)data[1];
                    }
                    Num = (int)(data[2]);
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("RFIP 数据【" + data + "】 获取编码失败");
            }
        }

        public byte[] ToData()
        {
            return new byte[] { (byte)RFType, (byte)Num };
        }
        public string NumStr()
        {
            return "" + RFType + "" + Num.ToString().PadLeft(2, '0') + "";
        }
    }
}