Установка системного времени устройства Windows Mobile с компьютера?

Я пытаюсь синхронизировать системную дату и время устройства с рабочим столом, к которому оно подключено, я работаю через компактную среду (C#).

Моя цель - определить, когда в последний раз устройство синхронизировалось с базой данных на настольном компьютере.

Как я могу это сделать?

4 ответа

Я не уверен, что последний вопрос. Если вы спросите, как синхронизировать время устройства с временем ПК, когда устройство подключено к док-станции, вы можете использовать бесплатный ITSUtils и некоторые изменения в реестре на вашем компьютере для автоматизации синхронизации времени: изменение реестра

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\AutoStartOnConnect]
"OnConnect"="\"c:\\windows\\system32\\cmd.exe\" /c d:\\OnConnect\\install.bat"

смотрите также здесь и здесь и здесь

Если у вас есть доступ, вы также можете посмотреть мой пост на бирже экспертов.

Вместо install.bat вы можете использовать любой файл bat или cmd. Его утилиты содержат приложение для ПК под названием psynctime. Вам просто нужно запустить psynctime в файле bat/cmd, который вы создали и связали в реестре. Время устройства затем синхронизируется со временем вашего ПК. Убедитесь, что файл bat может получить доступ к файлам itsutil, либо его файлы могут находиться в директории вашей среды PATH или в директории bat/cmd.

В качестве альтернативы вы должны написать DLL и код удаленного вызова activesync для синхронизации времени. Так что проще использовать инструмент psynctime.

Знаете ли вы, что устройство может использовать Интернет, используя подключение к Интернету вашего компьютера? См. Параметры подключения ActiveSync и найдите "ПК подключен к работе / Интернет / Автоматически". Если установлено значение "Автоматически" или "Интернет", ваше устройство должно иметь доступ к Интернету через соединение ActiveSync. Просто попробуйте Internet Explorer Mobile на устройстве, чтобы проверить это. Если это работает для вас, вы также можете использовать службу SNTP с кодом, предоставленным Mitch. Но тогда вы также должны добавить код, который определяет, когда устройство подключено через ActiveSync.

Вот тот, который я использовал. Мои устройства синхронизируются при первом запуске объекта базы данных.

#if PocketPC
[DllImport("coredll.dll")]
#else
[DllImport("kernel32.dll")]
#endif
private static extern bool SetLocalTime([In] ref SYSTEMTIME lpLocalTime);

... и да, я использую тот же код для моих ПК с Windows, что и для моих компьютеров WinMobile.

это NODATE Эта переменная является глобальной для всего моего проекта и определяется как 1 января 1900 года. Надеемся, что в эту дату в SQL Server ничего не происходило в этой компании!

Начнем со структуры:

/// <summary>
/// SYSTEMTIME structure with some useful methods
/// </summary>
public struct SYSTEMTIME {
  public short Year, Month, DayOfWeek, Day, Hour, Minute, Second, Millisecond;
  /// <summary>
  /// Convert form System.DateTime
  /// </summary>
  /// <param name="time">Creates System Time from this variable</param>
  public void FromDateTime(DateTime time) {
    Year = (short)time.Year;
    Month = (short)time.Month;
    DayOfWeek = (short)time.DayOfWeek;
    Day = (short)time.Day;
    Hour = (short)time.Hour;
    Minute = (short)time.Minute;
    Second = (short)time.Second;
    Millisecond = (short)time.Millisecond;
  }
  /// <summary>
  /// Convert to System.DateTime
  /// </summary>
  public DateTime ToDateTime() {
    return new DateTime(Year, Month, Day, Hour, Minute, Second, Millisecond);
  }
  /// <summary>
  /// STATIC: Convert to System.DateTime
  /// </summary>
  public static DateTime ToDateTime(SYSTEMTIME time) {
    return time.ToDateTime();
  }
}

Затем просто используйте эту структуру, как я делаю в этом методе, который выполняет вызов (я синхронизируюсь с нашим SQL Server).

/// <summary>
/// Synchronize the Time on the SQL Server with the time on the device
/// </summary>
public static int SyncWithSqlTime() { // pass in SQL Time and set time on device
  SYSTEMTIME st = new SYSTEMTIME();
  DateTime sqlTime = Global.NODATE;
  using (SqlCommand cmd = new SqlCommand("SELECT GETDATE() AS CurrentDateTime;", new SqlConnection(DataSettings.DatabaseConnectionString))) {
    try {
      cmd.Connection.Open();
      SqlDataReader r = cmd.ExecuteReader();
      while (r.Read()) {
        if (!r.IsDBNull(0)) {
          sqlTime = (DateTime)r[0];
        }
      }
    } catch (Exception) {
      return -1;
    }
  }
  if (sqlTime != Global.NODATE) {
    st.FromDateTime(sqlTime); // Convert to SYSTEMTIME
    if (SetLocalTime(ref st)) { //Call Win32 API to set time
      return 1;
    }
  }
  return 0;
}

Что в прошлом if условие внизу, где я устанавливаю время, используя SetLocalTime,

Надеюсь, это куда-то тебя приведет,
~ Джо

Почему бы не синхронизировать оба с международным стандартным временем, используя SNTP (сетевой протокол времени):

Клиент C# SNTP

Тогда вы можете просто проверить время последнего обновления базы данных. [Я использовал связанный код на мобильном устройстве]

Этот код используется примерно так (вызывается каждый час или любой другой интервал обновления):

   SNTPClient client = new SNTPClient(sntpTimeServerString);
   client.Connect(5000, true);

   // Set system clock to timenow 
   DateTime timenow = client.ToTime();

Обновление (на основе комментариев ОП): Поскольку у вас нет подключения к Интернету, я думаю, что вам нужно использовать что-то другое, чем время, чтобы определить последнюю синхронизацию. Например, используйте последний идентификатор последовательности, чтобы определить, есть ли изменения в локальной базе данных устройства по сравнению с рабочим столом.

Удаленный API 2 (RAPI2). => Вы запускаете два rapi.CreateProcess, один для даты и один для времени.

rapi.CreateProcess("cmd", "/c date " + DateTime.Now.ToString("dd-MM-yyyy"));
rapi.CreateProcess("cmd", "/c time " + DateTime.Now.ToString("HH:mm:ss"));

Откроется окно командной строки двух окон для синхронизации мобильного телефона с часами на вашем ПК.

Другие вопросы по тегам