2016-08-29 3 views
1

J'ai un périphérique Motorola MC65 qui exécute CE OS 5.2. Je tente d'obtenir une heure valide pour l'appareil; J'étais sous l'impression que puisque je reçois ces données d'un satellite il connaîtrait l'heure exacte pour l'endroit ...Le GPS renvoie un horodatage incorrect sur Windows Mobile CE 5.2

Je reçois la bonne date, mais le temps est coupé de 3 heures. Je suis le fuseau horaire de l'Est, l'appareil a le bon fuseau horaire et l'heure sur l'appareil est maintenant 11h56 (Son off je sais), le GPS retourne 16h15 ...

Voici mon courant code pour obtenir le temps par GPS, je fais usage du pilote intermédiaire GPS de Microsoft (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. 
    } 

aussi, voici la méthode de la Microsoft Interme officielle diate échantillons de code GPS. Cette méthode est appelée par mon code ci-dessus, 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;   
     } 

Répondre

1

Le temps GPS devrait être bon, si le GPSposition.validField dit que le temps est valide.

L'heure GPS est toujours UTC. Le réglage de l'heure du système est la seule façon de procéder, le temps système est également toujours UTC. Comme il y a une bizarrerie avec le réglage de l'heure du système de l'intérieur d'une période de temps DST à une période de temps DST extérieure et vice versa, l'heure du système doit toujours être réglée deux fois! Voir mon blog pour plus de détails ...

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; 
     } 
    } 

le code est de ma démo GpsSample8 à https://github.com/hjgode/win-mobile-code/blob/master/gps8/Gps8/GPS_Sample8/GPSForm1.cs

Lors du test avec des temps, s'il vous plaît noter le temps que vous obtenez de GPS (UTC) et ce que votre appareil dit pour SystemTime et LocalTime après avoir défini SystemTime deux fois sur l'heure GPS.

BTW: EST est 5 heures de retard UTC et pas 3. Après l'application du décalage DST doit être appliqué ou non (dépend du jour de l'année).

+0

Merci beaucoup pour cette réponse! – Dayan