using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mesnac.Compressor.Entity;
using Mesnac.Compressor.Unity;
namespace SocketProcess
{
public class DataHandler
{
private const int EpcLengh = 24;
private string msg;
private object sysanc = new object();
//单次读取标签超时时间:3000毫秒
private string TimeOut =Common.Instance.ReadTimeOut;
public delegate void recieveData(FrameFormat frame);
public recieveData recieveEvent;
public delegate void RecieveReturn(string ReturnString);
public RecieveReturn returnEvent;
public DataHandler()
{
}
#region 数据接收
public FrameFormat DataAnylysis(object o)
{
string data = o as string;
FrameFormat frame = new FrameFormat();
try
{
if (data.Length < 16)
{
frame.CompleteFlag = false;
}
else
{
frame.CompleteFlag = true;
}
//Trim只能将字符的前端和后端空格去掉,但是不能去掉中间的
msg = data.Replace(" ", "");
//获取帧头
frame.CompleteFlag = headSub(frame);
//获取帧尾
frame.CompleteFlag = TailSub(frame);
//获取帧类型
TypeSub(frame);
//判断长度
frame.CompleteFlag = LenghSub(frame);
//获取校验和
CheckCodeSub(frame);
//检验
frame.CompleteFlag = Check(frame);
//如果自动模式
if (frame.CompleteFlag)
{
//Console.WriteLine("数据校验成功");
ExcuteMethod(frame);
}
}
catch (Exception e)
{
frame.CompleteFlag = false;
}
return frame;
}
///
/// 根据类型调用具体方法
///
private void ExcuteMethod(FrameFormat frame)
{
switch (frame.Type)
{
//Epc过滤应答
case "AD":
FlatMode(frame);
break;
//主动上传模式
case "BB":
EPCData(frame);
break;
//单次读取模式
case "AF":
ReadOneTagEpc(frame);
break;
default:
//发送自动上报模式
break;
}
}
#region 帧数据解析公用
private bool headSub(FrameFormat frame)
{
string head = msg.Substring(0, 4).ToUpper();
frame.Framehead = head;
return head.Equals("A55A");
}
private bool LenghSub(FrameFormat frame)
{
string length = msg.Substring(4, 4);
//获取高位
string lengthHigh = length.Substring(0, 2);
//获取低位
string LengthLow = length.Substring(2, 2);
int high = Convert.ToInt32(lengthHigh, 16);
int low = Convert.ToInt32(LengthLow, 16);
frame.length = high * 256 + low;
// Mesnac.Log.LogService.Instance.Debug("原数据高位:" + lengthHigh + ";原数据低位位:" + LengthLow + ";转换高位:" + high.ToString() + ";转换低位:" + low.ToString() + ";转换后数据:" + frame.length.ToString());
return (frame.length == msg.Length / 2);
}
private void TypeSub(FrameFormat frame)
{
string type = msg.Substring(8, 2).ToUpper();
frame.Type = type;
}
private void CheckCodeSub(FrameFormat frame)
{
if (frame.length < 3)
{
return;
}
frame.CheckCode = msg.Substring(msg.Length - 6, 2);
}
private bool TailSub(FrameFormat frame)
{
string Tail = msg.Substring(msg.Length - 4, 4).ToUpper();
frame.FrameTail = Tail;
return Tail.Equals("0D0A");
}
private bool Check(FrameFormat frame)
{
//获取校验位,除去帧头和帧尾 帧头四位,帧尾四位,校验码两位
string data = msg.Substring(4, msg.Length - 10);
int CRC = GetCheckCode(data);
return (CRC == Convert.ToInt32(frame.CheckCode, 16));
}
private int GetCheckCode(string data)
{
//string data = messge.Substring(4, msg.Length - 10);
int num = data.Length / 2;
int CRC = 0;
CRC = Convert.ToInt32(data.Substring(0, 2), 16);
for (int i = 1; i < num; i++)
{
int word = Convert.ToInt32(data.Substring(i * 2, 2), 16);
CRC = CRC ^ word;
}
return CRC;
}
#endregion
///
/// 自动上传模式读取EPC天线等数据
///
///
private void EPCData(FrameFormat frame)
{
//如果没有数据就返回,不够一个EPC的长度
//这里需要改,单次读标签,没有读到数据也要返回*****************
//表示空数据
frame.CompleteFlag = false;
return;
if (msg.Length < 16 + 24)
{
frame.CompleteFlag = false;
return;
}
int N = msg.Length - 16;
//获取只有数据帧部分的数据
string data = msg.Substring(10, N);
frame.data.PC = data.Substring(0, 4);
int EPCNum = (data.Length - 12) / EpcLengh;
for (int i = 0; i < EPCNum; i++)
{
string Epc = data.Substring(4 + i * 24, 24);
frame.data.Epc = Epc;
}
frame.data.ANT = data.Substring(data.Length-4, 2);
//判断是否是当前工位的信息
//if (frame.data.ANT == "01")
//{
// //frame.data.Enable = true;
//}
frame.data.IP = data.Substring(data.Length - 2, 2);
}
private void ReadOneTagEpc(FrameFormat frame)
{
//如果没有数据就返回,不够一个EPC的长度
//这里需要改,单次读标签,没有读到数据也要返回*****************
int N = msg.Length - 16;
//获取只有数据帧部分的数据
string data = msg.Substring(10, N);
frame.data.PC = data.Substring(0, 4);
//表示没有读到数据,epc默认为空
if (data.Length < 24)
{
frame.data.Epc = "";
}
else
{
int EPCNum = (data.Length - 12) / EpcLengh;
for (int i = 0; i < EPCNum; i++)
{
//不管读到几个标签,这里智取最后一个
string Epc = data.Substring(4 + i * 24, 24);
frame.data.Epc = Epc;
}
}
frame.data.ANT = data.Substring(data.Length - 4, 2);
frame.data.IP = data.Substring(data.Length - 2, 2);
}
///
/// 过滤数据解析
///
///
private void FlatMode(FrameFormat frame)
{
if (msg.Length < 20)
{
return;
}
int N = msg.Length - 16;
string data = msg.Substring(10, N);
string result = data.Substring(0, 2);
frame.data.ANT = data.Substring(2, 2);
Mesnac.Log.LogService.Instance.Debug("过滤结果:" + result + " 过滤IP" + frame.data.IP + " 过滤天线" + frame.data.ANT);
}
#endregion
#region 数据发送
public void sendData(string epc, string type)
{
}
//设置EPC过滤 发送string
public string FrameConbine(DataFormat Epcdata, string type)
{
string head = "A55A";
string length = "0011";
string data = Epcdata.Epc;
string Ant = Epcdata.ANT;
string checkCode = "00";
string Tail = "0D0A";
//获取长度
int len = head.Length + length.Length + type.Length + data.Length + Ant.Length + checkCode.Length + Tail.Length;
len = len / 2;
int high = len / 256;
int low = len % 256;
length = Convert.ToString(high, 16).PadLeft(2, '0') + Convert.ToString(low, 16);
//获取checkcode
StringBuilder sb = new StringBuilder();
sb.Append(length).Append(type).Append(data).Append(Ant);
int CRC = GetCheckCode(sb.ToString());
checkCode = Convert.ToString(CRC, 16).PadLeft(2, '0');
//获取整个发送的字符串
sb.Clear();
sb.Append(head).Append(length).Append(type).Append(data).Append(Ant).Append(checkCode).Append(Tail);
//string mess = sb.ToString();
//sb.Clear();
//int loop = mess.Length / 2;
//for (int i = 0; i < loop; i++)
//{
// sb.Append(mess.Substring(i * 2, 2)).Append(" ");
//}
return sb.ToString().Trim().ToLower();
}
public string ReadOneStringCombine(string sAnt)
{
string head = "A55A";
string length = "000B";
//string data = Epcdata.Epc;
string Ant = sAnt;
string checkCode = "00";
string Tail = "0D0A";
string type = "AE";
//获取长度
//int len = head.Length + length.Length + type.Length + TimeOut.Length + Ant.Length + checkCode.Length + Tail.Length;
//len = len / 2;
//int high = len / 256;
//int low = len % 256;
//length = Convert.ToString(high, 16).PadLeft(2, '0') + Convert.ToString(low, 16);
//获取checkcode
StringBuilder sb = new StringBuilder();
sb.Append(length).Append(type).Append(Ant).Append(TimeOut);
int CRC = GetCheckCode(sb.ToString());
checkCode = Convert.ToString(CRC, 16).PadLeft(2, '0');
//获取整个发送的字符串
sb.Clear();
sb.Append(head).Append(length).Append(type).Append(Ant).Append(TimeOut).Append(checkCode).Append(Tail);
//string mess = sb.ToString();
//sb.Clear();
//int loop = mess.Length / 2;
//for (int i = 0; i < loop; i++)
//{
// sb.Append(mess.Substring(i * 2, 2)).Append(" ");
//}
return sb.ToString().Trim().ToLower();
}
#endregion
}
}