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 } }