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); }
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); }
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); } }
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); }
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(); }
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) }; }
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); } }