不同厂家RFID读写器统一编程接口的实现

来源:互联网 发布:mac安装win7 iso下载 编辑:程序博客网 时间:2024/04/29 12:40

 

不同厂家RFID读写器统一编程接口的实现

设计思想:采用工厂模式

 

一:准备工作:

1:准备好不同厂家的RFID读写器及配置天线和馈线,RFID标签若干

2:收集不同厂家读写器及其编程接口API

 

二:编写一个RFID读写器操作基类

下面是核心代码:

    /// <summary>
    /// 不同厂家RFID读写器操作基类
    /// </summary>
    public class  BaseSpeedReader
    {
        
        protected Form mFrmScan = null;
        protected DataTable mDtEPC = null;

     
        public delegate void MethodInvoke();
        public delegate void NoticeEPC_EventHandler(object sender, Common.Args.NoticeEPCEventArgs e);

        [Category("DMZ"), Description("通知界面层处理标签"), DefaultValue((true))]
        public event NoticeEPC_EventHandler NoticeEPCHandler; //EventHandler

        [Category("DMZ"), Description("通知界面层已连接读写器"), DefaultValue((true))]
        public event EventHandler NoticeConnectedHandler;

     

        /// <summary>
        /// 通知界面层告知标签的读取信息
        /// </summary>
        public void NoticeEPC()
        {

            if (NoticeEPCHandler != null)
            {
                NoticeEPCEventArgs arg = new NoticeEPCEventArgs();
                arg.DtEPC = this.mDtEPC;
                NoticeEPCHandler(null, arg);
              
            }
        }


        /// <summary>
        /// 通知界面层连接读写器成功或失败
        /// </summary>
        public void NoticeConnected()
        {

            if (NoticeConnectedHandler != null)
            {
                EventArgs arg = new EventArgs();
                NoticeConnectedHandler(null, arg);
             
            }
        }

}

 

三:编写一个A厂家读写器操作类

internal class SpeedReaderForHSJC : BaseSpeedReader

{

        ///<summary>
        ///连接读取器并开始读取标签
        ///</summary>
        ///<param name="readerName"></param>
        ///<returns>连接成功返回true</returns>
        public override bool Run(string readerName)
        {
            try
            {             

                Reader.Logging += newEventHandler<LoggingEventArgs>(LoggingHandler);
                Reader.Connected += newEventHandler<ConnectionChangedEventArgs>(ConnectedHandler);            

                Reader.Started += newEventHandler<StartedEventArgs>(StartedHandler);
                Reader.TagsReported += newEventHandler<TagsReportedEventArgs>(TagsReportedHandler);                     

                Reader.Connect(readerName,100); //默认端口为100   

 
                //如果读写器连接成功,就通知基类
                if (Reader.IsConnected)
                {

                    base.NoticeConnected();//通知基类
                    Reader.Start();

                }
                return Reader.IsConnected;             

            }          

            catch (Exception ex)
            {
                throw ex;         
            }

            return false;          

        }

        ///<summary>
        ///读到标签后的触发事件
        ///</summary>
        ///<param name="sender"></param>
        ///<param name="args"></param>
        public void TagsReportedHandler(object sender, TagsReportedEventArgs args)
        {
            try
            {
                foreach (Tag tagin args.TagReport.Tags)
                {
                    if (tag.Epc.Length > 17)
                    {
                        string myEPC = tag.Epc.Substring(0, 12);//从第5位开始读取
                        DataRow[] rows = mDtEPC.Select("EPC='" + myEPC +"'");                       

                        if (rows.Length > 0)
                        {
                            //读取次数加1
                            rows[0]["ReadCount"] = System.Convert.ToInt32(rows[0]["ReadCount"]) + 1;
                        }
                        else
                        {
                            //新增一行
                            DataRow newRow = mDtEPC.NewRow();
                            newRow["EPC"] = myEPC;
                            newRow["ReadCount"] = 1;
                            mDtEPC.Rows.Add(newRow);
                        }                      

                    }

                }//end foreach                           

                base.NoticeEPC();//通知基类,然后触发回调函数,给界面层调用
               
            }
            catch (Exception ex)
            {
                throw ex;
            }
 
        }

}

 

四:编写一个B厂家读写器操作类

 

五:工厂类的实现

    ///<summary>

    ///工厂类的实现

    ///</summary>

    public class SpeedReaderFactory{

        public SpeedReaderFactory(){      

        }

        public static BaseSpeedReader GetSpeedReader(Enum.EnumReader ReaderType)
        {

            BaseSpeedReader reader =null;
            if (ReaderType == RFIDReader.Enum.EnumReader.Impinj)
            {
                reader =  new SpeedReaderForImpinj();
            }

            else if (ReaderType == RFIDReader.Enum.EnumReader.HSJC)
            {
                reader =  new SpeedReaderForHSJC();
            }
 

            //采用反射方式调用
            //string dll_path = "";
            //string startPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
            //startPath = startPath.Replace("file:\\", "");
            //Assembly assembly = Assembly.LoadFrom(dll_path);
            //Type objType = assembly.GetType(name);

            return reader;

        }      

    }

 

六:UI界面层的调用

1:定义读写器对象

public RFIDReader.BaseSpeedReader MultiReaderHelper
{

            get
            {

                if (mMultiReaderHelper ==null)
                {

                    if (Properties.Settings.Default.ReaderType == 1)
                    {
                        mMultiReaderHelper = RFIDReader.SpeedReaderFactory.GetSpeedReader(RFIDReader.Enum.EnumReader.Impinj);                  
                    }

                    else if (Properties.Settings.Default.ReaderType == 2)
                    {
                        mMultiReaderHelper = RFIDReader.SpeedReaderFactory.GetSpeedReader(RFIDReader.Enum.EnumReader.HSJC);
                    }
                }
                return mMultiReaderHelper;

            }

 }

2:给该读写器加上触发事件

  

 public  FrmScanOut()
 {

            InitializeComponent();

            MultiReaderHelper.NoticeEPCHandler += new RFIDReader.BaseSpeedReader.NoticeEPC_EventHandler(MultiReaderHelper_NoticeEPCHandler);

            MultiReaderHelper.NoticeConnectedHandler += new EventHandler(MultiReaderHelper_NoticeConnectedHandler);

 }

 

void MultiReaderHelper_NoticeConnectedHandler(object sender,EventArgs e)
{
            Invoke((EventHandler)(delegate
            {
                lbLog.Items.Add(DateTime.Now.ToString("yyyyMMdd HH:mm:ss") +" RFID读写器启动成功!开始读取箱包...");
                this.timer1.Enabled =true;
            }));

            //lbLog.Items.Add(DateTime.Now.ToString("yyyyMMdd HH:mm:ss") + " RFID读写器启动成功!开始读取箱包...");

   }

 

void MultiReaderHelper_NoticeEPCHandler(object sender, RFIDReader.Common.Args.NoticeEPCEventArgs e)
{

     //将正确的箱包显示在列表框,同时显示误读的箱包信息
     base.ShowEPCMsg(e.DtEPC, dgTask, dgTaskStat,this.lbResult);

}

 

 

原创粉丝点击