Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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());
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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
            };
        }
Ejemplo n.º 6
0
        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)
            };
        }
Ejemplo n.º 7
0
 public ProcessingCode ProcessPacket(EgtsPacket packet)
 {
     return(ProcessingCode.EGTS_PC_OK);
 }