Esempio n. 1
0
        public static bool ReceivedCoordinates(int trackId, TrackPointList trackPointList)
        {
            TrackMaintainer worker;

            lock (Maintainers)
            {
                worker = Maintainers.FirstOrDefault(x => x.Track.Id == trackId);
                if (worker == null)
                {
                    worker = new TrackMaintainer(trackId);
                    Maintainers.Add(worker);
                }
            }

            try
            {
                return(worker.SaveNewCoordinates(trackPointList));
            }
            catch (Exception e)
            {
                lock (Maintainers)
                {
                    worker.Close();
                    Maintainers.Remove(worker);                     //Убираем поломаный воркер
                }
                logger.Error(e, "На обработке трека {0}", trackId);
                return(false);
            }
        }
        public bool SendCoordinates(string authKey, int trackId, TrackPointList TrackPointList)
        {
            RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)OperationContext.Current.IncomingMessageProperties [RemoteEndpointMessageProperty.Name];

            if (prop != null)
            {
                logger.Info(RusNumber.Case(TrackPointList.Count, "Получена {3} координата по треку", "Получено {3} координаты по треку", "Получено {3} координат по треку")
                            + " {0} c ip{1}:{2}", trackId, prop.Address, prop.Port, TrackPointList.Count);
            }

            if (!CheckAuth(authKey))
            {
                return(false);
            }

            return(TracksService.ReceivedCoordinates(trackId, TrackPointList));
        }
Esempio n. 3
0
        public bool SaveNewCoordinates(TrackPointList trackPointList)
        {
            lock (BusyLock)
            {
                if (IsBusy)
                {
                    logger.Warn("Пакет координат для трека {0} еще обрабатывается. Отменяем получение следующего пакета.");
                    return(false);
                }
                IsBusy = true;
            }
            var result = Save(trackPointList);

            lock (BusyLock)
            {
                IsBusy = false;
            }
            return(result);
        }
Esempio n. 4
0
        private bool Save(TrackPointList trackPointList)
        {
            LastActive = DateTime.Now;
            DateTime startOp = DateTime.Now;
            var      DecimalSeparatorFormat = new NumberFormatInfo {
                NumberDecimalSeparator = ".", NumberGroupSeparator = ","
            };
            var CommaSeparatorFormat = new NumberFormatInfo {
                NumberDecimalSeparator = ",", NumberGroupSeparator = "."
            };

            //Подготовка полученных координат.
            var receivedPoints = new Dictionary <DateTime, Vodovoz.Domain.Logistic.TrackPoint>();

            foreach (TrackPoint tp in trackPointList)
            {
                var    trackPoint = new Vodovoz.Domain.Logistic.TrackPoint();
                Double Latitude, Longitude;
                if (!Double.TryParse(tp.Latitude, NumberStyles.Float, DecimalSeparatorFormat, out Latitude) &&
                    !Double.TryParse(tp.Latitude, NumberStyles.Float, CommaSeparatorFormat, out Latitude))
                {
                    logger.Error("Не получилось разобрать координату широты: {0}", tp.Latitude);
                    return(false);
                }
                if (!Double.TryParse(tp.Longitude, NumberStyles.Float, DecimalSeparatorFormat, out Longitude) &&
                    !Double.TryParse(tp.Longitude, NumberStyles.Float, CommaSeparatorFormat, out Longitude))
                {
                    logger.Error("Не получилось разобрать координату долготы: {0}", tp.Longitude);
                    return(false);
                }
                trackPoint.Latitude  = Latitude;
                trackPoint.Longitude = Longitude;
                trackPoint.TimeStamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(long.Parse(tp.TimeStamp)).ToLocalTime();
                //Округляем время до секунд.
                trackPoint.TimeStamp = new DateTime(trackPoint.TimeStamp.Year, trackPoint.TimeStamp.Month, trackPoint.TimeStamp.Day, trackPoint.TimeStamp.Hour, trackPoint.TimeStamp.Minute, trackPoint.TimeStamp.Second);

                if (receivedPoints.ContainsKey(trackPoint.TimeStamp))
                {
                    logger.Warn("Для секунды {0} трека {1}, присутствует вторая пара координат, пропускаем что бы округлить трек с точностью не чаще раза в секунду.", trackPoint.TimeStamp, Track.Id);
                    continue;
                }
                receivedPoints.Add(trackPoint.TimeStamp, trackPoint);
            }

            var minTime = receivedPoints.Keys.Min();

            //Проверяем не были ли координаты получены ранее.
            foreach (var existPoint in Track.TrackPoints.Where(p => p.TimeStamp >= minTime && receivedPoints.ContainsKey(p.TimeStamp)))
            {
                var trackPoint = receivedPoints[existPoint.TimeStamp];
                if (Math.Abs(existPoint.Latitude - trackPoint.Latitude) < 0.00000001 && Math.Abs(existPoint.Longitude - trackPoint.Longitude) < 0.00000001)
                {
                    logger.Warn("Координаты на время {0} для трека {1}, были получены повторно поэтому пропущены.", trackPoint.TimeStamp, existPoint.Track.Id);
                }
                else
                {
                    logger.Warn($"Координаты на время {trackPoint.TimeStamp} для трека {existPoint.Track.Id}, были получены повторно и изменены " +
                                $"lat: {existPoint.Latitude} -> {trackPoint.Latitude} log: {existPoint.Longitude} -> {trackPoint.Longitude}");
                    existPoint.Latitude  = trackPoint.Latitude;
                    existPoint.Longitude = trackPoint.Longitude;
                }
                receivedPoints.Remove(existPoint.TimeStamp);
            }

            //Записываем полученные координаты.
            foreach (var trackPoint in receivedPoints.Values)
            {
                trackPoint.Track = Track;
                Track.TrackPoints.Add(trackPoint);
            }

            uow.Save();
            logger.Info("Обработаны координаты для трека {0} за {1} сек.", Track.Id, (DateTime.Now - startOp).TotalSeconds);
            return(true);
        }