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.

352 lines
11 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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