using GRreader;
using MaterialTraceability.Common;
using MaterialTraceability.Entity.DTO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MaterialTraceability.Business
{
public class CFliterRFID
{
///
/// 通过读取次数找最好标签
///
///
///
public TagInfo fliterBycount(List rfidlist)
{
try
{
int maxIndex = 0;
if (rfidlist.Count < 1)
{
LogHelper.RfidLog("过滤标签太少,无法获取");
return null;
}
else if (rfidlist.Count == 1)
{
///LogHelper.Info("过滤标签太少,无法获取");
return rfidlist[0];
}
else
{
int first = rfidlist[0].Count;
for (int i = 1; i < rfidlist.Count; i++)
{
if (first < rfidlist[i].Count)
{
maxIndex = i;
first = rfidlist[i].Count;
}
LogHelper.RfidLog(rfidlist[i].Antana + "号天线读到标签:" + rfidlist[i].EPCstring + ",信号强度:" + rfidlist[i].RSSI + ",读取次数:" + rfidlist[i].Count);
}
}
return rfidlist[maxIndex];
}
catch (Exception ex)
{
LogHelper.RfidLog("过滤标签异常读到标签数量为" + rfidlist.Count + ex.ToString());
return null;
}
}
///
/// 通过信号强度读取标签
///
///
///
public TagInfo fliterByRSSI(List rfidlist)
{
try
{
int maxIndex = 0;
if (rfidlist.Count < 1)
{
return null;
}
else if (rfidlist.Count == 1)
{
return rfidlist[0];
}
else
{
int first = rfidlist[0].Count;
for (int i = 1; i < rfidlist.Count; i++)
{
if (first < rfidlist[i].RSSI)
{
maxIndex = i;
first = rfidlist[i].RSSI;
}
}
}
return rfidlist[maxIndex];
}
catch (Exception ex)
{
LogHelper.RfidLog("过滤标签异常读到标签数量为" + rfidlist.Count + ex.ToString());
return null;
}
}
///
/// 冷压四通道算法
/// 根据小标签读到的为主,小天线的天线号分别是1,4,5,8
/// 大天线的天线号分别是2,3,5,7
/// 大天线可能会误读,小天线一般不会,所以在大天线读到的里面去掉小天线的
///
///
///
public List fliterByTongDao(List rfidlist)
{
///先不去小天线的了,从所有天线自身读取中取最好的
List message = new List();
try
{
List ant1list = new List();
List ant2list = new List();
List ant3list = new List();
List ant4list = new List();
List ant5list = new List();
List ant6list = new List();
List ant7list = new List();
List ant8list = new List();
foreach (var a in rfidlist)
{
if (a.Antana == 1)
{
ant1list.Add(a);
}
else if (a.Antana == 2)
{
ant2list.Add(a);
}
else if (a.Antana == 3)
{
ant3list.Add(a);
}
else if (a.Antana == 4)
{
ant4list.Add(a);
}
else if (a.Antana == 5)
{
ant5list.Add(a);
}
else if (a.Antana == 6)
{
ant6list.Add(a);
}
else if (a.Antana == 7)
{
ant7list.Add(a);
}
else if (a.Antana == 8)
{
ant8list.Add(a);
}
}
message.Add(fliterBycount(ant1list));
message.Add(fliterBycount(ant2list));
message.Add(fliterBycount(ant3list));
message.Add(fliterBycount(ant4list));
message.Add(fliterBycount(ant5list));
message.Add(fliterBycount(ant6list));
message.Add(fliterBycount(ant7list));
message.Add(fliterBycount(ant8list));
return message;
}
catch (Exception ex)
{
LogHelper.RfidLog("过滤标签异常读到标签数量为" + rfidlist.Count + ex.ToString());
return null;
}
}
///
/// 把每个天线最好的结果展示出来
///
///
///
public string filterByAnt(List rfidlist, int ant,string outEPC)
{
try
{
List message = new List();
foreach (var a in rfidlist)
{
string realEpc = a.EPCstring.Substring(0, a.EPCstring.Length - 2);
if (a.Antana == ant&& realEpc!= outEPC)
{
message.Add(a);
}
}
return filterByTagCount(message);
}
catch (Exception ex)
{
LogHelper.RfidLog("过滤标签异常读到标签数量为" + rfidlist.Count + ex.ToString());
return null;
}
}
///
/// 从获取结果中获取最优的
/// 由于标签中最后两位为01,02,03.....06
/// 其实代表的是同一卷筒,所以在读取时,应该取读到01-06中最多的,
///
///
///
public string filterByTagCount(List rfidlist)
{
if (rfidlist.Count < 1)
{
return "";
}
#region 把标签相同(除了后两位),整理成一个
List LTag = new List();
foreach (var T in rfidlist)
{
//如果是第一个标签直接添加
if (LTag.Count < 1)
{
string epc = "";
if (AppConfigDto.Instance.processId == "AB")
{
epc = T.EPCstring;
}
else
{
epc = T.EPCstring.Substring(0, T.EPCstring.Length - 2);
}
LTag.Add(new FilterRFIDInfo()
{
//tagInfo = T,
TagCount = 1,
TagString = epc,
TagAllCount=T.Count,
MaxRSSI=T.RSSI
});
continue;
}
//判断是否和当前标签相同
bool newflag = true;
foreach (var newtag in LTag)
{
string epc = "";
if (AppConfigDto.Instance.processId == "AB")
{
epc = T.EPCstring;
}
else
{
epc = T.EPCstring.Substring(0, T.EPCstring.Length - 2);
}
if (epc == newtag.TagString)
{
newtag.TagCount++;
newtag.TagAllCount += T.Count;
if (newtag.MaxRSSI < T.RSSI)
{
newtag.MaxRSSI = T.RSSI;
}
newflag = false;
break;
}
}
//如果是新标签
if (newflag)
{
LTag.Add(new FilterRFIDInfo()
{
//tagInfo = T,
TagCount = 1,
TagString = T.EPCstring.Substring(0, T.EPCstring.Length - 2),
TagAllCount = T.Count,
MaxRSSI = T.RSSI
});
}
}
#endregion
return FliterByTag(LTag);
}
///
/// 在所有标签里选择标签读取最多的
///
///
///
private string FliterByTag(List LTag)
{
try
{
FilterRFIDInfo rfid = new FilterRFIDInfo();
//方法
foreach (var v in LTag)
{
if (rfid == null)
{
rfid.TagCount = v.TagCount;
rfid.TagString = v.TagString;
rfid.TagAllCount = v.TagAllCount;
rfid.MaxRSSI = v.MaxRSSI;
continue;
}
///选择读取标签最多的RFID,比如x标签读到x01,x02,x03,y标签读到y01,y02,选择x
if (rfid.TagCount < v.TagCount)
{
rfid.TagCount = v.TagCount;
rfid.TagString = v.TagString;
rfid.TagAllCount = v.TagAllCount;
rfid.MaxRSSI = v.MaxRSSI;
}
else if (rfid.TagCount == v.TagCount)
{
//如果标签数量相同,取标签读取次数最多
if (rfid.TagAllCount < v.TagAllCount)
{
rfid.TagCount = v.TagCount;
rfid.TagString = v.TagString;
rfid.TagAllCount = v.TagAllCount;
rfid.MaxRSSI = v.MaxRSSI;
}
}
}
return rfid.TagString;
}
catch(Exception ex)
{
LogHelper.RfidLog("过滤函数FliterByTag报错" + ex.ToString());
return null;
}
}
///
/// 大天线过滤条件,先把小天线的过滤掉,然后再获取最多的
///
///
public string BigFilter()
{
return "";
}
}
public class FilterRFIDInfo
{
//public List tagInfo { get; set; }
///
/// 读取-01-02-03标签的数量
///
public int TagCount { get; set; }
public string TagString { get; set; }
///
/// 所有标签的数量之和
///
public int TagAllCount { set; get; }
///
/// 最好信号强度
///
public int MaxRSSI { get; set; }
}
}