using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace POSV.Utils { public class CardOperateUtils { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private int _mifare_handle = 0; private const int TIMER_INTERVAL = 1000; private static CardOperateUtils _instance = null; private bool _termination = false; private bool _isUsing = false; public static CardOperateUtils Instance { get { if(_instance == null) { _instance = new CardOperateUtils(); } return _instance; } } /// /// 中止 /// public void TerminationCardRead() { if (_isUsing) { _termination = true; } } public void InitReader() { InitReader(0, 9600); } /// /// 初始化 /// /// public void InitReader(short port, int baud) { if(_mifare_handle == 0) { _mifare_handle = MifareCardUtils.Init(port, baud); } } /// /// 自动初始化单次读卡 /// /// public Tuple ReadCardNo() { InitReader(); return ReadCardNo(true); } public Tuple ReadCardNoContinue() { if (_isUsing) { return new Tuple(false, "正在读卡,请稍后重试!"); } _isUsing = true; _termination = false; Tuple result = new Tuple(false, "读卡失败"); try { InitReader(); if (_mifare_handle > 0) { var res = ReadCardNo(false); if (res.Item1) { result = res; } } else { result = new Tuple(false, "读卡器打开失败!"); } } catch(Exception ex) { logger.Error(ex, "持续读卡发生异常"); result = new Tuple(false, "读卡发生异常!"); } finally { CloseCardReader(); _termination = false; _isUsing = false; } return result; } /// /// 单次读卡 初始化读卡器 - 读卡 - 关闭读卡器 /// /// /// public Tuple ReadCardNo(bool autoClose) { try { if (_mifare_handle > 0) { logger.Info("读卡器连接成功! 开始寻找会员卡!"); Tuple status = MifareCardUtils.Card(_mifare_handle); if (status.Item1 == 0) { logger.Info("检测到会员卡"); //开始读卡 Tuple data31 = MifareCardUtils.Read(_mifare_handle, 0, 0, 1); //卡号第一部分 Tuple data1 = MifareCardUtils.Read(_mifare_handle, 0, 1, 0); //卡号第二部分 Tuple data2 = MifareCardUtils.Read(_mifare_handle, 0, 1, 1); if (data31.Item1 == 0 && data1.Item1 == 0 && data2.Item1 == 0) { var cardNo = data1.Item2 + data2.Item2; logger.Info("读卡成功!卡号为[{0}]", cardNo); //是否蜂鸣 MifareCardUtils.Beep(_mifare_handle, 25); MifareCardUtils.Halt(_mifare_handle); return new Tuple(true, cardNo.Replace("\0", "")); } else { MifareCardUtils.Halt(_mifare_handle); return new Tuple(false, "读卡失败,请移开后重试"); } } else { return new Tuple(false, "请将会员卡放置在读卡区"); } } else { return new Tuple(false, "读卡器连接失败!"); } } catch(Exception ex) { logger.Error(ex, "读卡发生异常"); return new Tuple(false, "读卡发生异常"); } finally { if (autoClose) CloseCardReader(); } } /// /// 关闭读卡器 /// /// public void CloseCardReader() { try { logger.Info("关闭读卡器!"); if (_mifare_handle > 0) { int status = MifareCardUtils.Exit(_mifare_handle); if (status == 0) { logger.Info("断开读卡器连接!"); } else { logger.Info("读卡器连接断开失败:{0}", status); } } else { logger.Info("没有连接读卡器"); } } catch(Exception ex) { logger.Error(ex, "关闭读卡器发生异常!"); } finally { _mifare_handle = 0; } } } }