using Microsoft.Extensions.Logging; using Serilog.Core; using SlnMesnac.Config; using SlnMesnac.Model.AirportApiEntity; using SlnMesnac.TouchSocket.Entity; using System; using System.Buffers; using System.Collections.Generic; using System.Text; using System.Threading; using System.Xml; using TouchSocket.Sockets; namespace SlnMesnac.TouchSocket { public class BufferDataAnalysis { /// /// 拆包接收数据 /// /// TCP接受的原始数据 /// public static TcpVisionEntity BufferRootAnalysis(byte[] bytes) { TcpVisionEntity entity; //一帧正常的数据最少12位 if (bytes.Length < 12) { return null; } //数据校验,从起始符开始到数据位,按字节求和得出的结果对256求余 int checkDatalength = bytes.Length - 2; byte checksum = bytes[checkDatalength]; byte[] checkData = new byte[checkDatalength]; Array.Copy(bytes, 0, checkData, 0, checkDatalength); int sum = 0; foreach (byte b in checkData) { sum += b; } int count = sum % 256; if (count == checksum) { entity = new TcpVisionEntity(); entity.Checksum = checksum; } else { return null; } int index = 2; //取序列号 entity.SN = new byte[2] { bytes[index], bytes[index + 1] }; index += 2; //取时间戳 entity.Timestamp = new byte[4] { bytes[index], bytes[index + 1], bytes[index + 2], bytes[index + 3] }; index += 4; //取命令字 entity.Command = bytes[index]; index += 1; //取数据位长度 entity.DataLength = bytes[index]; index += 1; //取数据位 byte[] dataBytes = new byte[entity.DataLength]; Array.Copy(bytes, index, dataBytes, 0, entity.DataLength); entity.DataBytes = dataBytes; index += entity.DataLength; return entity; } /// /// 装包发送数据 /// /// 序列号 /// 命令字 /// 数据体 /// public static byte[] DataCombine(byte[] SN, byte Command, byte[] data) { byte[] message = new byte[12 + data.Length]; int index = 0; //head message[index++] = 0x55; message[index++] = 0xAA; //SN message[index++] = SN[0]; message[index++] = SN[1]; //timestamp // 获取当前时间的Unix时间戳,表示自1970-01-01以来的秒数 int unixTimestamp = (int)(DateTimeOffset.UtcNow.ToUnixTimeSeconds()); // 将时间戳转换为字节数组 byte[] timestampBytes = BitConverter.GetBytes(unixTimestamp); if (BitConverter.IsLittleEndian) { Array.Reverse(timestampBytes); } message[index++] = timestampBytes[0]; message[index++] = timestampBytes[1]; message[index++] = timestampBytes[2]; message[index++] = timestampBytes[3]; //command message[index++] = Command; //datalength message[index++] = (byte)data.Length; foreach (byte b in data) message[index++] = b; //CRC int checkDatalength = message.Length - 2; byte[] checkData = new byte[checkDatalength]; Array.Copy(message, 0, checkData, 0, checkDatalength); int sum = 0; foreach (byte b in checkData) sum += b; int count = sum % 256; message[index++] = (byte)count; //end message[index++] = 0xEE; return message; } public static byte[] GetCurrentUnixTimestampAsBytes() { // 获取当前的Unix时间戳,表示自1970-01-01以来的秒数 int unixTimestamp = (int)(DateTimeOffset.UtcNow.ToUnixTimeSeconds()); // 将时间戳转换为字节数组 byte[] bytes = BitConverter.GetBytes(unixTimestamp); return bytes; } } }