using RRQMCore.ByteManager; using RRQMSocket; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ProjectManagementSystem.Device.CasunBox { public class BoxDataHandlingAdapter : DataHandlingAdapter { /// /// 获取已设置的数据包的长度 /// public int FixedSize { get; private set; } = 14; /// /// 临时包 /// private ByteBlock tempByteBlock; /// /// 包剩余长度 /// private int surPlusLength = 0; public BytePool BytePoolEx { get; set; } = new BytePool(); /// /// 预处理 /// /// protected override void PreviewReceived(ByteBlock byteBlock) { bool lightProtocol = byteBlock.Buffer[0] == 0x20 && byteBlock.Length % 16 == 0; bool callProtocol = byteBlock.Buffer[0] == 0x10 && byteBlock.Length % 14 == 0 && byteBlock.Buffer[byteBlock.Length - 1] == 0x03; //报警灯协议长度16 if (lightProtocol) { FixedSize = 16; if (this.tempByteBlock != null) { this.tempByteBlock.Dispose(); this.tempByteBlock = null; } } else if(callProtocol) { FixedSize = 14; if (this.tempByteBlock != null) { this.tempByteBlock.Dispose(); this.tempByteBlock = null; } } byte[] buffer = byteBlock.Buffer; int r = (int)byteBlock.Length; if (this.tempByteBlock == null) { SplitPackage(buffer, 0, r); } else { if (surPlusLength == r) { this.tempByteBlock.Write(buffer, 0, surPlusLength); PreviewHandle(this.tempByteBlock); this.tempByteBlock.Dispose(); this.tempByteBlock = null; surPlusLength = 0; } else if (surPlusLength < r) { this.tempByteBlock.Write(buffer, 0, surPlusLength); PreviewHandle(this.tempByteBlock); this.tempByteBlock.Dispose(); this.tempByteBlock = null; SplitPackage(buffer, surPlusLength, r); } else { this.tempByteBlock.Write(buffer, 0, r); surPlusLength -= r; } } } private void SplitPackage(byte[] dataBuffer, int index, int r) { while (index < r) { if (r - index >= this.FixedSize) { ByteBlock byteBlock = this.BytePoolEx.GetByteBlock(this.FixedSize); byteBlock.Write(dataBuffer, index, this.FixedSize); PreviewHandle(byteBlock); surPlusLength = 0; } else//半包 { this.tempByteBlock = this.BytePoolEx.GetByteBlock(this.FixedSize); surPlusLength = this.FixedSize - (r - index); this.tempByteBlock.Write(dataBuffer, index, r - index); } index += this.FixedSize; } } protected virtual void PreviewHandle(ByteBlock byteBlock) { try { if ((byteBlock.Buffer[0] == 0x10 && byteBlock.Length == 14 && byteBlock.Buffer[byteBlock.Length - 1] == 0x03) || (byteBlock.Buffer[0] == 0x20 && byteBlock.Length == 16)) { this.GoReceived(byteBlock, null); } } finally { byteBlock.Dispose(); } } protected override void PreviewSend(byte[] buffer, int offset, int length, bool isAsync) { this.GoSend(buffer, offset, length, isAsync); } } }