You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
6.4 KiB
C#

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;
}
}
/// <summary>
/// 中止
/// </summary>
public void TerminationCardRead()
{
if (_isUsing)
{
_termination = true;
}
}
public void InitReader()
{
InitReader(0, 9600);
}
/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
public void InitReader(short port, int baud)
{
if(_mifare_handle == 0)
{
_mifare_handle = MifareCardUtils.Init(port, baud);
}
}
/// <summary>
/// 自动初始化单次读卡
/// </summary>
/// <returns></returns>
public Tuple<bool, string> ReadCardNo()
{
InitReader();
return ReadCardNo(true);
}
public Tuple<bool, string> ReadCardNoContinue()
{
if (_isUsing)
{
return new Tuple<bool, string>(false, "正在读卡,请稍后重试!");
}
_isUsing = true;
_termination = false;
Tuple<bool, string> result = new Tuple<bool, string>(false, "读卡失败");
try
{
InitReader();
if (_mifare_handle > 0)
{
var res = ReadCardNo(false);
if (res.Item1)
{
result = res;
}
}
else
{
result = new Tuple<bool, string>(false, "读卡器打开失败!");
}
}
catch(Exception ex)
{
logger.Error(ex, "持续读卡发生异常");
result = new Tuple<bool, string>(false, "读卡发生异常!");
}
finally
{
CloseCardReader();
_termination = false;
_isUsing = false;
}
return result;
}
/// <summary>
/// 单次读卡 初始化读卡器 - 读卡 - 关闭读卡器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public Tuple<bool, string> ReadCardNo(bool autoClose)
{
try
{
if (_mifare_handle > 0)
{
logger.Info("读卡器连接成功! 开始寻找会员卡!");
Tuple<int, string> status = MifareCardUtils.Card(_mifare_handle);
if (status.Item1 == 0)
{
logger.Info("检测到会员卡");
//开始读卡
Tuple<int, string> data31 = MifareCardUtils.Read(_mifare_handle, 0, 0, 1);
//卡号第一部分
Tuple<int, string> data1 = MifareCardUtils.Read(_mifare_handle, 0, 1, 0);
//卡号第二部分
Tuple<int, string> 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<bool, string>(true, cardNo.Replace("\0", ""));
}
else
{
MifareCardUtils.Halt(_mifare_handle);
return new Tuple<bool, string>(false, "读卡失败,请移开后重试");
}
}
else
{
return new Tuple<bool, string>(false, "请将会员卡放置在读卡区");
}
}
else
{
return new Tuple<bool, string>(false, "读卡器连接失败!");
}
}
catch(Exception ex)
{
logger.Error(ex, "读卡发生异常");
return new Tuple<bool, string>(false, "读卡发生异常");
}
finally
{
if (autoClose) CloseCardReader();
}
}
/// <summary>
/// 关闭读卡器
/// </summary>
/// <param name="mifare_handle"></param>
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;
}
}
}
}