Beispiel #1
0
        public ProcessingCode ProcessServiceDataRecord(ServiceDataRecord record)
        {
            if (record.RecipientService != Service.EGTS_TELEDATA_SERVICE)
            {
                return(ProcessingCode.EGTS_PC_SRVC_NFOUND);
            }

            foreach (ServiceDataSubrecord subrecord in record.RecordData)
            {
                if (subrecord.Type != SubrecordType.EGTS_SR_POS_DATA)
                {
                    continue;
                }

                if (subrecord.Data is PosDataSubrecord pos)
                {
                    DAL.PosData data = new DAL.PosData
                    {
                        Id        = record.ObjectID,
                        Time      = pos.NavigationTime,
                        Lat       = pos.Latitude,
                        Lon       = pos.Longitude,
                        Direction = pos.Direction,
                        Speed     = pos.Speed,
                        Odometer  = pos.Odometer,
                        Actual    = pos.Actual,
                        Valid     = pos.Valid,
                        Moving    = pos.Moving
                    };
#if DEBUG
                    System.Console.Write("RECORD #{0}", record.RecordNumber);
                    System.Console.Write("\tTIME={0}; ID={1}; LAT={2}; LON={3}; DIR={4}; SPD={5}; ODM={6}; VLD={7}; ACT={8}; MOV={9}",
                                         data.Time, data.Id, data.Lat, data.Lon, data.Direction, data.Speed, data.Odometer, data.Valid, data.Actual, data.Moving);
#endif
                    try
                    {
                        Storage.WritePosData(record.ObjectID, data);
                        geoService.PutPosData(data.Id, data.Time, data.Lat, data.Lon, data.Direction, data.Speed, data.Odometer, data.Valid, data.Actual, data.Moving);
#if DEBUG
                        System.Console.ForegroundColor = System.ConsoleColor.Green;
                        System.Console.WriteLine("\t[ SUCCESS ]");
                        System.Console.ForegroundColor = System.ConsoleColor.White;
#endif
                    }
                    catch (System.Exception e)
                    {
                        System.Console.ForegroundColor = System.ConsoleColor.Red;
                        System.Console.WriteLine("\t[ FAIL ]");
                        System.Console.WriteLine(e);
                        System.Console.ForegroundColor = System.ConsoleColor.White;
                    }
                }
            }
            return(ProcessingCode.EGTS_PC_OK);
        }
Beispiel #2
0
        public ProcessingCode ProcessServiceDataRecord(ServiceDataRecord record)
        {
            if (record.RecipientService != Service.EGTS_TELEDATA_SERVICE)
            {
                Log.Debug("В записи {RecordNumber} указан неподдерживаемый сервис {RecipientService}. Результат процессинга {ProcessingCode}"
                          , record.RecordNumber, record.RecipientService, ProcessingCode.EGTS_PC_SRVC_NFOUND);

                return(ProcessingCode.EGTS_PC_SRVC_NFOUND);
            }

            foreach (ServiceDataSubrecord subrecord in record.RecordData)
            {
                if (subrecord.Type != SubrecordType.EGTS_SR_POS_DATA)
                {
                    Log.Debug("Не задан обработчик для подзаписи типа {SubrecordType}", subrecord.Type);
                    continue;
                }

                if (subrecord.Data is PosDataSubrecord pos)
                {
                    DAL.PosData data = new DAL.PosData
                    {
                        Id        = record.ObjectID,
                        Time      = pos.NavigationTime,
                        Lat       = pos.Latitude,
                        Lon       = pos.Longitude,
                        Direction = pos.Direction,
                        Speed     = pos.Speed,
                        Odometer  = pos.Odometer,
                        Actual    = pos.Actual,
                        Valid     = pos.Valid,
                        Moving    = pos.Moving
                    };

                    Log.Information("Получены координаты по трекеру {ObjectId} от {NavigationTime}. Номер записи {RecordNumber}", data.Id, data.Time, record.RecordNumber);
                    Log.Verbose("{@PosData}", data);

                    try
                    {
                        //Storage.WritePosData(record.ObjectID, data);
                        geoService.PutPosData(data.Id, data.Time, data.Lat, data.Lon, data.Direction, data.Speed, data.Odometer, data.Valid, data.Actual, data.Moving);
                        Log.Debug("Данные отправлены в сервис.");
                    }
                    catch (System.Exception e)
                    {
                        Log.Error(e, "Не удалось отправить данные в сервис.");
                    }
                }
            }
            return(ProcessingCode.EGTS_PC_OK);
        }
Beispiel #3
0
        private void ParseRecord(ref byte[] data, int firstByte, ref ServiceDataRecord record)
        {
            int bytesRead = 0;

            while (bytesRead != record.RecordLength)
            {
                ServiceDataSubrecord subrecord = new ServiceDataSubrecord
                {
                    Type   = (SubrecordType)data[firstByte + 0],
                    Length = BitConverter.ToUInt16(data, firstByte + 1)
                };

                subrecordParsers.TryGetValue(subrecord.Type, out SubrecordParserDel parser);
                parser?.Invoke(ref data, (firstByte + 3), ref subrecord);

                record.RecordData.Add(subrecord);

                bytesRead  = (bytesRead + subrecord.Length + 3);
                firstByte += (subrecord.Length + 3);
            }
        }
Beispiel #4
0
        public ProcessingCode ProcessServiceDataRecord(ServiceDataRecord record)
        {
            Console.WriteLine("        Service Layer Record:");
            Console.WriteLine("        ---------------------");
            Console.WriteLine("            Record Length             - {0}", record.RecordLength);
            Console.WriteLine("            Record Number             - {0}", record.RecordNumber);
            Console.WriteLine("            Record flags");
            Console.WriteLine("                Sourse Service On Device    - {0}", record.SourceServiceOnDevice);
            Console.WriteLine("                Recipient Service On Device - {0}", record.RecipientServiceOnDevice);
            Console.WriteLine("                Group Flag                  - {0}", record.Group);
            Console.WriteLine("                Record Processing Priority  - {0}", record.ProcessingPriority);
            Console.WriteLine("                Time Field Exists           - {0}", record.TimeFieldExists);
            Console.WriteLine("                Event ID Field Exists       - {0}", record.EventFieldExists);
            Console.WriteLine("                Object ID Field Exists      - {0}", record.ObjectFieldExists);
            Console.WriteLine("            Object Identifier         - {0}", record.ObjectID);
            Console.WriteLine("            Time                      - {0} ({1})", record.TM, record.Time);
            Console.WriteLine("            Source Service Type       - {0}", record.SourceService);
            Console.WriteLine("            Recipient Service Type    - {0}", record.RecipientService);
            Console.WriteLine();

            if (record.RecipientService != Service.EGTS_TELEDATA_SERVICE)
            {
                return(ProcessingCode.EGTS_PC_SRVC_NFOUND);
            }

            foreach (ServiceDataSubrecord subrecord in record.RecordData)
            {
                Console.WriteLine("            Subrecord Data:");
                Console.WriteLine("            ---------------");
                Console.WriteLine("                Subrecord Type             - {0}", subrecord.Type);
                Console.WriteLine("                Subrecord Length           - {0}", subrecord.Length);

                SubrecordDataProc.TryGetValue(subrecord.Type, out Action <ServiceDataRecord, SubrecordData> proc);
                proc?.Invoke(record, subrecord.Data);
            }

            return(ProcessingCode.EGTS_PC_OK);
        }
Beispiel #5
0
        private void ProcessPosDataSubrecord(ServiceDataRecord recod, SubrecordData subrecordData)
        {
            PosDataSubrecord pos = subrecordData as PosDataSubrecord;

            if (pos == null)
            {
                return;
            }

            Console.WriteLine("                Navigation Time            - {0} ({1})", pos.NTM, pos.NavigationTime);
            Console.WriteLine("                Latitude                   - {0}", pos.Latitude);
            Console.WriteLine("                Longitude                  - {0}", pos.Longitude);
            Console.WriteLine("                Flags");
            Console.WriteLine("                   Moving                  - {0}", pos.Moving);
            Console.WriteLine("                   Actual                  - {0}", pos.Actual);
            Console.WriteLine("                   Valid                   - {0}", pos.Valid);
            Console.WriteLine("                Speed                      - {0}", pos.Speed);
            Console.WriteLine("                Direction                  - {0}", pos.Direction);
            Console.WriteLine("                Odometer                   - {0}", pos.Odometer);
            Console.WriteLine("                Altitude                   - {0}", pos.Altitude);
            Console.WriteLine();
            Console.WriteLine();
        }
Beispiel #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)
            };
        }
Beispiel #7
0
        private void ParseServiceDataRecords(ref byte[] data)
        {
            int bytesRead = 0;
            int firstByte = Packet.Header.HeaderLength;

            while (bytesRead != Packet.Header.FrameDataLength)
            {
                int offset = 0;
                ServiceDataRecord record = new ServiceDataRecord();

                record.RecordLength = BitConverter.ToUInt16(data, firstByte + offset);
                offset += 2;

                record.RecordNumber = BitConverter.ToUInt16(data, firstByte + offset);
                offset += 2;

                #region Record Flags
                byte flags = data[firstByte + offset];
                offset += 1;

                record.SourceServiceOnDevice    = (flags & (byte)(RecordFlags.SSOD)) == (byte)RecordFlags.SSOD;
                record.RecipientServiceOnDevice = (flags & (byte)(RecordFlags.RSOD)) == (byte)RecordFlags.RSOD;
                record.Group = (flags & (byte)(RecordFlags.GRP)) == (byte)RecordFlags.GRP;
                record.ProcessingPriority = (Priority)((flags & (byte)(RecordFlags.RPP)) >> 3);
                record.TimeFieldExists    = (flags & (byte)(RecordFlags.TMFE)) == (byte)RecordFlags.TMFE;
                record.EventFieldExists   = (flags & (byte)(RecordFlags.EVFE)) == (byte)RecordFlags.EVFE;
                record.ObjectFieldExists  = (flags & (byte)(RecordFlags.OBFE)) == (byte)RecordFlags.OBFE;
                #endregion

                if (record.ObjectFieldExists)
                {
                    record.ObjectID = BitConverter.ToUInt32(data, firstByte + offset);
                    offset         += 4;
                }

                if (record.EventFieldExists)
                {
                    record.EventID = BitConverter.ToUInt32(data, firstByte + offset);
                    offset        += 4;
                }

                if (record.TimeFieldExists)
                {
                    record.TM = BitConverter.ToUInt32(data, firstByte + offset);
                    offset   += 4;
                }

                record.SourceService = (Service)data[firstByte + offset];
                offset += 1;

                record.RecipientService = (Service)data[firstByte + offset];
                offset += 1;

                ParseRecord(ref data, (firstByte + offset), ref record);

                firstByte = (firstByte + offset + record.RecordLength);
                bytesRead = (bytesRead + offset + record.RecordLength);

                Packet.ServiceFrameData.ServiceDataRecords.Add(record);
            }
        }