/// <summary> /// Функция сбора пакета /// </summary> /// <param name="lowCommand">Низкоуровневая команда</param> /// <param name="data">Данные, усекается до 65529</param> /// <returns></returns> private byte[] AssemblyRawPack(LowCommandsRequest lowCommand, byte[] data) { buffWriter.Clear(); buffWriter.WriteUInt16((ushort)(2 + 1 + 1 + (data == null ? 0 : data.Length > 65530 ? 65530 : data.Length + 1))); buffWriter.WriteUInt8((byte)lowCommand); buffWriter.WriteUInt8(CRC8.ComputeChecksum(0, 3, buffWriter.ReadBytes(3))); if (data != null) { buffWriter.WriteBytes(data); buffWriter.WriteUInt8(CRC8.ComputeChecksum(0, data.Length, data)); } return(buffWriter.ToByteArray()); }
public bool HandleMessage(byte[] packet, int length) { /* * 0-1 - data length * 2 - LowCommandsRequest * 3 - crc8 (0-2) * N - LowCommands * D - data * N+D+1 - data crc8 */ buffReader.SetBuffer(false, packet, length); if (buffReader.IncomingBytes < 4) { return(false); } int fullLength = buffReader.ReadUInt16(); if (fullLength != buffReader.IncomingBytes) { return(false); } byte defCommand = buffReader.ReadUInt8(); if (!Enum.IsDefined(typeof(LowCommandsResponse), defCommand)) { return(false); } LowCommandsResponse command = (LowCommandsResponse)defCommand; buffReader.SetPosition(true, 0); if (CRC8.ComputeChecksum(0, 3, buffReader.ReadBytes(3)) != buffReader.ReadUInt8()) { return(false); } switch (command) { case LowCommandsResponse.System: return(this.SystemPacket()); case LowCommandsResponse.Data: break; case LowCommandsResponse.DataBroken: break; case LowCommandsResponse.ErrorCRC: break; case LowCommandsResponse.NotSupported: break; default: break; } return(true); }