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.
Aucma.Scada/HighWayIot.Rfid/Impl/RFLY_I160ADAPTER.CS

1487 lines
63 KiB
Plaintext

using GRreader;
using HighWayIot.Common;
using HighWayIot.Log4net;
using HighWayIot.Rfid;
using HighWayIot.Rfid.Dto;
using HighWayIot.Rfid.Impl;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace MaterialTraceability.Rfid.Impl
{
[ClassInterface(ClassInterfaceType.None)]
public class RFly_I160Adapter : IDeviceAdapter
{
private LogHelper log = LogHelper.Instance;
private StringChange stringChange = StringChange.Instance;
private JsonChange jsonChange = JsonChange.Instance;
#region 全局变量声明
List<TagInfo> m_TagInfoList = new List<TagInfo>();
CommType gConnetType = new CommType();
private DeviceType m_iDeviceType = DeviceType.RFly_I160;
private DeviceType DeviceType;
ICommunicateService m_ICommunicateService = null;
public UHFreader MyReader = new UHFreader();
public event RecvIdentifyData RecvIdentifyDataEvent = null;
public UInt16 m_iDeviceId = 0;
private string m_strIp; //读写器IP或串口号
private int m_iPort; //读写器端口号或波特率
private readonly string m_ReadDbm = "10";
private readonly string m_WriteDbm = "10";
private readonly string m_AnalysisFlag = "1"; //1按照次数最多返回条码2按照平均功率最大返回条码
private int m_ConnectFlag = 0;
//private Mutex mut = new Mutex();
private ManualResetEvent BeginEvent = new ManualResetEvent(true);
public bool TagInventory_Lable = true;//连续盘点标签标志
private Semaphore m_GlobalSem = new Semaphore(1, 1);
private bool m_GetHeartSuccessful = false;
private Semaphore m_GetHeartSem = new Semaphore(0, 100000);
private Semaphore m_MulEpcSem = new Semaphore(0, 100000);
private Semaphore m_StopSem = new Semaphore(0, 100000);
private bool m_OneEpcSemSuccessful = false;
private Semaphore m_OneEpcSem = new Semaphore(0, 100000);
private bool m_ReadDataSuccessful = false;
private bool m_Device_ReadSuccessful = false;
private byte m_ReadDataLen = 0;
private byte[] m_ReadData = null;
private Semaphore m_ReadSem = new Semaphore(0, 100000);
private Semaphore m_WriteSem = new Semaphore(0, 100000);
private int m_BarcodeGroupCount = 0;
private byte[] m_MulAllData = null;
private byte[] m_AutoReadEPC = null;
private int m_readEPCDataLen = 0;
private byte m_OneEpcDataLen = 0;
private byte m_OneEpcAntenna = 254;
private byte[] m_OneEpcData = null;
private bool m_GetReadNoDataSuccessful;
private bool writeResult = false;
#endregion
public int AutoReport
{
get { return AutoReport; }
set { AutoReport = value; }
}
public int Filter
{
get { return Filter; }
set { Filter = value; }
}
#region 设备连接部分
public bool Device_Init(CommType iCommType, string pUrl, DeviceType iDeviceType)
{
try
{
m_iDeviceType = iDeviceType;
//LogService.Instance.Debug("函数调用:Device_Init Start: ");
//if (iDeviceType == DeviceType.Mesnac_GRUV100)
{
if (iCommType == CommType.RJ45) //网口
{
if (m_ICommunicateService == null)
{
m_ICommunicateService = new BgTcpClient();
}
string[] split = pUrl.Split(new Char[] { ':' });
m_strIp = split[0];
string strTemp = split[1];
m_iPort = Convert.ToInt32(strTemp);
m_ICommunicateService.Init(m_strIp, m_iPort, this);
log.RfidLog("设备初始化成功IP" + m_strIp + "端口号:" + m_iPort);
}
else //串口,代用串口号和波特率
{
if (m_ICommunicateService == null)
{
return false;
}
string[] split = pUrl.Split(new Char[] { ':' });
m_strIp = split[0];
string strTemp = split[1];
m_iPort = Convert.ToInt32(strTemp);
m_ICommunicateService.Init(m_strIp, m_iPort, this);
log.RfidLog("设备初始化成功,串口号:" + m_strIp + "波特率:" + m_iPort);
}
}
}
catch (Exception ex)
{
log.Error("连接读写器异常:", ex);
return false;
}
return true;
}
public bool Device_Init_Id(CommType iCommType, string pUrl, ushort iDeviceId)
{
m_iDeviceId = iDeviceId;
Device_Init(iCommType, pUrl, (DeviceType)1);
return true;
}
public bool Device_Connect()
{
try
{
if (m_ICommunicateService != null)
{
if (m_ICommunicateService.Connect())
{
log.RfidLog("Device_Connect:连接成功");
return true;
}
else
{
log.RfidLog("Device_Connect:连接失败");
return false;
}
}
else
{
return false;
}
}
catch (Exception ex)
{
log.Error("Device_Connect异常", ex);
return false;
}
}
public void Device_Destroy()
{
m_ICommunicateService.DisConnect();
}
public bool Device_GetState()
{
return m_ICommunicateService.GetState();
}
public bool Device_ReConnect()
{
log.RfidLog("Device_Connect 调用重连函数!");
return Device_Connect();
}
#endregion
public bool Device_DealValidPack(byte[] ValidData)
{
byte bAntana = 0; //读写器天线号 默认0x04
UInt16 iReadCount = 0; //标签读取次数
UInt16 iRSSI = 0; //标签信号强度
byte[] bResultEPC_Data = new byte[14];
byte[] bNoData = new byte[12];
try
{
byte info = ValidData[3];
switch (info) //心跳
{
case 0X90:
m_GetHeartSuccessful = true;
Console.WriteLine("Device_DealValidPack处理函数" + stringChange.bytesToHexStr(ValidData, ValidData.Length));
try
{
log.SemaphoreLog("信号量m_GetHeartSem释放");
m_GetHeartSem.Release();
}
catch (Exception ex)
{
log.Error("心跳信号量处理异常", ex);
log.SemaphoreLog("信号量m_GetHeartSem释放异常" + ex.Message);
}
break;
case 0x02:
if (ValidData[2] == 0x00 || ValidData[2] == 0x01)
{
log.RfidLog("----函数调用:Device_DealValidPackNoRead!");
m_BarcodeGroupCount = 0;
m_GetReadNoDataSuccessful = true;
m_OneEpcDataLen = 0;
}
else
{
log.RfidLog("----函数调用:Device_DealValidPack 有数据!");
m_BarcodeGroupCount = Convert.ToInt32(ValidData[5].ToString()); //标签组数TagCount
m_MulAllData = new byte[ValidData.Length];
Array.Clear(m_MulAllData, 0, ValidData.Length);
Array.Copy(ValidData, 0, m_MulAllData, 0, ValidData.Length);
Array.Copy(m_MulAllData, 11, bResultEPC_Data, 0, 14);
m_ReadDataLen = 14;
m_OneEpcDataLen = 14;
m_OneEpcData = new byte[m_OneEpcDataLen];
bAntana = ValidData[8];
m_OneEpcAntenna = ValidData[8];
iReadCount = ValidData[6];
iRSSI = ValidData[7];
//DeviceType 改为 m_iDeviceType原代码为DeviceType,因测试一体机没有赋值改为m_iDeviceType
//四通道读写器业务逻辑
if (DeviceType == DeviceType.Mesnac_GRUR445)
{
m_TagInfoList = Device_DealTagInfoList2(m_MulAllData);
}
else
{
m_TagInfoList = Device_AutoDealContent(m_MulAllData);
}
//m_OneEpcSem.Release();
//m_ReadSem.Release();
//log.RfidLog("----有数据,释放信号量!");
}
try
{
log.SemaphoreLog("信号量m_OneEpcSem释放");
m_OneEpcSem.Release();
//log.SemaphoreLog("信号量m_GlobalSem释放");
//m_GlobalSem.Release();
}
catch (Exception e)
{
log.Error("释放信号量错误!" + e.ToString());
log.SemaphoreLog("释放信号量错误:" + e.Message);
}
break;
default:
log.RfidLog("Device_DealValidPack处理函数" + stringChange.bytesToHexStr(ValidData, ValidData.Length));
Console.WriteLine("Device_DealValidPack处理函数" + stringChange.bytesToHexStr(ValidData, ValidData.Length));
break;
}
}
catch (Exception ex)
{
log.Error("空间名:" + ex.Source + "" + '\n' +
"方法名:" + ex.TargetSite + '\n' +
"故障点:" + ex.StackTrace.Substring(ex.StackTrace.LastIndexOf("\\") + 1, ex.StackTrace.Length - ex.StackTrace.LastIndexOf("\\") - 1) + '\n' +
"错误提示:", ex);
return false;
}
return true;
}
public byte Device_SendHeartPack()
{
byte iResult = 0;
try
{
log.RfidLog("函数调用:Device_SendHeartPack");
//m_GlobalSem.WaitOne(-1, false);
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[9];
Array.Clear(pMessagePack.m_pData, 0, 1);//清空为0
//获取温度
pMessagePack.m_pData[0] = 0xAA;
pMessagePack.m_pData[1] = 0x55;
pMessagePack.m_pData[2] = 0x00;
pMessagePack.m_pData[3] = 0x90;
pMessagePack.m_pData[4] = 0x90;
pMessagePack.m_pData[5] = 0x0D;
m_GetHeartSem.WaitOne(1, false);
log.SemaphoreLog("信号量m_GetHeartSemWaitOne(1, false)");
if (m_ICommunicateService != null)
{
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
log.SemaphoreLog("信号量m_GetHeartSemWaitOne(9000, false)");
if (m_GetHeartSem.WaitOne(5000, false)) //等待结果,并取结果返回。
{
if (m_GetHeartSuccessful)
{
//log.RfidLog("发送心跳正常。");
iResult = 1; //通讯连接和读写器都正常
}
}
else //超时
{
log.SemaphoreLog("信号量m_GetHeartSem发送心跳超时");
log.RfidLog("发送心跳超时。");
iResult = 2; //通讯连接器正常,读写器故障
};
}
else
{
//通讯连接器失败或网络故障
log.RfidLog("发送心跳报文失败,通讯故障。");
iResult = 3;
}
}
else
{
//m_GetHeartSem.Release();
return 3;
}
}
catch (Exception ex)
{
log.RfidLog("Device_SendHeartPack" + ex.Message);
iResult = 3;
}
finally
{
//m_GlobalSem.Release();
//m_GetHeartSem.Release();
}
return iResult;
}
public ushort Device_GetReportData(ref byte[] pReadData, Byte Antenna, UInt32 Timedout)
{
byte[] pTemp = null;
byte iReadLen = 0;
if ((iReadLen = Device_GetOneIdentifyData(ref pTemp, Antenna, (UInt16)Timedout)) > 0)
{
// log.RfidLog("Device_GetReportData获取自报数据" + "数据长度" + iReadLen);
pReadData = new byte[iReadLen + 1];
pReadData[0] = iReadLen;
Array.Copy(pTemp, 0, pReadData, 1, iReadLen);
return (ushort)(iReadLen + 1);
}
else
{
return 0;
}
}
/// <summary>
/// 根据天线号识别单个标签EPC数据只返回读到的第一条数据
/// </summary>
/// <returns>识别的标签EPC长度0为识别失败</returns>
/// <param name="pReadData">识别到的数据缓存区</param>
/// <param name="Antenna">天线号0为本机255为所有天线</param>
/// <param name="Timedout">超时时间,单位毫秒,识别到立即返回,未识别到等待超时返回</param>
public Byte Device_GetOneIdentifyData(ref Byte[] pReadData, Byte Antenna, UInt16 Timedout)
{
byte[] u16byte = new byte[2];
byte iResult = 0;
byte[] bCRC = new byte[4];
try
{
m_GlobalSem.WaitOne(1, false);
//log.RfidLog("函数调用:Device_GetOneIdentifyData");
if (Antenna == 0) //此版本4为主机
{
Antenna = (byte)(Antenna + 1);
}
MessagePack pMessagePack = new MessagePack();
//A5 5A 00 0A 80 00 64 EE 0D 0A //100毫秒的示例
pMessagePack.m_pData = new byte[8];
pMessagePack.m_pData[0] = 0xAA;
pMessagePack.m_pData[1] = 0x55;
pMessagePack.m_pData[2] = 0x02;
pMessagePack.m_pData[3] = 0x02;
//pMessagePack.m_pData[4] = 0x03;
//pMessagePack.m_pData[5] = 0xE8;
u16byte = BitConverter.GetBytes(Timedout); //超时时间
u16byte = stringChange.Swap16Bytes(u16byte); //协议里为大端在前
//log.RfidLog("u16byte" + u16byte);
Array.Copy(u16byte, 0, pMessagePack.m_pData, 4, 2);
Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 4);
pMessagePack.m_pData[6] = stringChange.CalculateVerify(bCRC, bCRC.Length);
pMessagePack.m_pData[7] = 0x0D;
//log.RfidLog("pMessagePack.m_pData" + pMessagePack.m_pData);
//int i = m_OneEpcSem.Release(1);
m_OneEpcSem.WaitOne(1, false);
m_OneEpcDataLen = 0;
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
m_ReadDataSuccessful = true;
if (m_OneEpcSem.WaitOne(Timedout + 1000, false)) //等待结果,并取结果返回。
{
if ((m_OneEpcDataLen > 0 && m_OneEpcAntenna == Antenna)) //有数据,正常
{
pReadData = new byte[14];
Array.Copy(m_AutoReadEPC, 0, pReadData, 0, 14);
log.RfidLog("Device_GetOneIdentifyData:" + stringChange.bytesToHexStr(pReadData, pReadData.Length));
iResult = m_OneEpcDataLen;
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
m_ReadDataSuccessful = false;
}
else
{
log.RfidLog("Device_GetOneIdentifyData长度或者天线号不正确");
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
iResult = 0;
m_ReadDataSuccessful = false;
}
}
else //超时
{
iResult = 0;
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
m_ReadDataSuccessful = false;
log.RfidLog("Device_GetOneIdentifyData超时");
}
}
else
{
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
log.RfidLog("Device_GetOneIdentifyData发送识别单条EPC命令失败");
iResult = 0;
m_ReadDataSuccessful = false;
}
}
catch (Exception ex)
{
log.Error("Device_GetOneIdentifyData识别单条EPC数据异常", ex);
iResult = 0;
m_ReadDataSuccessful = false;
}
finally
{
//m_GlobalSem.Release();
}
return iResult;
}
public UInt16 Device_Read(G2MemBank filterMembank, UInt16 filterWordPtr, UInt16 filterWordCnt, Byte[] filterData,
G2MemBank Membank, UInt16 WordPtr, UInt16 WordCnt, ref Byte[] pReadData, byte Antenna)
{
byte[] u16byte = new byte[2];
byte iResult = 0;
try
{
m_GlobalSem.WaitOne(1, false);
log.RfidLog("函数调用:Device_Read");
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[8];
Array.Clear(pMessagePack.m_pData, 0, pMessagePack.m_pData.Length);//清空为0
pMessagePack.m_pData[0] = 0xAA;
pMessagePack.m_pData[1] = 0x55;
pMessagePack.m_pData[2] = 0x02;
pMessagePack.m_pData[3] = 0x02;
pMessagePack.m_pData[4] = 0x03;
pMessagePack.m_pData[5] = 0xE8;
pMessagePack.m_pData[6] = 0xEB;
pMessagePack.m_pData[7] = 0x0D;
//m_ReadSem.Release(1);
m_ReadSem.WaitOne(1, false);
m_ReadDataLen = 0;
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
m_ReadDataSuccessful = true;
if (m_ReadSem.WaitOne(2000, false)) //等待结果,并取结果返回。
{
if (m_ReadDataLen > 0) //有数据,正常
{
pReadData = new byte[m_ReadDataLen];
Array.Copy(m_OneEpcData, 0, pReadData, 0, m_ReadDataLen);
iResult = m_ReadDataLen;
log.RfidLog("Device_Read:" + stringChange.bytesToHexStr(pReadData, pReadData.Length));
m_ReadDataLen = 0;
}
else
{
m_ReadDataLen = 0;
log.RfidLog("Device_Read失败,返回长度为0");
iResult = 0;
}
}
else //超时
{
log.RfidLog("Device_Read失败,超时未返回");
iResult = 0;
}
}
else
{
log.RfidLog("发送读取命令失败");
iResult = 0;
}
}
catch (Exception ex)
{
log.Error("读取数据异常:", ex);
iResult = 0;
}
finally
{
//m_GlobalSem.Release();
}
return iResult;
}
public UInt16 Device_Write(G2MemBank filterMembank, UInt16 filterWordPtr, UInt16 filterWordCnt, Byte[] filterData,
G2MemBank Membank, UInt16 WordPtr, UInt16 WordCnt, Byte[] pWriteData, byte Antenna)
{
byte[] u16byte = new byte[2];
byte iResult = 0;
try
{
m_GlobalSem.WaitOne(1, false);
log.RfidLog("函数调用:Device_Write");
//int datalen = 36+ pWriteData.Length;
int datalen = 48;
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[datalen];
Array.Clear(pMessagePack.m_pData, 0, pMessagePack.m_pData.Length);//清空为0
pMessagePack.m_pData[0] = 0xAA;
pMessagePack.m_pData[1] = 0x55;
pMessagePack.m_pData[2] = (byte)(datalen - 6);//先占位
pMessagePack.m_pData[3] = 0x03;
pMessagePack.m_pData[4] = 0x00;
pMessagePack.m_pData[5] = 0x64;
pMessagePack.m_pData[6] = 0x00;
pMessagePack.m_pData[7] = 0x00;
pMessagePack.m_pData[8] = 0x00;
pMessagePack.m_pData[9] = 0x00;
pMessagePack.m_pData[10] = 0x01;
pMessagePack.m_pData[11] = 0x00;
pMessagePack.m_pData[12] = 0x00;
pMessagePack.m_pData[13] = 0x00;
pMessagePack.m_pData[14] = 0x20;
pMessagePack.m_pData[15] = 0x60;
Array.Copy(filterData, 0, pMessagePack.m_pData, 16, filterData.Length);
pMessagePack.m_pData[28] = 0x03;
pMessagePack.m_pData[29] = 0x00;
pMessagePack.m_pData[30] = 0x00;
pMessagePack.m_pData[31] = 0x00;
pMessagePack.m_pData[32] = 0x00;
pMessagePack.m_pData[33] = (byte)WordCnt;
Array.Copy(pWriteData, 0, pMessagePack.m_pData, 34, pWriteData.Length);
byte[] bCRC = new byte[datalen - 4];
//Array.Copy(u16byte, 0, pMessagePack.m_pData, 4, 2);
Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, bCRC.Length);
pMessagePack.m_pData[datalen - 2] = stringChange.CalculateVerify(bCRC, bCRC.Length);
pMessagePack.m_pData[datalen - 1] = 0x0D;
m_WriteSem.WaitOne(1, false);
m_ReadDataLen = 0;
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
m_ReadDataSuccessful = true;
if (m_WriteSem.WaitOne(2000, false)) //等待结果,并取结果返回。
{
//log.RfidLog("Device_Write成功");
if (writeResult)
{
iResult = 1;
}
}
else //超时
{
log.RfidLog("Device_Write失败,超时未返回");
iResult = 0;
}
}
else
{
log.RfidLog("发送写入命令失败");
iResult = 0;
}
}
catch (Exception ex)
{
log.Error("写入数据异常:", ex);
iResult = 0;
}
finally
{
//m_GlobalSem.Release();
}
return iResult;
}
/// <summary>
/// 返回读写器获取的条码中最好的一条 1:按照读取次数最多返回条码2按照功率最大返回条码
/// </summary>
/// <param name="cBarcodeObjList">要处理的数据</param>
/// <param name="iFlag">1:按照读取次数最多返回条码2按照平均功率最大返回条码</param>
/// <param name="iPrintLogFlag">1:打印log0不打印Log</param>
/// <returns></returns>
public byte[] CommandAnalysisBarcode(List<TagInfo> cBarcodeObjList, int iFlag, int iPrintLogFlag)
{
byte[] tempBarcode = null;
if (iFlag == 1) //按次数最多获取
{
if (iPrintLogFlag == 1)
{
// log.RfidLog("----调用通用函数:CommandAnalysisBarcode Flag=1 按照最大次数选择条码,如果次数相同 ,按照平均功率最大的选择条码:");
}
#region 按照最大次数选择条码,如果次数相同 ,按照平均功率最大的选择条码
#region 求出最大次数
int iOrderMaxCount = cBarcodeObjList[0].Count;
for (int i = 0; i < cBarcodeObjList.Count; i++)
{
if (iPrintLogFlag == 1)
{
#region 打印所有条码 次数和平均功率
log.RfidLog("条码:[ " + stringChange.bytesToHexStr(cBarcodeObjList[i].EPC, cBarcodeObjList[i].EPC.Length) + " ] 次数:[ " + cBarcodeObjList[i].Count.ToString() + " ] 平均最大功率: [" + cBarcodeObjList[i].RSSI.ToString() + " ]");
#endregion
}
if (cBarcodeObjList[i].Count > iOrderMaxCount)
{
iOrderMaxCount = cBarcodeObjList[i].Count;
}
}
if (iPrintLogFlag == 1)
{
//LogService.Instance.Debug("按照次数优先,最大次数为:" + iOrderMaxCount.ToString());
}
#endregion
#region 求出等于最大次数的所有条码对象
List<TagInfo> cBarcodeObjListCount = new List<TagInfo>();
foreach (TagInfo itemMax in cBarcodeObjList)
{
if (itemMax.Count == iOrderMaxCount)
{
cBarcodeObjListCount.Add(itemMax);
//LogService.Instance.Debug("按照次数优先,等于最大次数条码为:" + stringChange.bytesToHexStr(itemMax.EPC, itemMax.EPC.Length));
}
}
if (iPrintLogFlag == 1)
{
//LogService.Instance.Debug("按照次数优先,等于最大次数条码数量为:" + cBarcodeObjListCount.Count.ToString());
}
#endregion
#region 求出最优条码
if (cBarcodeObjListCount.Count == 1) //如果只有一条
{
foreach (TagInfo itemCount in cBarcodeObjListCount)
{
if (itemCount.Count == iOrderMaxCount)
{
if (iPrintLogFlag == 1)
{
//log.RfidLog("---- 取出的最优条码是: " + stringChange.bytesToHexStr(itemCount.EPC, itemCount.EPC.Length));
}
tempBarcode = new byte[itemCount.EPC.Length];
Array.Copy(itemCount.EPC, 0, tempBarcode, 0, itemCount.EPC.Length);
}
}
//Add By baogq 2019年5月24日 15:29:20
//tempBarcode = new byte[cBarcodeObjListCount[0].EPC.Length];
//tempBarcode = cBarcodeObjListCount[0].EPC;
//Array.Copy(cBarcodeObjListCount[0].EPC, 0, tempBarcode, 0, cBarcodeObjListCount[0].EPC.Length);
cBarcodeObjListCount.Clear();
return tempBarcode;
}
else //如果有多条
{
#region 求出最大次数相同下条码的强度最强的条码
#region 求出最大次数相同的条码中,强度的最大值
float iOrderAvgMaxPower = cBarcodeObjListCount[0].RSSI;
for (int i = 0; i < cBarcodeObjListCount.Count; i++)
{
if (cBarcodeObjListCount[i].RSSI > iOrderAvgMaxPower)
{
iOrderAvgMaxPower = cBarcodeObjListCount[i].RSSI;
}
}
if (iPrintLogFlag == 1)
{
//LogService.Instance.Debug("按照次数优先,等于最大次数条码中平均功率最大值为:" + iOrderAvgMaxPower.ToString());
}
#endregion
foreach (TagInfo itemAvg in cBarcodeObjListCount)
{
if (itemAvg.RSSI == iOrderAvgMaxPower)
{
if (iPrintLogFlag == 1)
{
//log.RfidLog("---- 取出的最优条码是: " + stringChange.bytesToHexStr(itemAvg.EPC, itemAvg.EPC.Length));
}
tempBarcode = new byte[itemAvg.EPC.Length];
Array.Copy(itemAvg.EPC, 0, tempBarcode, 0, itemAvg.EPC.Length);
}
}
#endregion
}
#endregion
#endregion
return tempBarcode;
}
else if (iFlag == 2)//按照功率最大获取
{
if (iPrintLogFlag == 1)
{
//log.RfidLog("----调用通用函数:CommandAnalysisBarcode Flag=2 按照最大平均功率取出条码,如果最大平均功率相同,则按照次数最大取值最优条码:");
}
#region 按照最大平均功率取出条码,如果最大功率相同,则按照次数最大取值最优条码
#region 求出最大功率
int iMaxAvgPow = cBarcodeObjList[0].RSSI;
for (int i = 0; i < cBarcodeObjList.Count; i++)
{
if (iPrintLogFlag == 1)
{
#region 打印所有条码 次数和平均功率
log.RfidLog("条码:[ " + stringChange.bytesToHexStr(cBarcodeObjList[i].EPC, cBarcodeObjList[i].EPC.Length) + " ] 平均最大功率: [" + cBarcodeObjList[i].RSSI.ToString() + " ] 次数:[ " + cBarcodeObjList[i].Count.ToString() + " ] ");
#endregion
}
if (cBarcodeObjList[i].RSSI > iMaxAvgPow)
{
iMaxAvgPow = cBarcodeObjList[i].RSSI;
}
}
if (iPrintLogFlag == 1)
{
//LogService.Instance.Debug("按照平均功率最大,最大平均功率为:" + iMaxAvgPow.ToString());
}
#endregion
#region 求出等于最大功率的所有条码对象
List<TagInfo> cBarcodeObjListCount = new List<TagInfo>();
foreach (TagInfo itemMax in cBarcodeObjList)
{
if (itemMax.RSSI == iMaxAvgPow)
{
cBarcodeObjListCount.Add(itemMax);
}
}
if (iPrintLogFlag == 1)
{
//LogService.Instance.Debug("按照平均功率最大,最大平均功率相同的条码数量为:" + cBarcodeObjListCount.Count.ToString());
}
#endregion
#region 求出最优条码
//如果只有一条
if (cBarcodeObjListCount.Count == 1)
{
if (iPrintLogFlag == 1)
{
// log.RfidLog("---- 取出的最优条码是: " + stringChange.bytesToHexStr(cBarcodeObjList[0].EPC, cBarcodeObjList[0].EPC.Length));
}
tempBarcode = new byte[cBarcodeObjListCount[0].EPC.Length];
Array.Copy(cBarcodeObjListCount[0].EPC, 0, tempBarcode, 0, cBarcodeObjListCount[0].EPC.Length);
}
else //如果有多条
{
#region 求出平均功率最大相同时,条码读到次数最多的一个条码
#region 求出平均功率最大相同条码中,最大的次数
int iReadMaxCount = cBarcodeObjListCount[0].Count;
for (int i = 0; i < cBarcodeObjListCount.Count; i++)
{
if (cBarcodeObjListCount[i].Count > iReadMaxCount)
{
iReadMaxCount = cBarcodeObjListCount[i].Count;
}
}
if (iPrintLogFlag == 1)
{
//LogService.Instance.Debug("在最大平均功率相同的条码中,读取次数最多为:" + iReadMaxCount.ToString());
}
#endregion
foreach (TagInfo itemReadCount in cBarcodeObjListCount)
{
if (itemReadCount.Count == iReadMaxCount)
{
if (iPrintLogFlag == 1)
{
// log.RfidLog("---- 取出的最优条码是: " + stringChange.bytesToHexStr(itemReadCount.EPC, itemReadCount.EPC.Length));
}
tempBarcode = new byte[itemReadCount.EPC.Length];
Array.Copy(itemReadCount.EPC, 0, tempBarcode, 0, itemReadCount.EPC.Length);
}
}
#endregion
}
#endregion
#endregion
return tempBarcode;
}
else
{
return tempBarcode;
}
}
#region 处理自动上传的函数
private Mutex mutauto = new Mutex();
/// <summary>
/// 四通道读写器标签逻辑处理
/// </summary>
/// <param name="AutoDealReportData"></param>
/// <returns></returns>
public List<TagInfo> Device_DealTagInfoList(byte[] AutoDealReportData)
{
List<TagInfo> tagInfoList = new List<TagInfo>();
byte[] bResultEPC_Data = new byte[14];
m_AutoReadEPC = null;
m_readEPCDataLen = 0;
//LogService.Instance.Debug("----函数调用:Device_AutoDealContent 开始!");
try
{
mutauto.WaitOne();
int iFirstCountPos = 6; //第一次读取标签次数位置
int iFirstRSSIPos = 7; //第一次读取标签强度位置
int iFirstAnt = 8;
int iFirstPC = 9; //第一次读取标签天线位置
int iFirstLeftBarcketPos = 11;//EPC数据起始位置
UInt16 tempDataCount = 0;
int tempDataRSSI = 0;
UInt16 tempDataANT = 0;
int iBarcodeGroupCount = Convert.ToInt32(AutoDealReportData[5].ToString()); //标签组数
int iBarcodeLength = 16; //标签长度
int iCommonSecondFlag = 0;
for (int j = 0; j < iBarcodeGroupCount; j++)
{
TagInfo tag = new TagInfo();
byte[] tempDataByte = new byte[iBarcodeLength];
Array.Clear(tempDataByte, 0, iBarcodeLength);
Array.Copy(AutoDealReportData, iFirstLeftBarcketPos, tempDataByte, 0, iBarcodeLength);
byte[] tempCountByte = new byte[1]; //取出标签次数
Array.Clear(tempCountByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstCountPos, tempCountByte, 0, 1);
tempDataCount = tempCountByte[0];
byte[] tempRSSIByte = new byte[1]; //取出标签强度
Array.Clear(tempRSSIByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstRSSIPos, tempRSSIByte, 0, 1);
//tempDataRSSI = tempRSSIByte[0];
tempDataRSSI = stringChange.HexStringToNegative(stringChange.bytesToHexStr(tempRSSIByte, 1));
byte[] tempPCByte = new byte[2]; //取出PC
Array.Clear(tempPCByte, 0, 2);
Array.Copy(AutoDealReportData, iFirstPC, tempPCByte, 0, 2);
//tempPCByte = tempPCByte[0];
#region add by wenjy 20220829 取出天线号
byte[] tempAntByte = new byte[1]; //取出天线号
Array.Clear(tempAntByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstAnt, tempAntByte, 0, 1);
tempDataANT = tempAntByte[0];
#endregion
tag.Count = tempDataCount;
tag.RSSI = tempDataRSSI;
tag.EPC = tempDataByte;
tag.EPCstring = System.Text.Encoding.ASCII.GetString(tempDataByte);
//tag.EPCstring = stringChange.bytesToHexStr(tempDataByte, tempDataByte.Length);
tag.PC = tempPCByte;
tag.Antana = tempDataANT;
tagInfoList.Add(tag);
int iBarcodeListLen = tagInfoList.Count; //特别注意,必须这样,要不然会多一条数据
//int iFirstCountPos = 6; //第一次读取标签次数位置
//int iFirstRSSIPos = 7; //第一次读取标签强度位置
//int iFirstAnt = 8; //第一次读取标签天线位置
//int iFirstLeftBarcketPos = 11;//EPC数据起始位置
iFirstCountPos = iFirstCountPos + 21; //次数
iFirstRSSIPos = iFirstCountPos + 1; //强度
iFirstAnt = iFirstRSSIPos + 1; //天线
iFirstPC = iFirstAnt + 1;
iFirstLeftBarcketPos = iFirstLeftBarcketPos + 21;
log.RfidLog("----函数调用:Device_AutoDealContent 第[" + (iCommonSecondFlag + 1) + "]次数据解析为:" + tag.EPCstring + ",读取标签次数:[" + tempDataCount + "],标签信号强度:[" + tempDataRSSI + "],天线号:[" + tempDataANT + "]");
iCommonSecondFlag++;
if (iCommonSecondFlag == iBarcodeGroupCount)
{
mutauto.ReleaseMutex();
log.RfidLog("《《《返回标签数据!");
return tagInfoList;
}
}
}
catch (Exception ex)
{
log.RfidLog("----函数调用:Device_AutoDealContent 自动处理函数异常:" + ex.ToString());
mutauto.ReleaseMutex();
}
return tagInfoList;
}
public List<TagInfo> Device_DealTagInfoList2(byte[] AutoDealReportData)
{
List<TagInfo> tagInfoList = new List<TagInfo>();
byte[] bResultEPC_Data = new byte[14];
m_AutoReadEPC = null;
m_readEPCDataLen = 0;
try
{
mutauto.WaitOne();
int iFirstCountPos = 6; //第一次读取标签次数位置
int iFirstRSSIPos = 7; //第一次读取标签强度位置
int iFirstAnt = 8;
int iFirstPC = 9; //第一次读取标签天线位置
int iFirstLeftBarcketPos = 11;//EPC数据起始位置
UInt16 tempDataCount = 0;
int tempDataRSSI = 0;
UInt16 tempDataANT = 0;
int iBarcodeGroupCount = Convert.ToInt32(AutoDealReportData[5].ToString()); //标签组数
int iBarcodeLength = 16; //标签长度
int iCommonSecondFlag = 0;
for (int j = 0; j < iBarcodeGroupCount; j++)
{
TagInfo tag = new TagInfo();
byte[] tempPCByte = new byte[2]; //取出PC
Array.Clear(tempPCByte, 0, 2);
Array.Copy(AutoDealReportData, iFirstPC, tempPCByte, 0, 2);
int pc = Convert.ToInt32(tempPCByte[0].ToString("X"));
int epcLength = EPCLengthByPC(pc);
iBarcodeLength = epcLength;
byte[] tempDataByte = new byte[epcLength];
Array.Clear(tempDataByte, 0, iBarcodeLength);
Array.Copy(AutoDealReportData, iFirstLeftBarcketPos, tempDataByte, 0, iBarcodeLength);
byte[] tempCountByte = new byte[1]; //取出标签次数
Array.Clear(tempCountByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstCountPos, tempCountByte, 0, 1);
tempDataCount = tempCountByte[0];
byte[] tempRSSIByte = new byte[1]; //取出标签强度
Array.Clear(tempRSSIByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstRSSIPos, tempRSSIByte, 0, 1);
tempDataRSSI = stringChange.HexStringToNegative(stringChange.bytesToHexStr(tempRSSIByte, 1));
#region add by wenjy 20220829 取出天线号
byte[] tempAntByte = new byte[1]; //取出天线号
Array.Clear(tempAntByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstAnt, tempAntByte, 0, 1);
tempDataANT = tempAntByte[0];
#endregion
tag.Count = tempDataCount;
tag.RSSI = tempDataRSSI;
tag.EPC = tempDataByte;
if (pc == 24)
{
tag.EPCstring = stringChange.bytesToHexStr(tempDataByte, tempDataByte.Length).Substring(0, 7);
}
else
{
tag.EPCstring = System.Text.Encoding.ASCII.GetString(tempDataByte);
}
tag.PC = tempPCByte;
tag.Antana = tempDataANT;
tagInfoList.Add(tag);
int iBarcodeListLen = tagInfoList.Count; //特别注意,必须这样,要不然会多一条数据
iFirstCountPos = iFirstCountPos + iBarcodeLength + 5; //次数
iFirstRSSIPos = iFirstCountPos + 1; //强度
iFirstAnt = iFirstRSSIPos + 1; //天线
iFirstPC = iFirstAnt + 1;
iFirstLeftBarcketPos = iFirstLeftBarcketPos + iBarcodeLength + 5;
log.RfidLog("----函数调用:Device_DealTagInfoList2 第[" + (iCommonSecondFlag + 1) + "]次数据解析为:" + tag.EPCstring + ",读取标签次数:[" + tempDataCount + "],标签信号强度:[" + tempDataRSSI + "],天线号:[" + tempDataANT + "]");
iCommonSecondFlag++;
if (iCommonSecondFlag == iBarcodeGroupCount)
{
mutauto.ReleaseMutex();
log.RfidLog("《《《返回标签数据!");
return tagInfoList;
}
}
}
catch (Exception ex)
{
log.RfidLog("----函数调用:Device_AutoDealContent 自动处理函数异常:" + ex.ToString());
mutauto.ReleaseMutex();
}
return tagInfoList;
}
private int EPCLengthByPC(int pcValue)
{
int epcLength = 0;
if (pcValue >= 10 && pcValue < 20)
{
epcLength = 4;
}
else if (pcValue >= 20 && pcValue < 30)
{
epcLength = 8;
}
else if (pcValue >= 30 && pcValue < 40)
{
epcLength = 12;
}
else if (pcValue >= 40 && pcValue < 50)
{
epcLength = 16;
}
else if (pcValue >= 50 && pcValue < 60)
{
epcLength = 20;
}
else if (pcValue >= 60 && pcValue < 70)
{
epcLength = 24;
}
else if (pcValue >= 70 && pcValue < 80)
{
epcLength = 28;
}
else if (pcValue >= 80 && pcValue < 90)
{
epcLength = 30;
}
return epcLength;
}
/// <summary>
/// 一体机读写器标签逻辑处理
/// </summary>
/// <param name="AutoDealReportData"></param>
/// <returns></returns>
public List<TagInfo> Device_AutoDealContent(byte[] AutoDealReportData)
{
List<TagInfo> tagInfoList = new List<TagInfo>();
byte[] bResultEPC_Data = new byte[12];
m_AutoReadEPC = null;
m_readEPCDataLen = 0;
try
{
mutauto.WaitOne();
int iFirstCountPos = 6; //第一次读取标签次数位置
int iFirstRSSIPos = 7; //第一次读取标签强度位置
int iFirstAnt = 8; //第一次读取标签天线位置
int iFirstLeftBarcketPos = 11;//EPC数据起始位置
UInt16 tempDataCount = 0;
UInt16 tempDataRSSI = 0;
UInt16 tempDataANT = 0;
int iBarcodeGroupCount = Convert.ToInt32(AutoDealReportData[5].ToString()); //标签组数
int iBarcodeLength = 16; //标签长度
for (int j = 0; j < iBarcodeGroupCount; j++)
{
TagInfo tag = new TagInfo();
byte[] tempDataByte = new byte[iBarcodeLength];
Array.Clear(tempDataByte, 0, iBarcodeLength);
Array.Copy(AutoDealReportData, iFirstLeftBarcketPos, tempDataByte, 0, iBarcodeLength);
byte[] tempCountByte = new byte[1]; //取出标签次数
Array.Clear(tempCountByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstCountPos, tempCountByte, 0, 1);
tempDataCount = tempCountByte[0];
byte[] tempRSSIByte = new byte[1]; //取出标签强度
Array.Clear(tempRSSIByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstRSSIPos, tempRSSIByte, 0, 1);
tempDataRSSI = tempRSSIByte[0];
byte[] tempAntByte = new byte[1]; //取出天线号
Array.Clear(tempAntByte, 0, 1);
Array.Copy(AutoDealReportData, iFirstAnt, tempAntByte, 0, 1);
tempDataANT = tempAntByte[0];
tag.Count = tempDataCount;
tag.RSSI = tempDataRSSI;
tag.EPC = tempDataByte;
tag.EPCstring = System.Text.Encoding.ASCII.GetString(tempDataByte); ;
tag.Antana = tempDataANT;
tagInfoList.Add(tag);
int iBarcodeListLen = tagInfoList.Count; //特别注意,必须这样,要不然会多一条数据
iFirstCountPos = iFirstCountPos + 21;
iFirstRSSIPos = iFirstCountPos + 1;
iFirstAnt = iFirstRSSIPos + 1;
iFirstLeftBarcketPos = iFirstLeftBarcketPos + 21;
}
}
catch (Exception ex)
{
log.RfidLog("----函数调用:Device_AutoDealContent 自动处理函数异常:" + ex.ToString());
mutauto.ReleaseMutex();
}
return tagInfoList;
}
#endregion
#region 该函数不实现了
public bool Device_SetRf(int iDbi, byte Antenna, WriteOrRead RorW)
{
bool bResult = false;
try
{
bool Set_OK;
if (RorW == WriteOrRead.Read)
{
Set_OK = MyReader.SetPower(iDbi, Convert.ToSingle(m_WriteDbm));
if (Set_OK) //设置功率工程
{
log.RfidLog("设置天线读功率成功!");
bResult = true;
}
else
{
log.Error("设置天线读功率失败;");
bResult = false;
}
}
else
{
Set_OK = MyReader.SetPower(Convert.ToSingle(m_ReadDbm), iDbi);
if (Set_OK) //设置功率工程
{
log.RfidLog("设置天线写功率成功!");
bResult = true;
}
else
{
log.Error("设置天线写功率失败;");
bResult = false;
}
}
}
catch (Exception ex)
{
log.Error("Device_SetRf异常", ex);
bResult = false;
}
return bResult;
}
public string Device_GetOneIdentifyData(Byte Antenna, UInt16 Timedout)
{
byte[] u16byte = new byte[2];
byte[] bCRC = new byte[4];
string strResult = "";
try
{
m_GlobalSem.WaitOne(1, false);
//log.RfidLog("函数调用:Device_GetOneIdentifyData");
if (Antenna == 0) //此版本1为主机
{
Antenna = (byte)(Antenna + 1);
}
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[8];
pMessagePack.m_pData[0] = 0xAA;
pMessagePack.m_pData[1] = 0x55;
pMessagePack.m_pData[2] = 0x02;//change by yinzf
pMessagePack.m_pData[3] = 0x02;
//pMessagePack.m_pData[4] = 0x00;
//pMessagePack.m_pData[5] = 0x64;
//pMessagePack.m_pData[6] = 0x67;
u16byte = BitConverter.GetBytes(Timedout); //超时时间
u16byte = stringChange.Swap16Bytes(u16byte); //协议里为大端在前
//log.RfidLog("u16byte" + u16byte);
Array.Copy(u16byte, 0, pMessagePack.m_pData, 4, 2);
Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 4);
pMessagePack.m_pData[6] = stringChange.CalculateVerify(bCRC, bCRC.Length);
pMessagePack.m_pData[7] = 0x0D;
//m_OneEpcSem.Release(1);
m_OneEpcSem.WaitOne(1, false);
m_OneEpcDataLen = 0;
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_OneEpcSem.WaitOne(Timedout + 500, false)) //等待结果,并取结果返回。
{
if (m_OneEpcDataLen >= 1) //有数据,正常
{
strResult = Encoding.ASCII.GetString(m_OneEpcData);
//Encoding.ASCII.GetBytes(strResult);
//pReadData = new byte[m_OneEpcDataLen];
//Array.Copy(m_OneEpcData, 0, pReadData, 0, m_OneEpcDataLen);
log.RfidLog("Device_GetOneIdentifyData:" + stringChange.bytesToHexStr(m_OneEpcData, m_OneEpcDataLen));
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
}
else
{
strResult = stringChange.bytesToHexStr(m_OneEpcData, m_OneEpcDataLen);
log.RfidLog("Device_GetOneIdentifyData:" + stringChange.bytesToHexStr(m_OneEpcData, m_OneEpcDataLen));
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
strResult = "";
}
}
else //超时
{
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
log.RfidLog("Device_GetOneIdentifyData超时未返回");
strResult = "";
}
}
else
{
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
log.RfidLog("Device_GetOneIdentifyData发送识别单条EPC命令超时");
strResult = "";
}
}
catch (Exception ex)
{
log.Error("Device_GetOneIdentifyData识别单条EPC数据异常", ex);
strResult = "";
}
finally
{
//m_GlobalSem.Release();
}
return strResult;
}
public string Device_GetOneIdentifyData_Finish(byte Antenna, ushort Timedout)
{
return "";
}
public Byte Device_GetOneIdentifyData_Finish(ref byte[] pReadData, byte Antenna, ushort Timedout)
{
return 0;
}
public bool Device_BeginIdentify()
{
byte[] u16byte = new byte[2];
bool bResult = false;
try
{
log.RfidLog("函数调用:Device_BeginIdentify");
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[1];
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (BeginEvent.WaitOne(200, false)) //等待结果,并取结果返回。
{
bResult = true;
}
else //超时
{
bResult = false;
}
}
else
{
log.RfidLog("发送开始连续识别命令失败:");
bResult = false;
}
}
catch (Exception ex)
{
log.Error("发送开始连续识别命令异常", ex);
bResult = false;
}
return bResult;
}
public bool Device_StopIdentify()
{
bool bResult = false;
try
{
log.RfidLog("函数调用:Device_StopIdentify");
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[1];
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
if (m_StopSem.WaitOne(200, false)) //等待结果,并取结果返回。
{
bResult = true;
}
else //超时
{
bResult = false;
}
}
else
{
log.RfidLog("发送停止连续识别命令失败:");
bResult = false;
}
}
catch (Exception ex)
{
log.Error("发送停止连续识别命令异常:", ex);
bResult = false;
}
return bResult;
}
public ushort Device_GetIdentifyData(ref byte[] pReadData, byte Antenna)
{
return 0;
}
public List<TagInfo> Device_GetTagInfoList(DeviceType devicetype, int waitTime)
{
log.Info("进入Device_GetTagInfoList函数参数deviceType" + jsonChange.ModeToJson(devicetype) + "waitTime" + waitTime);
byte[] u16byte = new byte[2];
byte iResult = 0;
byte[] bCRC = new byte[4];
try
{
//log.SemaphoreLog("信号量m_GlobalSemWaitOne(1, false)");
//m_GlobalSem.WaitOne(1, false);
MessagePack pMessagePack = new MessagePack();
//A5 5A 00 0A 80 00 64 EE 0D 0A //100毫秒的示例
pMessagePack.m_pData = new byte[8];
pMessagePack.m_pData[0] = 0xAA;
pMessagePack.m_pData[1] = 0x55;
pMessagePack.m_pData[2] = 0x02;
pMessagePack.m_pData[3] = 0x02;
//pMessagePack.m_pData[4] = 0x03;
//pMessagePack.m_pData[5] = 0xE8;
if (waitTime == 0)
{
waitTime = 1000;
}
u16byte = BitConverter.GetBytes(waitTime); //超时时间
u16byte = stringChange.Swap16Bytes(u16byte); //协议里为大端在前
//log.RfidLog("u16byte" + u16byte);
Array.Copy(u16byte, 0, pMessagePack.m_pData, 4, 2);
Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 4);
pMessagePack.m_pData[6] = stringChange.CalculateVerify(bCRC, bCRC.Length);
pMessagePack.m_pData[7] = 0x0D;
//m_OneEpcSem.WaitOne(1, false);
GetAllRelese(m_OneEpcSem);
log.SemaphoreLog("信号量m_OneEpcSemWaitOne(1, false)");
m_OneEpcDataLen = 0;
DeviceType = devicetype;
if (m_ICommunicateService.SendMessage(pMessagePack)) //发送报文成功
{
m_ReadDataSuccessful = true;
log.SemaphoreLog("信号量m_OneEpcSemWaitOne(" + waitTime + ", false)");
if (m_OneEpcSem.WaitOne(waitTime + 2000, false)) //等待结果,并取结果返回。
{
if (m_OneEpcDataLen > 0) //有数据,正常
{
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
m_ReadDataSuccessful = false;
log.Info("成功返回数据!");
return m_TagInfoList;
}
else
{
log.Info("Device_GetTagInfoLista长度或者天线号不正确");
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
iResult = 0;
m_TagInfoList.Clear();
m_ReadDataSuccessful = false;
}
}
else //超时
{
iResult = 0;
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
m_ReadDataSuccessful = false;
m_TagInfoList.Clear();
log.Info("Device_GetTagInfoList超时");
log.SemaphoreLog("信号量m_OneEpcSem返回Device_GetTagInfoList超时");
}
}
else
{
m_OneEpcDataLen = 0;
m_OneEpcAntenna = 254;
log.Info("Device_GetTagInfoList发送识别单条EPC命令失败");
iResult = 0;
m_TagInfoList.Clear();
m_ReadDataSuccessful = false;
}
}
catch (Exception ex)
{
log.Info("Device_GetTagInfoList识别单条EPC数据异常" + ex.Message);
log.Error("Device_GetTagInfoList识别单条EPC数据异常", ex);
iResult = 0;
m_TagInfoList.Clear();
m_ReadDataSuccessful = false;
}
finally
{
// m_GlobalSem.Release();
}
return m_TagInfoList;
}
#endregion
private void GetAllRelese(Semaphore sph)
{
bool res = sph.WaitOne(1, false);
if (res)
{
log.RfidLog("信号量手动释放");
GetAllRelese(sph);
}
}
}
}