private XinAnGPSData ConvertBytesToEntityByFetch(byte[] sourceBuffer) { XinAnGPSData data = new XinAnGPSData(); GPSDataEntity entity = new GPSDataEntity(); byte[] destBuffer = null; //GPSCode destBuffer = new byte[4]; Array.Copy(sourceBuffer, 5, destBuffer, 0, 4); entity.GPSCode = GetGPSCode(destBuffer); data.FullGpsCode = base.CodePrefix + entity.GPSCode; //ReportTime destBuffer = new byte[6]; Array.Copy(sourceBuffer, 9, destBuffer, 0, 6); entity.ReportTime = Transfer.TransferBCDByteToDateTime(destBuffer); entity.ReceiveTime = DateTime.Now; //Latitude destBuffer = new byte[4]; Array.Copy(sourceBuffer, 15, destBuffer, 0, 4); entity.Latitude = (decimal)ReturnLatitude(GetLatitude(destBuffer), GetLatitudeMinute(destBuffer)); //Longitude destBuffer = new byte[4]; Array.Copy(sourceBuffer, 19, destBuffer, 0, 4); entity.Longitude = (decimal)ReturnLongitude(GetLongitude(destBuffer), GetLongitudeMinute(destBuffer)); //Speed destBuffer = new byte[2]; Array.Copy(sourceBuffer, 23, destBuffer, 0, 2); entity.Speed = GetSpeed(destBuffer); //Direction destBuffer = new byte[2]; Array.Copy(sourceBuffer, 25, destBuffer, 0, 2); entity.Direction = GetDirection(destBuffer); //PositionState destBuffer = new byte[1]; Array.Copy(sourceBuffer, 27, destBuffer, 0, 1); entity.IsLocatedData = GetPositionState(destBuffer); //AntennaState destBuffer = new byte[1]; Array.Copy(sourceBuffer, 27, destBuffer, 0, 1); entity.AntennaState = (int)GetAntennaeState(destBuffer); //PowerState destBuffer = new byte[1]; Array.Copy(sourceBuffer, 27, destBuffer, 0, 1); entity.PowerState = (int)GetPowerState(destBuffer); //Mileage destBuffer = new byte[3]; Array.Copy(sourceBuffer, 28, destBuffer, 0, 3); //GPS硬件计算的里程 entity.GPSDeviceMileage = (decimal)GetMileage(destBuffer); //ACCState destBuffer = new byte[1]; Array.Copy(sourceBuffer, 31, destBuffer, 0, 1); entity.ACCState = GetACCState(destBuffer); //OilState destBuffer = new byte[1]; Array.Copy(sourceBuffer, 31, destBuffer, 0, 1); entity.OilState = GetOilState(destBuffer); data.BaseData = entity; return data; }
/// <summary> 解析补传上报GPS数据 /// /// </summary> /// <param name="value"></param> /// <param name="MaxSpeedMeterPerSecond"></param> /// <returns></returns> public XinAnGPSData DecodeGPSDataByFetch(byte[] value, double MaxSpeedMeterPerSecond) { XinAnGPSData aGPSInfo = new XinAnGPSData(); aGPSInfo = DecodeGPSData2(value, MaxSpeedMeterPerSecond); aGPSInfo.BaseData.IsFetchData = true; return aGPSInfo; }
/// <summary> 检查异常漂移 /// 检查异常漂移 /// </summary> /// <param name="aGPSInfo"></param> /// <param name="aPreviousValidGPSData"></param> /// <param name="MaxSpeedMeterPerSecond"></param> private bool ComputeMileAgeAndVerifyData(ref XinAnGPSData aGPSInfo ,GPSDataEntity aPreviousValidGPSData,double MaxSpeedMeterPerSecond) { bool flag = false; if (aGPSInfo == null) { return false; } if (aGPSInfo.BaseData.IsLocatedData)//没定位,返回FALSE { bool blnIsFirstGPSData = false;//是否第一点数据 if (aPreviousValidGPSData == null) { blnIsFirstGPSData = true; } System.TimeSpan dtSpan; double dclMileage = 0; bool blnIsGPSOverflow = false; bool blnShoudBeStillness = false; //是否要记录里程 bool blnIsArrivalDelayed = false; //是否前条时间超过后一条时间 if (!blnIsFirstGPSData) { if (DateTime.Compare(aGPSInfo.BaseData.ReportTime, aPreviousValidGPSData.ReportTime) <= 0 || aGPSInfo.BaseData.ReportTime >= DateTime.Now.AddHours(1)) {//当前时间小于上一点时间,为补传数据。 若当前数据时间大于服务器时间1小时,认为是异常数据,也标记为补传数据 blnIsArrivalDelayed = true; aGPSInfo.BaseData.IsFetchData = true;//补传数据 flag = true; } double CurrentLatitude = Convert.ToDouble(aGPSInfo.BaseData.Latitude); double CurrentLongitude = Convert.ToDouble(aGPSInfo.BaseData.Longitude); double LastLatitude = Convert.ToDouble(aPreviousValidGPSData.Latitude); double LastLongitude = Convert.ToDouble(aPreviousValidGPSData.Longitude); if ((CurrentLatitude != LastLatitude) || (CurrentLongitude != LastLongitude)) { dclMileage = Transfer.GetDistance(LastLatitude, LastLongitude, CurrentLatitude, CurrentLongitude); } dtSpan = aGPSInfo.BaseData.ReportTime - aPreviousValidGPSData.ReportTime; double dclMaxMileage = Math.Abs(Convert.ToDouble(MaxSpeedMeterPerSecond * dtSpan.TotalSeconds)); if (dclMileage > dclMaxMileage) { //异常:GPS漂移数据 blnIsGPSOverflow = true; aGPSInfo.BaseData.IsOverflowGPSData = blnIsGPSOverflow; } //对速度的判断 if (aGPSInfo.BaseData.Speed > (decimal)(MaxSpeedMeterPerSecond * 3.6)) { blnIsGPSOverflow = true; aGPSInfo.BaseData.IsOverflowGPSData = blnIsGPSOverflow; } //是否要记录里程 if ((aGPSInfo.BaseData.Speed == 0) && (aPreviousValidGPSData.Speed == 0) && (dtSpan.TotalMinutes < 30)) { blnShoudBeStillness = true; } #region 因停车时间延长判断 //判断停车时间是否要重新设置上报时间 if ((aGPSInfo.BaseData.Speed == 0) && (aPreviousValidGPSData.Speed == 0) && (aGPSInfo.BaseData.ACCState == 0) && (aPreviousValidGPSData.ACCState == 0)) { if (aPreviousValidGPSData.IsStartStopCarTime) { aGPSInfo.BaseData.IsStartStopCarTime = true; aGPSInfo.BaseData.StartStopCarTime = aPreviousValidGPSData.StartStopCarTime; //保存上一个停车时间点 TimeSpan StopCarTime = aGPSInfo.BaseData.ReportTime - aPreviousValidGPSData.StartStopCarTime; if (StopCarTime.TotalMinutes > LongIntervalTimes) { aGPSInfo.BaseData.IsSendLongIntervalMessage = true; } } else { aGPSInfo.BaseData.StartStopCarTime = aPreviousValidGPSData.ReportTime; aGPSInfo.BaseData.IsStartStopCarTime = true; } } else { aGPSInfo.BaseData.StartStopCarTime = aGPSInfo.BaseData.ReportTime; aGPSInfo.BaseData.IsStartStopCarTime = false; aGPSInfo.BaseData.IsSendLongIntervalMessage = false; } #endregion aGPSInfo.BaseData.StarkMileage = aPreviousValidGPSData.StarkMileage; aGPSInfo.BaseData.ControlTime = aPreviousValidGPSData.ControlTime; } if (((!blnIsGPSOverflow) && (!blnIsFirstGPSData) && (!blnShoudBeStillness)) && (!blnIsArrivalDelayed)) { aGPSInfo.BaseData.Mileage = (decimal)dclMileage; aGPSInfo.BaseData.StarkMileage = aGPSInfo.BaseData.StarkMileage + aGPSInfo.BaseData.Mileage; } } return flag; }
//判断持续未定位状态时发送重启GPS指令 public bool IsSendRsgsMessage(XinAnGPSData aXinAnGpsData, Dictionary<string, DateTime> aDicIsGPSLocaated, double Time) { if (aXinAnGpsData.BaseData.IsLocatedData) { if (aDicIsGPSLocaated.ContainsKey(aXinAnGpsData.BaseData.GPSCode)) { aDicIsGPSLocaated[aXinAnGpsData.BaseData.GPSCode] = aXinAnGpsData.BaseData.ReceiveTime; } } else { if (!aDicIsGPSLocaated.ContainsKey(aXinAnGpsData.BaseData.GPSCode)) aDicIsGPSLocaated.Add(aXinAnGpsData.BaseData.GPSCode, aXinAnGpsData.BaseData.ReceiveTime); } if (aDicIsGPSLocaated.ContainsKey(aXinAnGpsData.BaseData.GPSCode)) { TimeSpan ts = aXinAnGpsData.BaseData.ReceiveTime - aDicIsGPSLocaated[aXinAnGpsData.BaseData.GPSCode]; if (ts.TotalMinutes > Time) { aDicIsGPSLocaated[aXinAnGpsData.BaseData.GPSCode] = aXinAnGpsData.BaseData.ReceiveTime; return true; } } return false; }