示例#1
0
        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;
        }    
示例#2
0
 /// <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;
 }
示例#3
0
        /// <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;
        }      
示例#4
0
        //判断持续未定位状态时发送重启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;
        }