2016-08-29 1 views
1

Ich habe ein Motorola MC65-Gerät, das CE OS 5.2 ausgeführt wird. Ich bin dabei, eine gültige Zeit für das Gerät zu erhalten. Ich hatte den Eindruck, dass, da ich diese Daten von einem Satelliten empfange, würde es die richtige Zeit für den Standort wissen ...GPS gibt falschen Zeitstempel auf Windows Mobile CE 5.2 zurück

Ich erhalte das richtige Datum, aber die Zeit ist um 3 Stunden. Ich bin Eastern Zeitzone, das Gerät hat die richtige Zeitzone eingestellt und die Zeit auf dem Gerät ist jetzt 11:56 Uhr (Es ist off ich weiß), das GPS zurück 4:15 PM ...

Hier ist meine aktuelle Code, um die Zeit über GPS zu bekommen, ich Nutzung der GPS-Treiber von Microsoft machen (https://msdn.microsoft.com/en-us/library/bb202128.aspx):

public DateTime GetGPSTime() 
    { 
     Boolean satsInView = false; 
     Gps g = new Gps(); 
     g.DeviceStateChanged += new DeviceStateChangedEventHandler(g_DeviceStateChanged); 
     g.Open(); 
     Thread.Sleep(4000); 

     if (g.Opened) 
     { 
      if (deviceState.ServiceState == GpsServiceState.On) 
      { 
       GpsPosition pos = g.GetPosition(TimeSpan.Zero); //No Delay in time 
       if (pos != null) 
       { 
        //First check that we have sats visible for good GPS signal. 
        if (pos.SatellitesInViewCountValid) 
        { 
         if (pos.SatellitesInViewCount >= 1) 
          satsInView = true; 
         else 
          satsInView = false; 
        } 

        if (pos.TimeValid && satsInView) 
        { 
         g.Close(); 
         g.DeviceStateChanged -= g_DeviceStateChanged; 
         return pos.Time; //Returned time obtained from GPS Obj 
        } 
       } 
       g.Close(); 
       g.DeviceStateChanged -= g_DeviceStateChanged; 
       return Helper.GetSystemTimeToNow(); //If GPS obj is null, return current system time. 
      } 
     } 

     g.Close(); 
     g.DeviceStateChanged -= g_DeviceStateChanged; 
     return Helper.GetSystemTimeToNow(); //If GPS obj is null, return current system time. 
    } 

auch hier ist die Methode von der offiziell Microsoft Zwi Dient GPS-Code-Beispiele. Diese Methode wird von meinem Code oben genannt, GpsPosition pos = g.GetPosition(TimeSpan.Zero);

/// <summary> 
     /// Get the position reported by the GPS receiver that is no older than 
     /// the maxAge passed in 
     /// </summary> 
     /// <param name="maxAge">Max age of the gps position data that you want back. 
     /// If there is no data within the required age, null is returned. 
     /// if maxAge == TimeSpan.Zero, then the age of the data is ignored</param> 
     /// <returns>GpsPosition class with all the position details</returns> 
     public GpsPosition GetPosition(TimeSpan maxAge) 
     { 
      GpsPosition gpsPosition = null; 
      if (Opened) 
      { 
       // allocate the necessary memory on the native side. We have a class (GpsPosition) that 
       // has the same memory layout as its native counterpart 
       IntPtr ptr = Utils.LocalAlloc(Marshal.SizeOf(typeof(GpsPosition))); 

       // fill in the required fields 
       gpsPosition = new GpsPosition(); 
       gpsPosition.dwVersion = 1; 
       gpsPosition.dwSize = Marshal.SizeOf(typeof(GpsPosition)); 

       // Marshal our data to the native pointer we allocated. 
       Marshal.StructureToPtr(gpsPosition, ptr, false); 

       // call native method passing in our native buffer 
       int result = GPSGetPosition(gpsHandle, ptr, 500000, 0); 
       if (result == 0) 
       { 
        // native call succeeded, marshal native data to our managed data 
        gpsPosition = (GpsPosition)Marshal.PtrToStructure(ptr, typeof(GpsPosition)); 

        if (maxAge != TimeSpan.Zero) 
        { 
         // check to see if the data is recent enough. 
         if (!gpsPosition.TimeValid || DateTime.Now - maxAge > gpsPosition.Time) 
         { 
          gpsPosition = null; 
         } 
        } 
       } 
       else if (result == 87) // ERROR_INVALID_PARAMETER) 
       { 
        // 
        // TEMPORARY HACK 
        // 
        // http://blogs.msdn.com/cenet/archive/2007/12/06/gpsid-problem-workaround-on-recent-wm6-release.aspx 
        // 

        Utils.LocalFree(ptr); 

        // allocate the necessary memory on the native side. We have a class (GpsPosition) that 
        // has the same memory layout as its native counterpart 
        ptr = Utils.LocalAlloc(376); 

        // fill in the required fields 
        gpsPosition = new GpsPosition(); 
        gpsPosition.dwVersion = 1; 
        gpsPosition.dwSize = 376; 

        // Marshal our data to the native pointer we allocated. 
        Marshal.StructureToPtr(gpsPosition, ptr, false); 

        // call native method passing in our native buffer 
        result = GPSGetPosition(gpsHandle, ptr, 500000, 0); 

        if (result == 0) 
        { 
         // native call succeeded, marshal native data to our managed data 
         gpsPosition = (GpsPosition)Marshal.PtrToStructure(ptr, typeof(GpsPosition)); 

         if (maxAge != TimeSpan.Zero) 
         { 
          // check to see if the data is recent enough. 
          if (!gpsPosition.TimeValid || DateTime.Now - maxAge > gpsPosition.Time) 
          { 
           gpsPosition = null; 
          } 
         } 
        } 
       } 

       // free our native memory 
       Utils.LocalFree(ptr); 
      } 

      return gpsPosition;   
     } 

Antwort

1

Die GPS-Zeit sollte gut sein, wenn die GPSposition.validField sagt, dass die Zeit gültig ist.

Die GPS-Zeit ist immer UTC. Nur die Systemzeit kann eingestellt werden, die Systemzeit ist ebenfalls immer UTC. Da es eine Eigenart gibt, die Systemzeit von innerhalb einer DST-Zeitspanne auf eine externe DST-Zeitspanne einzustellen und umgekehrt, sollte die Systemzeit immer zweimal eingestellt werden! Sehen Sie mein Blog für weitere Details ...

private void SetTimeToGPS(DateTime UTCtime) 
    { 
     if (m_SetTime) 
     { 
      // Get the local time zone and a base Coordinated Universal 
      // Time (UTC). 
      TimeZone localZone = TimeZone.CurrentTimeZone; 
      DateTime baseUTC = UTCtime; // new DateTime(2000, 1, 1); 

      System.Diagnostics.Debug.WriteLine("\nLocal time: {0}\n", 
       localZone.StandardName); 

      // Calculate the local time and UTC offset. 
      DateTime localTime = localZone.ToLocalTime(baseUTC); 
      TimeSpan localOffset = 
       localZone.GetUtcOffset(localTime); 

      System.Diagnostics.Debug.WriteLine(string.Format("{0,-20:yyyy-MM-dd HH:mm}" + 
       "{1,-20:yyyy-MM-dd HH:mm}{2,-12}{3}", 
       baseUTC, localTime, localOffset, 
       localZone.IsDaylightSavingTime(localTime))); 
      //adjust the clock 
      //localTime += localOffset; 
      PInvokeLibrary.SystemTimeLib.SetTime(localTime); 
      m_SetTime = false; 
     } 
    } 

der Code meiner GpsSample8 Demo bei https://github.com/hjgode/win-mobile-code/blob/master/gps8/Gps8/GPS_Sample8/GPSForm1.cs

Wenn mit mal Testen Sie bitte die Zeit, die Sie von GPS erhalten beachten (UTC) und was Ihr Gerät sagt für SystemTime und LocalTime, nachdem die SystemTime zweimal auf die GPS-Zeit eingestellt wurde.

BTW: EST ist 5 Stunden hinter UTC und nicht 3. Nach dem Anwenden des Offsets muss DST angewendet werden oder nicht (hängt vom Tag des Jahres ab).

+0

Vielen Dank für diese Antwort! – Dayan

Verwandte Themen