public byte[] ProcessData(byte[] data) { Builder.BuildFromBytes(data); EgtsPacket inPacket = Builder.GetPacket(); ProcessingResult procResult = new ProcessingResult(); ProcessingCode code = CheckPacket(inPacket, data); if (code == ProcessingCode.EGTS_PC_OK) { inPacket.SetProcessor(PacketProcessor); inPacket.Process(ref procResult); } else { procResult.PacketId = inPacket.Header.PID; procResult.Result = code; } Builder.BuildFromProcessingResult(procResult); EgtsPacket outPacket = Builder.GetPacket(); return(outPacket.GetBytes()); }
public byte[] ProcessData(byte[] data) { Builder.BuildFromBytes(data); EgtsPacket inPacket = Builder.GetPacket(); Log.Debug("Получен пакет EGTS {@packet}", inPacket); ProcessingResult procResult = new ProcessingResult(); ProcessingCode code = CheckPacket(inPacket, data); if (code == ProcessingCode.EGTS_PC_OK) { Log.Debug("Результат проверки полученного пакета #{PacketId} - {ProcessingCode}", inPacket.Header.PID, code); inPacket.SetProcessor(PacketProcessor); inPacket.Process(ref procResult); } else { Log.Warning("Результат проверки полученного пакета #{PacketId} - {ProcessingCode}", inPacket.Header.PID, code); procResult.PacketId = inPacket.Header.PID; procResult.Result = code; } Builder.BuildFromProcessingResult(procResult); EgtsPacket outPacket = Builder.GetPacket(); return(outPacket.GetBytes()); }
public ProcessingCode ProcessPacket(EgtsPacket packet) { Console.WriteLine("EGTS Transport Layer:"); Console.WriteLine("---------------------"); Console.WriteLine(" Protocol version - {0}", packet.Header.ProtocolVersion); Console.WriteLine(" Security Key ID - {0}", packet.Header.SecurityKeyId); Console.WriteLine(" Flags"); Console.WriteLine(" Prefix - {0}", packet.Header.Prefix); Console.WriteLine(" Route - {0}", packet.Header.Route); Console.WriteLine(" Encryption Alg - {0}", packet.Header.EncryptionAlgorithm); Console.WriteLine(" Compression - {0}", packet.Header.Compressed); Console.WriteLine(" Priority - {0}", packet.Header.Priority); Console.WriteLine(" Header Length - {0}", packet.Header.HeaderLength); Console.WriteLine(" Header Encoding - {0}", packet.Header.HeaderEncoding); Console.WriteLine(" Frame Data Length - {0}", packet.Header.FrameDataLength); Console.WriteLine(" Packet ID - {0}", packet.Header.PID); Console.WriteLine(" Header Check Sum - {0}", packet.Header.CRC); Console.WriteLine(); Console.WriteLine("EGTS Service Layer:"); Console.WriteLine("-------------------"); Console.WriteLine(" Packet Type - {0}", packet.Header.Type); Console.WriteLine(" Service Layer CS - {0}", packet.CRC); Console.WriteLine(); return(ProcessingCode.EGTS_PC_OK); }
private ProcessingCode CheckPacket(EgtsPacket packet, byte[] source) { // Check protocol version support if (packet.Header.ProtocolVersion != 1 || packet.Header.Prefix != 0) { return(ProcessingCode.EGTS_PC_UNS_PROTOCOL); } // Check header length if (packet.Header.HeaderLength != 11 && packet.Header.HeaderLength != 16) { return(ProcessingCode.EGTS_PC_INC_HEADERFORM); } // Check header CRC if (Validator.GetCrc8(source, (ushort)(packet.Header.HeaderLength - 1)) != packet.Header.CRC) { return(ProcessingCode.EGTS_PC_HEADERCRC_ERROR); } // TODO: add routing check // Check if FDL is zero if (packet.Header.FrameDataLength == 0) { return(ProcessingCode.EGTS_PC_OK); } // Check header CRC if (packet.Header.FrameDataLength > 0 && Validator.GetCrc16(source, packet.Header.HeaderLength, packet.Header.FrameDataLength) != packet.CRC) { return(ProcessingCode.EGTS_PC_DATACRC_ERROR); } // Any encryption algorythm isn't supported if (packet.Header.EncryptionAlgorithm != 0) { return(ProcessingCode.EGTS_PC_DECRYPT_ERROR); } // Compression isn't supported if (packet.Header.Compressed) { return(ProcessingCode.EGTS_PC_INC_DATAFORM); } // No errors return(ProcessingCode.EGTS_PC_OK); }
public EgtsPacketBuilder() { Packet = new EgtsPacket(); serviceFrameParsers = new Dictionary <PacketType, ServiceFrameParserDel>() { { PacketType.EGTS_PT_APPDATA, ParseAppdataPacket }, { PacketType.EGTS_PT_SIGNED_APPDATA, ParseSignedAppdataPacket }, { PacketType.EGTS_PT_RESPONSE, ParseResponsePacket } }; subrecordParsers = new Dictionary <SubrecordType, SubrecordParserDel>() { { SubrecordType.EGTS_SR_POS_DATA, ParsePosDataSubrecord } // TODO: Add all parsers for the subrecords }; }
public void BuildFromProcessingResult(ProcessingResult result) { ResponsePacket response = new ResponsePacket { ResponseTo = result.PacketId, ResultCode = result.Result }; foreach (ProcessingResult.RecordResult recResult in result.RecResults) { // subrecord data SubrecordResponse subrecord = new SubrecordResponse { ConfirmedRecord = recResult.Record.RecordNumber, Result = (byte)recResult.Result }; // record data ServiceDataSubrecord recordData = new ServiceDataSubrecord { Data = subrecord, Length = (ushort)subrecord.GetBytes().Length, Type = SubrecordType.EGTS_SR_RECORD_RESPONSE }; // Record ServiceDataRecord record = new ServiceDataRecord { EventFieldExists = false, ObjectFieldExists = recResult.Record.ObjectFieldExists, ObjectID = recResult.Record.ObjectID, ProcessingPriority = recResult.Record.ProcessingPriority, RecipientService = recResult.Record.SourceService, RecipientServiceOnDevice = recResult.Record.SourceServiceOnDevice, RecordNumber = recResult.Record.RecordNumber, SourceService = recResult.Record.RecipientService, SourceServiceOnDevice = recResult.Record.RecipientServiceOnDevice, TimeFieldExists = false, RecordLength = (ushort)recordData.GetBytes().Length, // only one subrecord ib RecordData }; record.RecordData.Add(recordData); response.ServiceDataRecords.Add(record); } TransportHeader header = new TransportHeader { Compressed = false, HeaderEncoding = 0, PID = result.PacketId, Prefix = 0, Priority = Priority.Highest, ProtocolVersion = 1, Route = false, SecurityKeyId = 0, Type = PacketType.EGTS_PT_RESPONSE, FrameDataLength = (ushort)response.GetBytes().Length, HeaderLength = 11 // TODO: calculate HeaderLength }; header.CRC = Validator.GetCrc8(header.GetBytes(), (ushort)(header.HeaderLength - 1)); Packet = new EgtsPacket { Header = header, ServiceFrameData = response, CRC = Validator.GetCrc16(response.GetBytes(), 0, header.FrameDataLength) }; }
public ProcessingCode ProcessPacket(EgtsPacket packet) { return(ProcessingCode.EGTS_PC_OK); }