/// <summary> /// 将接收到的字节数组转换为结构体 /// </summary> /// <param name="receivedBuffer"></param> public void ReadBuffer(byte[] receivedBuffer) { //检验是否有帧头帧尾 int dataLen = receivedBuffer.Length; IsValidData = true; if (dataLen < 10) { IsValidData = false; return; } if (receivedBuffer[0] == 0x78 && receivedBuffer[1] == 0x78) { //去掉帧头帧尾的数据帧 byte[] dataBuffer = new byte[dataLen - 4]; Array.Copy(receivedBuffer, 2, dataBuffer, 0, dataBuffer.Length); //包长度 FrameLen = dataBuffer[0]; //校验和 ProtocolNo = (KKSProtocolNO)dataBuffer[1]; CRCVerCode = new byte[2]; Array.Copy(receivedBuffer, dataLen - 4, CRCVerCode, 0, 2); SerialNum = new byte[2]; Array.Copy(receivedBuffer, dataLen - 6, SerialNum, 0, 2); //用户数据 Data = new byte[dataLen - 10]; Array.Copy(receivedBuffer, 4, Data, 0, dataLen - 10); _CRCContext = new byte[dataLen - 6]; Array.Copy(receivedBuffer, 2, _CRCContext, 0, _CRCContext.Length); if (!KangKaiSiTool.CheckCRCCode(_CRCContext, CRCVerCode)) { IsValidData = false; return; } } }
/// <summary> /// 将接收到的字节数组转换为结构体 /// </summary> /// <param name="receivedBuffer"></param> public void ReadBuffer(byte[] receivedBuffer) { IsValidData = true; //检验是否有帧头帧尾 int dataLen = receivedBuffer.Length; if (dataLen < 20 || receivedBuffer[0] != 0x68 || receivedBuffer[1] != 0x68 || receivedBuffer[dataLen - 2] != 0x0D || receivedBuffer[dataLen - 1] != 0x0A) { IsValidData = false; return; } if (receivedBuffer[15] == 0x10 && dataLen == 42) { //去掉帧头帧尾的数据帧 byte[] dataBuffer = new byte[dataLen - 4]; Array.Copy(receivedBuffer, 2, dataBuffer, 0, dataBuffer.Length); //包长度 FrameLen = dataBuffer[0]; //保留位 ReserveData = new byte[2]; Array.Copy(dataBuffer, 1, ReserveData, 0, 2); //终端ID byte[] imeiBuffer = new byte[8]; Array.Copy(dataBuffer, 3, imeiBuffer, 0, 8); StringBuilder sb = new StringBuilder(); for (int i = 0; i < imeiBuffer.Length; i++) { sb.Append(imeiBuffer[i].ToString("X2")); } TerminalIMEI = ulong.Parse(sb.ToString()); //协议号 ProtocolNo = (KKSProtocolNO)dataBuffer[13]; //用户数据 Data = new byte[24]; Array.Copy(dataBuffer, 14, Data, 0, 24); } else if (receivedBuffer[15] == 0x1A) { //去掉帧头帧尾的数据帧 byte[] dataBuffer = new byte[dataLen - 4]; Array.Copy(receivedBuffer, 2, dataBuffer, 0, dataBuffer.Length); //包长度 FrameLen = dataBuffer[0]; Voltage = dataBuffer[1]; GSMLevel = dataBuffer[2]; byte[] imeiBuffer = new byte[8]; Array.Copy(dataBuffer, 3, imeiBuffer, 0, 8); StringBuilder sb = new StringBuilder(); for (int i = 0; i < imeiBuffer.Length; i++) { sb.Append(imeiBuffer[i].ToString("X2")); } TerminalIMEI = ulong.Parse(sb.ToString()); SerialNum = new byte[2]; Array.Copy(dataBuffer, 11, SerialNum, 0, 2); ProtocolNo = (KKSProtocolNO)dataBuffer[13]; Data = new byte[dataLen - 18]; Array.Copy(dataBuffer, 14, Data, 0, dataLen - 18); } else if (receivedBuffer[15] == 0x1B)//短信查询位置信息 { byte[] dataBuffer = new byte[dataLen - 4]; Array.Copy(receivedBuffer, 2, dataBuffer, 0, dataBuffer.Length); //包长度 FrameLen = dataBuffer[0]; byte[] imeiBuffer = new byte[8]; Array.Copy(dataBuffer, 3, imeiBuffer, 0, 8); StringBuilder sb = new StringBuilder(); for (int i = 0; i < imeiBuffer.Length; i++) { sb.Append(imeiBuffer[i].ToString("X2")); } TerminalIMEI = ulong.Parse(sb.ToString()); SerialNum = new byte[2]; Array.Copy(dataBuffer, 11, SerialNum, 0, 2); ProtocolNo = (KKSProtocolNO)dataBuffer[13]; Data = new byte[dataLen - 18]; Array.Copy(dataBuffer, 14, Data, 0, dataLen - 18); } else { IsValidData = false; } }
/// <summary> /// 根据GPSCODE,更新最后上传数据的类型 /// </summary> /// <param name="gpsCode"></param> /// <param name="protocolNo"></param> private void UpdateLastProtocolNo(string gpsCode, KKSProtocolNO protocolNo) { lock (objLocker) { if (_LastReceiveDataProtocolNo.ContainsKey(gpsCode)) { _LastReceiveDataProtocolNo[gpsCode] = protocolNo; } else { _LastReceiveDataProtocolNo.Add(gpsCode, protocolNo); } } }