using ReaderB;
using System.Text;
namespace UHFHelper
{
public class UHFCardHelper
{
///
/// 单例模式
///
private static UHFCardHelper? Instance { get; set; }
private UHFCardHelper()
{
}
public static UHFCardHelper GetInstance()
{
if (Instance == null)
{
Instance = new UHFCardHelper();
}
return Instance;
}
//当前操作的ComAdr
private byte fComAdr = 0xff;
//返回串口的索引号
private int frmcomportindex;
///
/// 打开的COM口号
///
public int OpenComNo { get; set; }
//所有执行指令的返回值
private int fCmdRet { get; set; } = 30;
///
/// 串口打开标示
///
public bool ComOpen { get; set; } = false;
///
/// 密码
///
private byte[] fPassWord = new byte[4];
///
/// 错误码
///
private int ferrorcode;
//定义Timer类
private System.Timers.Timer timer;
//定义委托
public delegate void SetControlValue(string value);
private void InitTimer()
{
int interval = 1000;
timer = new System.Timers.Timer(interval);
timer.AutoReset = true;
timer.Enabled = true;
//绑定事件,每隔一秒执行一次此方法
timer.Elapsed += new System.Timers.ElapsedEventHandler(MyMethod);
}
private void MyMethod(object sender, System.Timers.ElapsedEventArgs e)
{
//TODO 持续扫码
}
///
/// 打开串口
///
///
public Resultoutput OpenPort()
{
int port = 0;
int openresult;
fComAdr = Convert.ToByte("FF", 16); // $FF;
try
{
openresult = StaticClassReaderB.AutoOpenComPort(ref port, ref fComAdr, 5, ref frmcomportindex);
OpenComNo = frmcomportindex;
if (openresult == 0)
{
ComOpen = true;
//自动执行读取写卡器信息
byte[] TrType = new byte[2];
byte[] VersionInfo = new byte[2];
byte ReaderType = 0;
byte ScanTime = 0;
byte dmaxfre = 0;
byte dminfre = 0;
byte powerdBm = 0;
fCmdRet = StaticClassReaderB.GetReaderInformation(ref fComAdr, VersionInfo, ref ReaderType, TrType, ref dmaxfre, ref dminfre, ref powerdBm, ref ScanTime, frmcomportindex);
if ((fCmdRet == 0x35) | (fCmdRet == 0x30))
{
StaticClassReaderB.CloseSpecComPort(frmcomportindex);
ComOpen = false;
return new Resultoutput { Res = false, ResMes = "串口通讯错误" };
}
if ((OpenComNo == -1) && (openresult == 0x30))
{
return new Resultoutput { Res = false, ResMes = "串口通讯错误" };
}
}
}
catch (Exception ex)
{
return new Resultoutput { Res = false, ResMes = ex.ToString() };
}
ComOpen = true;
//var result = WorkMode();
//if (!result.Res)
//{
// return result;
//}
return new Resultoutput { Res = true, ResMes = "串口打开成功" };
}
///
/// 关闭串口
///
///
public Resultoutput ClosePort()
{
fCmdRet = StaticClassReaderB.CloseSpecComPort(OpenComNo);
if (fCmdRet == 0)
{
ComOpen = false;
}
else
{
return new Resultoutput { Res = false, ResMes = "串口关闭失败" };
}
return new Resultoutput { Res = true, ResMes = "串口关闭成功" };
}
///
/// 设置工作模式
///
public Resultoutput WorkMode()
{
byte[] Parameter = new byte[6];
//应答模式
Parameter[0] = Convert.ToByte(0);
//工作模式 EPCC1 ISO18000-6B
int Reader_bit0 = 0;
//输出模式
int Reader_bit1 = 0;
//蜂鸣开关
int Reader_bit2 = 1;
//起始地址
int Reader_bit3 = 0;
//是否SYRIS485输出
int Reader_bit4 = 0;
Parameter[1] = Convert.ToByte(Reader_bit0 * 1 + Reader_bit1 * 2 + Reader_bit2 * 4 + Reader_bit3 * 8 + Reader_bit4 * 16);
//存储区 EPC区
Parameter[2] = 1;
//起始字地址(Hex)
Parameter[3] = Convert.ToByte("02", 16);
//读取字数
Parameter[4] = Convert.ToByte(1);
//单张标签过滤时间
Parameter[5] = Convert.ToByte(0);
//设置工作模式
fCmdRet = StaticClassReaderB.SetWorkMode(ref fComAdr, Parameter, frmcomportindex);
if (fCmdRet == 0)
{
return new Resultoutput { Res = true, ResMes = "工作模式设置成功" };
}
return new Resultoutput { Res = false, ResMes = "读卡失败" };
}
///
/// 读卡
///
///
public string ReadCard()
{
if (!ComOpen) return string.Empty;
int CardNum = 0;
int Totallen = 0;
int EPClen, m;
byte[] EPC = new byte[5000];
string temps;
string sEPC;
//fIsInventoryScan = true;
byte AdrTID = 0;
byte LenTID = 0;
byte TIDFlag = 0;
AdrTID = 0;
LenTID = 0;
TIDFlag = 0;
fCmdRet = StaticClassReaderB.Inventory_G2(ref fComAdr, AdrTID, LenTID, TIDFlag, EPC, ref Totallen, ref CardNum, frmcomportindex);
if ((fCmdRet == 1) | (fCmdRet == 2) | (fCmdRet == 3) | (fCmdRet == 4) | (fCmdRet == 0xFB))//代表已查找结束,
{
byte[] daw = new byte[Totallen];
Array.Copy(EPC, daw, Totallen);
temps = ByteArrayToHexString(daw);
m = 0;
if (CardNum == 0)
{
return "";
}
for (int CardIndex = 0; CardIndex < CardNum; CardIndex++)
{
EPClen = daw[m];
sEPC = temps.Substring(m * 2 + 2, EPClen * 2);
m = m + EPClen + 1;
if (sEPC.Length != EPClen * 2)
{
return "";
}
string cardcode = sEPC.Substring(1, sEPC.Length - 1);
return cardcode;
}
}
return "";
}
///
/// 写卡
///
///
public Resultoutput WriteCard(string CardCodeStr)
{
if (!ComOpen) return new Resultoutput() { ResMes = "设备未连接", Res = false };
byte[] WriteEPC = new byte[100];
byte WriteEPClen;
byte ENum;
string AccessCode = "00000000";
try
{
string CardCode = CardCodeStr;
if ((CardCode.Length % 4) != 0)
{
CardCode = "0" + CardCodeStr;
}
WriteEPClen = Convert.ToByte(CardCode.Length / 2);
ENum = Convert.ToByte(CardCode.Length / 4);
byte[] EPC = new byte[ENum];
EPC = HexStringToByteArray(CardCode);
fPassWord = HexStringToByteArray(AccessCode);
fCmdRet = StaticClassReaderB.WriteEPC_G2(ref fComAdr, fPassWord, EPC, WriteEPClen, ref ferrorcode, frmcomportindex);
if (fCmdRet == 0)
{
return new Resultoutput { Res = true, ResMes = "写卡成功!" };
}
else
{
return new Resultoutput { Res = false, ResMes = "写卡失败!错误码:" + ferrorcode };
}
}
catch (Exception ex)
{
return new Resultoutput { Res = false, ResMes = "写卡失败" + ex.Message };
}
}
///
/// 解析数据
///
///
///
private byte[] HexStringToByteArray(string s)
{
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
return buffer;
}
///
/// 解析数据
///
///
///
private string ByteArrayToHexString(byte[] data)
{
StringBuilder sb = new(data.Length * 3);
foreach (byte b in data)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
return sb.ToString().ToUpper();
}
///
/// 字符串转16进制
///
///
///
public string ToEncode16(string strEncode)
{
byte[] b = Encoding.UTF8.GetBytes(strEncode);//按照指定编码将string编程字节数组
string result = string.Empty;
for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符
{
result += Convert.ToString(b[i], 16);
}
return result;
}
///
/// 16进制转字符串
///
///
///
public string ToEncodeString(string strDecode)
{
string strTemp = "";
byte[] b = new byte[strDecode.Length / 2];
for (int i = 0; i < strDecode.Length / 2; i++)
{
strTemp = strDecode.Substring(i * 2, 2);
b[i] = Convert.ToByte(strTemp, 16);
}
//按照指定编码将字节数组变为字符串
return Encoding.UTF8.GetString(b);
}
}
}