public void OnFeedbackMessage(TrackerFrame frame) { try { var gpsLocation = new GpsLocation(frame.MessageBody); Logger.InfoFormat("Получены координаты трекера: {0}", gpsLocation.ToString()); var gpsData = new DataGpsData { TrackerId = GpsTrackerData.Id, GpsDate = gpsLocation.Date, CreateDate = DateTime.UtcNow, Latitude = gpsLocation.Latitude, LatitudeIndicator = gpsLocation.LatitudeIndicator, Longitude = gpsLocation.Longitude, LongitudeIndicator = gpsLocation.LongitudeIndicator, Speed = gpsLocation.Speed, Orientation = gpsLocation.Orientation, AvailabilityData = gpsLocation.AvailabilityData, IoState = gpsLocation.IoState, MilePost = gpsLocation.MilePost, MileData = gpsLocation.MileData, }; DataCrud.CreateGpsData(gpsData); } catch (Exception ex) { Logger.Error("Ошибка при обработке полученных координат", ex); } }
/// <summary> /// Отправка фрейма данных /// </summary> /// <param name="command"></param> /// <param name="messageBody"></param> protected void SendFrame(TrackerCommand command, string messageBody) { TrackerFrame frame = null; try { frame = CreateFrame(command, messageBody); Logger.InfoFormat("Отправка фрейма {0}", frame.ToString()); TcpClient.Client.Send(frame.BlockData); } catch (Exception ex) { Logger.Error(String.Format("Ошибка при отправке фрейма {0}", frame == null ? "(фрейм не создан)" : frame.ToString()), ex); } }
/// <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)); } }
/// <summary> /// Получение фрейма /// </summary> /// <param name="frame">фрейм</param> protected void OnReceiveFrame(TrackerFrame frame) { Logger.DebugFormat("Получен фрейм {0}, команда {1}", frame.ToString(), frame.Command.CommandType.Description); // Проверка CheckHandshake(frame); // Если обработчик ответа не указан то выходим if (String.IsNullOrEmpty(frame.Command.CommandType.AnswerHandlerFunction)) { return; } // Имем обработчик var handler = GetType().GetMethod(frame.Command.CommandType.AnswerHandlerFunction); if (handler == null) { throw new Exception(String.Format("Функция обработки ответа не найдена: {0}", frame.Command.CommandType.AnswerHandlerFunction)); } // Вызов обработчика handler.Invoke(this, new object[] { frame }); }
/// <summary> /// Авторизация /// </summary> /// <param name="frame"></param> public void OnLoginCommand(TrackerFrame frame) { // Согласно спецификации SendFrame("AP05"); }
/// <summary> /// Рукопожатие /// </summary> /// <param name="frame"></param> public void OnHandshakeCommand(TrackerFrame frame) { // Согласно спецификации SendFrame("AP01", "HSO"); }
/// <summary> /// Создание фрейма команды /// </summary> /// <param name="command"></param> /// <param name="messageBody"></param> /// <returns></returns> public TrackerFrame CreateFrame(TrackerCommand command, string messageBody) { return(TrackerFrame.NewFrame(DeviceId, command, messageBody)); }