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#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|