|
|
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;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 根据类型调用具体方法
|
|
|
/// </summary>
|
|
|
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
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 自动上传模式读取EPC天线等数据
|
|
|
/// </summary>
|
|
|
/// <param name="frame"></param>
|
|
|
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);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 过滤数据解析
|
|
|
/// </summary>
|
|
|
/// <param name="frame"></param>
|
|
|
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
|
|
|
}
|
|
|
|
|
|
} |