using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AIK.Common.AIKProtocol { public class AIKCommunication { /// /// 数据包总包数 /// public int TotalPackets { get; set; } = 0; /// /// 发送的文件数据(bin文件) /// public byte[] FileData { get; set; } /// /// 当前正在发送包的索引 /// public int CurrentIndex { get; set; } = 0; private readonly object _sendLock = new object(); private bool _isSending = false; /// /// 所有数据包是否完成发送 /// private bool _isAllSendSuccess = false; #region 数据包发送 /// /// 发送起始码,建立连接使用 /// /// public byte[] GetStartFrame() { var buf = new byte[8] { 0XA5, 0X5E, 0XAA, 0XBB, 0XCC, 0XDD, 0X00, 0X00 }; return buf; } /// /// 发送头帧 /// /// public async Task SendHeader(string sourceitem) { List bytes = new List(); bytes.Add(0x01); bytes.Add(0x00); bytes.Add(0xFF); int lastSlashIndex = sourceitem.LastIndexOf('/'); string fileName = lastSlashIndex >= 0 ? sourceitem.Substring(lastSlashIndex + 1) : sourceitem; byte[] filenamedata = Encoding.Default.GetBytes(fileName); bytes.AddRange(filenamedata); bytes.Add(0x00); //string sourceitem = "/keys/bin/1.bin"; //string sourceitem = "/keys/bin/(7926)AiLiSheng47DaiA_DaiZuoYouCeHuaMen13NianHou.bin"; //FileData = await WebHelper.GetVehKeyBin(sourceitem); if (FileData == null) { return; } TotalPackets = FileData.Length / 1024; byte[] DataBuffdata = Encoding.Default.GetBytes(FileData.Length.ToString()); bytes.AddRange(DataBuffdata); bytes.Add(0x00); if (bytes.Count < 128) { int copi = 128 + 3 - bytes.Count; for (int i = 0; i < copi; i++) { bytes.Add(0x00); } } var cdata = new byte[128]; Array.Copy(bytes.ToArray(), 3, cdata, 0, 128); var crc = ProtocolHelper.CalculateCRC16(cdata); var CRCHigh = (byte)((crc >> 8) & 0xFF); var CRCLow = (byte)(crc & 0xFF); bytes.Add((byte)CRCHigh); bytes.Add((byte)CRCLow); var rdata = bytes.ToArray(); await WriteLargeDataFrame(rdata, 100); } /// /// 发送数据帧 /// /// /// public async Task SendDataFrame(int page) { bool flag = false; var rdata = GetSendDataFrame(page, FileData); bool success = await WriteLargeDataFrame(rdata.ToArray(), 100); if (success) { flag = true; } else { Debug.WriteLine("TestData发送失败"); } return flag; } /// /// 发送结束帧 /// /// public async Task SendEOTFrame() { var rdata = new byte[133]; rdata[0] = 0x01; rdata[1] = 0x00; rdata[2] = 0xFF; await WriteLargeDataFrame(rdata, 100); } /// /// 根据包页及文件数据获取数据帧 /// /// /// /// private List GetSendDataFrame(int page, byte[] filedata) { try { var bytes = new List(); if (page == filedata.Length / 1024 && filedata.Length % 1024 == 0) { return bytes; } bytes.Add(0x02); bytes.Add((byte)(page)); bytes.Add((byte)~(page)); if (page == filedata.Length / 1024 - 1 && filedata.Length % 1024 <= 128 && filedata.Length % 1024 > 0) { var cdata = new byte[128]; Array.Copy(filedata, page * 1024, cdata, 0, filedata.Length - page * 1024); var crc = ProtocolHelper.CalculateCRC16(cdata); var CRCHigh = (byte)((crc >> 8) & 0xFF); var CRCLow = (byte)(crc & 0xFF); bytes.AddRange(cdata); bytes.Add((byte)CRCHigh); bytes.Add((byte)CRCLow); } else { var cdata = new byte[1024]; var arrarycount = 1024; if (filedata.Length - page * 1024 > 0 && filedata.Length - page * 1024 < 1024) { arrarycount = filedata.Length - page * 1024; } Array.Copy(filedata, page * 1024, cdata, 0, arrarycount); var crc = ProtocolHelper.CalculateCRC16(cdata); var CRCHigh = (byte)((crc >> 8) & 0xFF); var CRCLow = (byte)(crc & 0xFF); bytes.AddRange(cdata); bytes.Add((byte)CRCHigh); bytes.Add((byte)CRCLow); } return bytes; } catch (Exception ex) { throw; } } #endregion #region 写入数据帧 /// /// 分包发送大数据 /// public async Task WriteLargeDataFrame(byte[] data, int maxPacketSize = 100) { try { Debug.WriteLine($"开始发送数据,总长度: {data.Length} 字节,分包大小: {maxPacketSize} 字节"); int totalPackets = (int)Math.Ceiling((double)data.Length / maxPacketSize); int successfulPackets = 0; for (int i = 0; i < totalPackets; i++) { int offset = i * maxPacketSize; int length = Math.Min(maxPacketSize, data.Length - offset); byte[] packet = new byte[length]; Array.Copy(data, offset, packet, 0, length); bool packetSuccess = await WritePacketDataFrame(packet, i + 1, totalPackets); if (packetSuccess) { successfulPackets++; } else { Debug.WriteLine($"第 {i + 1} 包发送失败"); // 可以选择重试或直接失败 // return false; } // 添加小延迟,避免发送过快 await Task.Delay(30); } bool overallSuccess = successfulPackets == totalPackets; Debug.WriteLine($"数据发送完成: {successfulPackets}/{totalPackets} 包成功"); return overallSuccess; } catch (Exception ex) { Debug.WriteLine($"发送大数据异常: {ex.Message}"); return false; } } /// /// 发送单个数据包 /// private async Task WritePacketDataFrame(byte[] packet, int packetNumber, int totalPackets) { try { return true; } catch (Exception ex) { Debug.WriteLine($"发送第 {packetNumber} 包异常: {ex.Message}"); return false; } } #endregion } }