/// <summary> /// Disposing /// </summary> public void Dispose() { if (!IsDisposed) { Logger.Info("Остановка трекера..."); // Сигналим об остановке сервера StopEvent.Set(); // Обновляем состояние подключения трекера if (GpsTrackerData != null) { GpsTrackerData.ConnectionStatus = TrackerConnectionStatus.Offline.ToString(); DataCrud.UpdateGpsTracker(GpsTrackerData); } // Закрываем соединение TcpClient.Close(); // Ждем максимум 10 секунд пока основной поток остановиться var timeElapsed = 0; while (DataThread != null && DataThread.IsAlive) { Thread.Sleep(100); if (timeElapsed++ == 100) { DataThread.Abort(); } } Logger.Info("Трекер остановлен"); IsDisposed = true; } }
/// <summary> /// Проверяем есть ли в нашей базе запись о данном трекере /// </summary> /// <param name="frame"></param> protected void CheckHandshake(TrackerFrame frame) { // Если есть данные по трекеру значит все хорошо if (GpsTrackerData != null) { return; } using (var dc = new GpsTrackerDataContext()) { var tracker = (from obj in dc.GpsTracker where obj.DeviceId == frame.DeviceIdString select obj).FirstOrDefault(); // Если вообще в базе нет трекера с таким ID то создаем его if (tracker == null) { Logger.InfoFormat("Подключенный трекер не обнаружен в базе данных. В базе данных будет создан новый трекер (id {0}).", frame.DeviceIdString); var dataGpsTracker = new DataGpsTracker() { Phone = frame.DeviceIdString, DeviceId = frame.DeviceIdString, ResponseInterval = 30, Comment = "Автоматически создан сервером", ConnectionStatus = TrackerConnectionStatus.Online.ToString(), Status = TrackerStatus.Disabled.ToString(), Name = String.Format("tracker#{0}", frame.DeviceIdString) }; DataCrud.CreateGpsTracker(dataGpsTracker); } else { GpsTrackerData = tracker; GpsTrackerData.ConnectionStatus = TrackerConnectionStatus.Online.ToString(); DataCrud.UpdateGpsTracker(GpsTrackerData); } // Переименование логгера Logger = log4net.LogManager.GetLogger(String.Format("{0} [{1}:{2}]", MethodBase.GetCurrentMethod().DeclaringType, TcpClient.Client.RemoteEndPoint, DeviceId)); } }