RFIDManagercs.cs 5.8 KB
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 ConcurrentDictionary<string, PuYueRFID_C2S> RfidMap = new ConcurrentDictionary<string, PuYueRFID_C2S>();
        public static void Open(string ip)
        {
            try
            {
                if (RfidMap.ContainsKey(ip))
                {
                    return;
                }
                PuYueRFID_C2S rfid = new PuYueRFID_C2S(ip, true);
                //rfid.StartAddr = 0x20;
                //rfid.Length = 16;
                rfid.ID_Changed_Event += Rfid_ID_Changed_Event;
                if (rfid.IsConn)
                    rfid.Close();
                else
                {
                    rfid.IP = ip;
                    rfid.Open();
                }
                RfidMap.TryAdd(ip, rfid);
            }
            catch (Exception ex)
            {
                LogUtil.error("Open 出错:" + ex.ToString());
            }
        }

        private static void Rfid_ID_Changed_Event(object sender, string e)
        {
            //Task.Factory.StartNew(new Action(() =>
            //{
            //    PuYueRFID_C2S rfid = sender as PuYueRFID_C2S;
            //    if (rfid != null)
            //        if (RfidMap.ContainsKey(rfid.IP))
            //        {
            //            val = Encoding.UTF8.GetString(new byte[] { outValue[0], outValue[1], outValue[2], outValue[3], outValue[8], outValue[9], outValue[10] })?.Trim() ?? "";

            //            LogUtil.info($"RFID[{rfid.IP}]更新:{e}");
            //        }
            //}));
        }

        public static RFIDData GetContainerCode(string deviceName, int subType, int idx = 0)
        {
            List<string> ips = GetRFIP(subType);
            //获取盘号
            RFIDData data = new RFIDData();
            if (ips == null || ips.Count == 0)
            {
                return data;
            }
            if (idx < ips.Count)
                data = ReadRFID(ips[idx]);
            return data;
        }
        public static RFIDData GetShelfId(int deviceId, int idx = 0)
        {
            List<string> ips = GetRFIP(deviceId);
            if (idx < ips.Count)
                return ReadRFID(ips[idx]);
            return new RFIDData();
        }

        public static List<string> GetRFIP(int deviceId)
        {
            string rtName = DeviceConfig.RFIP_Str + "_" + deviceId.ToString().PadLeft(3, '0');
            if (DeviceConfig.ProRFIpMap.ContainsKey(rtName))
            {
                return DeviceConfig.ProRFIpMap[rtName].Split('#').ToList();
            }
            return new List<string>();
        }
        static bool useFR336P = ConfigAppSettings.GetBoolValue(Setting_Init.UseFR336P, false);
        public static RFIDData ReadRFID(string ip)
        {
            try
            {
                if (String.IsNullOrEmpty(ip).Equals(false))
                {
                    if (RfidMap.ContainsKey(ip))
                    {
                        bool rtn = RfidMap[ip].ReadByte(0x20, 16, out byte[] outValue);
                        string val;
                        RFIDData data;
                        if (rtn)
                        {
                            if (useFR336P)
                            {
                                val = Encoding.UTF8.GetString(new byte[] { outValue[0], outValue[1], outValue[2], outValue[3], outValue[4], outValue[5], outValue[6] })?.Trim() ?? "";
                            }
                            else
                                val = Encoding.UTF8.GetString(new byte[] { outValue[0], outValue[1], outValue[2], outValue[3], outValue[8], outValue[9], outValue[10] })?.Trim() ?? "";
                            data = new RFIDData(val);
                            data.ReadResult = rtn ? RfidResult.读取成功 : RfidResult.读取失败;
                            return data;
                        }
                        data = new RFIDData();
                        data.ReadResult = rtn ? RfidResult.读取成功 : RfidResult.读取失败;
                        return data;
                    }

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

        public static void Close(string ip)
        {
            try
            {
                if (RfidMap.ContainsKey(ip))
                {
                    if (RfidMap[ip] != null)
                        RfidMap[ip].Close();
                    RfidMap.TryRemove(ip, out PuYueRFID_C2S rFIDInfo);
                }
            }
            catch (Exception ex)
            {
                LogUtil.error($"关闭RFID出错[{ip}]:" + ex.ToString());
            }
        }

    }
    public class RFIDData
    {
        public string StrData = "";
        public RfidResult ReadResult;
        public RFIDData(string data = "00")
        {
            if (String.IsNullOrEmpty(data))
            {
                data = "00";
            }
            this.StrData = data;
        }
        public bool IsValidated()
        {
            return this.StrData.StartsWith("C");
        }
        public string ToContainerId()
        {
            return StrData.Substring(0, StrData.Length - 1);
        }
        public string NumStr()
        {
            return StrData;
        }
    }
    public enum RfidResult
    {
        //读取成功状态-1读取失败,0没有读到,1读取成功
        没有读到 = -1,
        读取失败,
        读取成功
    }
}