话说RFID以前很火所以整理一下一年前自己处理的RFID程序,放源码

23 篇文章 7 订阅 ¥9.90 ¥99.00
20 篇文章 0 订阅
4 篇文章 0 订阅
本文分享了一年前作者处理的RFID程序,涵盖了相关技术的运用和源码解析,对于理解RFID技术及其应用具有参考价值。
摘要由CSDN通过智能技术生成
一开始觉得他是个很神奇的东西。 包含串口通讯和网络通讯。 由于网络通讯设备太贵,所以国内的设备基本上都是在外置一个比较便宜的模块在里面。  
 
本案例应该适用于大多数的RFID模块。
 
首先我们先放上RFID API:如下 
 
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
 
namespace Rfid
{
      public class EPCSDKHelper
      {
            [DllImport("EPCSDK.dll")]
            public static extern IntPtr OpenComm(int portNo);
 
            [DllImport("EPCSDK.dll")]
            public static extern void CloseComm(IntPtr hCom);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool ReadFirmwareVersion(IntPtr hCom, out int main, out int sub, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool GetReaderParameters(IntPtr hCom, int addr, int paramNum, byte[] parms, byte ReaderAddr);
             
            [DllImport("EPCSDK.dll")]
            public static extern bool SetReaderParameters(IntPtr hCom, int addr, int paramNum, byte[] parms, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool StopReading(IntPtr hCom, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool ResumeReading(IntPtr hCom, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool IdentifySingleTag(IntPtr hCom, byte[] tagId, byte[] antennaNo, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool IdentifyUploadedSingleTa g(IntPtr hCom, byte[] tagId, byte[] devNos, byte[] antennaNo);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool IdentifyUploadedMultiTag s(IntPtr hCom, out byte tagNum, byte[] tagIds, byte[] devNos, byte[] antennaNos);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool ReadTag(IntPtr hCom, byte memBank, byte address, byte length, byte[] data, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool WriteTagSingleWord(IntPtr hCom, byte memBank, byte address, byte data1, byte data2, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool FastWriteTagID(IntPtr hCom, int bytesNum, byte[] bytes, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool FastWriteTagID_Lock(IntPtr hCom, int bytesNum, byte[] bytes, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool InitializeTag(IntPtr hCom, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool LockPassWordTag(IntPtr hCom, byte passwd1, byte passwd2, byte passwd3, byte passwd4, byte lockType, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool UnlockPassWordTag(IntPtr hCom, byte passwd1, byte passwd2, byte passwd3, byte passwd4, byte lockType, byte ReaderAddr);
 
            [DllImport("EPCSDK.dll")]
            public static extern bool KillTag(IntPtr hCom, byte passwd1, byte passwd2, byte passwd3, byte passwd4, byte ReaderAddr);
      }
}
  我们看到OpenComm他还是一串口方式打开的。
 
  我们要记录每个设备的信息所以我们需要一个设备类
 
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using RfidService.Common;
 
namespace Rfid
{
      public class RfidDevice
      {
            ///
            /// 开启监听现成
            ///
            private Thread _mThread = null;
 
            ///
            /// 暂停事件
            ///
            private readonly ManualResetEvent _mManualReset = null;
 
            ///
            /// 串口号
            ///
            private readonly int _comNo = 0;
 
            ///
            /// 时间间隔
            ///
            private readonly int _timeTick = 0;
 
            ///
            /// 是否多卡读取
            ///
            private bool _multiFlag = false;
 
            ///
            /// RFID数据
            ///
            private readonly List _data = new List();
 
            ///
            /// 数据锁
            ///
            private readonly object _dataLock = new object();
 
            ///
            /// 错误数量
            ///
            private int _errorCount = 0;
 
            ///
            /// 只读 串口号
            ///
            public int ComNo 
            { 
                  get
                  { 
                        return _comNo; 
                  } 
            }
 
            ///
            /// 串口句柄
            ///
            public IntPtr ComHadle { set; get; }
 
            ///
            /// 只读 时间间隔 毫秒级 
            ///
            public int TimeTick 
            {
                  get
                  {
                        return _timeTick;
                  }
            }
 
            ///
            /// 是否多卡标志
            ///
            public bool MultiFlag { set { _multiFlag = value; } get { return _multiFlag; } }
 
            ///
            /// 暂停读取标志
            ///
            public bool StopReadFlag { set; get; }
 
            ///
            /// 出入串口
            ///
            public PassCom PassCom { set; get; }
 
            ///
            /// 构造函数
            ///
            ///
            ///
            public RfidDevice(int comNo,int sleepTime)
            {
                  _comNo = comNo;
                  _timeTick = sleepTime;
                  _mManualReset = new ManualResetEvent(true);
                  ComHadle = EPCSDKHelper.OpenComm(_comNo);
                  if (ComHadle == new IntPtr())
                  {
                        //输出系统日志
                        //throw new Exception("打开串口失败!");
 
                        LogInfo.Error("打开串口:" + comNo + "失败!" );
                  }
            }
 
            ///
            /// 构造函数
            ///
            ///
            ///
            ///
            public RfidDevice(int comNo, int sleepTime,bool multiFlag)
            {
                  _comNo = comNo;
                  _timeTick = sleepTime;
                  MultiFlag = multiFlag;
                  _mManualReset = new ManualResetEvent(true);
                  ComHadle = EPCSDKHelper.OpenComm(_comNo);
                  if (ComHadle == new IntPtr())
                  {
                        //输出系统日志
                        //throw new Exception("打开串口失败!");
                        LogInfo.Error("打开串口:" + comNo + "失败!");
                  }
            }
 
            ///
            /// 构造函数
            ///
            ///
            ///
            ///
            ///
            public RfidDevice(int comNo, int sleepTime, bool multiFlag,PassCom passCom)
            {
                  _comNo = comNo;
                  _timeTick = sleepTime;
                  _multiFlag = multiFlag;
                  MultiFlag = multiFlag;
                  _mManualReset = new ManualResetEvent(true);
                  this.PassCom = passCom;
                  ComHadle = EPCSDKHelper.OpenComm(_comNo);
#if DEBUG
                  Console.WriteLine("串口号:" + this.ComNo.ToString() + " - " + ComHadle.ToString());
#endif
                  if (ComHadle == new IntPtr())
                  {
                        //输出系统日志
                        //throw new Exception("打开串口失败!");
                        LogInfo.Error("打开串口:" + comNo + "失败!");
                  }
            }
 
            ///
            /// 关闭串口
            ///
            public void CloseComm()
            {
                  EPCSDKHelper.CloseComm(this.ComHadle);
                  LogInfo.Info("关闭串口:" + this.ComNo );
            }
             
            ///
            /// 开始读取
            ///
            public void Start()
            {
                  if (_mThread != null) return;
                  _mThread = new Thread(GetRfidTag) {IsBackground = true};
                  _mThread.Start();
            }
 
            ///
            /// 暂停
            ///
            public void ReStart()
            {
                  _mManualReset.Set();
            }
 
            ///
            /// 继续
            ///
            public void Stop()
            {
                  _mManualReset.Reset();
            }
 
            ///
            /// 获取RFID标签现成
            ///
            private void GetRfidTag()
            {
                  while(true)
                  {
                        GcCollect();
                        try
                        {
                              Monitor.Enter(this._dataLock);
                              _mManualReset.WaitOne();
                              byte[] ids;
                              byte[] devNos;
                              byte[] antennaNos;
                              if (this._multiFlag)
                              {
                                    ids = new byte[12 * 200];
                                    devNos = new byte[200];
                                    antennaNos = new byte[200];
                                    //处理多卡读取模式
                                    byte idNum = 0;
                                    if (EPCSDKHelper.IdentifyUploadedMultiTag s(this.ComHadle, out idNum, ids, devNos, antennaNos))
                                    {
                                          _errorCount = 0;
                                          var tmpids = new byte[idNum * 12];
                                          Array.Copy(ids, 0, tmpids, 0, tmpids.Length);
                                          this._data.Add(tmpids);
#if DEBUG
                                          Console.WriteLine("串口号:"+this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " - 02 - " + TextEncoder.ByteArrayToHexString(ids));
                                          LogInfo.Info("串口号:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " - 02 - " + TextEncoder.ByteArrayToHexString(ids));
#endif
                                    }
                              }
                              else
                              {
                                    ids = new byte[12];
                                    devNos = new byte[1];
                                    antennaNos = new byte[1];
                                    //处理单卡读取模式
                                    if (EPCSDKHelper.IdentifyUploadedSingleTa g(this.ComHadle, ids, devNos, antennaNos))
                                    {
                                          _errorCount = 0;
                                          this._data.Add(ids);
#if DEBUG
                                          Console.WriteLine("串口号:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " - 01 - " + TextEncoder.ByteArrayToHexString(ids));
                                          LogInfo.Info("串口号:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " - 01 - " + TextEncoder.ByteArrayToHexString(ids));
#endif
                                    }
                              }
                        }
                        catch (Exception er)
                        {
#if DEBUG
                              Console.WriteLine("串口号:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " Error: " + er.Message);
                              LogInfo.Error("串口号:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " Error: " + er.Message);
#endif
                              _errorCount++;
                              if (_errorCount > 10)
                              {
                                    //设备复位
                              }
                        }
                        finally
                        {
                              Monitor.Exit(this._dataLock);
                        }
                        Thread.Sleep(this._timeTick);
                  }
            }
 
            ///
            /// 获取RFID数据标签
            ///
            ///
            public IList GetData()
            {
                  try
                  {
                        Monitor.Enter(this._dataLock);
                        GC.WaitForPendingFinalizers ();
                        GC.Collect();
                        GC.WaitForPendingFinalizers ();
                        var tmpData = new List();
                        tmpData.AddRange(_data);
                        _data.Clear();
#if DEBUG
                        Console.WriteLine("串口号:" + this.ComNo.ToString() + " - " + "_tmpData:" + tmpData.Count + "   _data:" + _data.Count);
                        LogInfo.Info("串口号:" + this.ComNo.ToString() + " - " + "_tmpData:" + tmpData.Count + "   _data:" + _data.Count);
#endif
                        return tmpData;
                  }
                  finally
                  {
                        Monitor.Exit(this._dataLock);
                  }
            }
 
            ///
            /// 数据回收
            ///
            private static void GcCollect()
            {
                  GC.WaitForFullGCComplete();
                  GC.Collect();
                  GC.WaitForFullGCComplete();
            }
 
      }
}
  当然我们还需要一个设备管理类作为设备的监管。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RfidService;
using System.Diagnostics;
using System.Threading;
using RfidService.Common;
 
namespace Rfid
{
      public class RfidDevices : IDisposable
      {
            ///
            /// RFID设备集合
            ///
            private IList _lstRfidDevice = new List();
            private readonly RfidDataContext _oRfidDataContext = new RfidDataContext();
            ///
            /// 添加RFID设备
            ///
            ///
            public void Add(RfidDevice rfidDevice)
            {
                  this._lstRfidDevice.Add(rfidDevice);
            }
 
            ///
            /// 移除RFID设备
            ///
            ///
            public void Remove(RfidDevice rfidDevice)
            {
                  foreach (var o in _lstRfidDevice.Where(o => o.ComHadle == rfidDevice.ComHadle &&
                                                                                    o.ComNo == rfidDevice.ComNo))
                  {
                        _lstRfidDevice.Remove(o);
                        break;
                  }
            }
 
            public void DeviceClose()
            {
                  foreach (var o in _lstRfidDevice)
                  {
                        try
                        {
                              o.CloseComm();
                        }
                        catch(Exception er)
                        {
                              LogInfo.Error("设备监听关闭失败:" + o.ComNo);
                              LogInfo.Error("设备监听关闭失败:" + er.Message);
                        }
                  }
            }
 
            public IList GetDevices()
            {
                  return _lstRfidDevice;
            }
 
            readonly object _oLock = new object();
            ///
            /// 获取所有设备数据
            ///
            ///
            public void GetData()
            {
                  try
                  {
                        Monitor.Enter(_oLock);
                        var sw = new Stopwatch();
                        sw.Start();
                        var lstByteArray = new List();
                        var serviceDateTime = DateTime.Now;
                        foreach (var o in _lstRfidDevice)
                        {
                              try
                              {
                                    var lstByt = o.GetData(); 
                                    foreach (var byt in lstByt)
                                    {
                                          for (var i = 0; i < byt.Length; i = i + 12)
                                          {
                                                var buffer = new byte[4]; 
                                                GcCollect();
                                                Array.Copy(byt, i + 8, buffer, 0, 4);
                                                var id = ((buffer[0]) + (buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 32)).ToString();
                                                //处理自己的业务把
                                          }
                                    }
    
                              }
                              catch (Exception er)
                              {
                                    Console.WriteLine(er.Message + "\t\n" + er.StackTrace.ToString());
                                    LogInfo.Info(er.Message);
                                    LogInfo.Info(er.StackTrace.ToString());
                              }
                        }
                        sw.Stop();
                        Console.WriteLine("操作 数据库执行时间:" + sw.ElapsedMilliseconds.ToString());
                        LogInfo.Info("操作数据库执行时间:"   + sw.ElapsedMilliseconds.ToString());
                  }
                  finally
                  {
                        Monitor.Exit(_oLock);
                  }
            }
 
            public void Dispose()
            {
                  _lstRfidDevice.Clear();
                  _lstRfidDevice = null;
                  GcCollect();
            }
 
            public void GcCollect()
            {
                  GC.WaitForPendingFinalizers ();
                  GC.Collect();
                  GC.WaitForPendingFinalizers ();
            }
      }

}


关注微信号:zhilin_yu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勿在浮沙筑高台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值