|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using POSV.Card; //Yao 2023/11/15
|
|
|
|
|
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("检测到会员卡");
|
|
|
|
|
//Yao 2024-04-23 added start
|
|
|
|
|
string reversedString = "";
|
|
|
|
|
for (int i = status.Item2.Length - 2; i >= 0; i -= 2)
|
|
|
|
|
{
|
|
|
|
|
reversedString += status.Item2.Substring(i, 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
long decimalNumber = Convert.ToInt64(reversedString, 16); // 将倒序后的16进制字符串转换为10进制数
|
|
|
|
|
string realCardNo = decimalNumber.ToString();
|
|
|
|
|
//Yao 2024-04-23 added end
|
|
|
|
|
|
|
|
|
|
//开始读卡
|
|
|
|
|
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) || realCardNo != "")//Yao 2024-04-23 modify
|
|
|
|
|
{
|
|
|
|
|
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, realCardNo);//Yao 2024-04-23 modify
|
|
|
|
|
//return new Tuple<bool, string>(true, "373301" + realCardNo);//Yao 2024-04-23 modify
|
|
|
|
|
//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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|