不同厂家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);
}