2015-06-02 9 views
12

Есть ли способ установить системное время из моего приложения, работающего на малине Pi 2 в Windows 10 IoT Core Insider Preview?Как установить системное время в Windows 10 IoT?

Это не работает из-за отсутствия kernel32.dll

[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)] 
    extern static bool Win32SetSystemTime(ref SystemTime sysTime); 
+0

Я не вижу никаких «возможностей», которые позволят вам делать это из изолированной программной среды - https://msdn.microsoft.com/en-us/library/windows/apps /hh464936.aspx –

+0

Вне кода программы вы можете открыть PowerShell на устройстве IOT и запустить команду «Set-Date». – Dai

+0

Mm yes powershell работает, вот как я это делал, но это, в сочетании с отсутствием системы ui, означало бы, что нет никакого способа получить точное время на нем как независимое устройство. Надеюсь, они исправят это по времени выпуска. Часы, похоже, значительно дрейфуют, особенно если устройство выключено, а затем включено. (например, с выключением в течение ночи вызывают почти 10-минутную ошибку) –

ответ

3

Казалось бы, как сейчас кажется, что нет никакого способа, чтобы фактически изменить системное время, но вот работа вокруг я придумал для получите правильное время в своем приложении, по крайней мере. Я создал класс TimeManager, важными частями являются следующие.

Получите правильное время, как вы хотите (например, NTP, другое сетевое время, пользовательский ввод и т. Д.) И введите метод UpdateOffset.

В остальной части приложения использует TimeManager.Now вместо DateTime.Now

static TimeSpan _offset = new TimeSpan(0,0,0); 
    public static TimeSpan CurrentOffset //Doesn't have to be public, it is for me because I'm presenting it on the UI for my information 
    { 
     get { return _offset; } 
     private set { _offset = value; } 
    } 

    public static DateTime Now 
    { 
     get 
     { 
      return DateTime.Now - CurrentOffset; 
     } 
    } 

    static void UpdateOffset(DateTime currentCorrectTime) //May need to be public if you're getting the correct time outside of this class 
    { 
     CurrentOffset = DateTime.UtcNow - currentCorrectTime; 
     //Note that I'm getting network time which is in UTC, if you're getting local time use DateTime.Now instead of DateTime.UtcNow. 
    } 

Я также предлагаю добавлять такие вещи, как отслеживание последнего обновления, и флаг, чтобы указать, является ли когда-либо было обновлено время, просто не захотел загромождать образец кода.

10

Во-первых, connect to your Pi 2 using PowerShell.

Используйте команду set-date, чтобы установить время. Например, если вы хотите установить дату в субботу, 3 октября 2015 года, 2:00 вечера, вы должны ввести set-date 10/3/2015 2:00PM.

Команда tzutil устанавливает часовой пояс. Тип tzutil /? для использования

+1

Вопрос в том, как ее установить из приложения. Как уже упоминалось в комментариях, я понимаю, как установить его из powershell. Однако нецелесообразно подключаться к powershell для установки времени при каждом включении устройства. Затем устройство будет использоваться только в том случае, если оно всегда привязано к компьютеру, –

+3

Дата должна быть между кавычками: 'set-date '10/3/2015 2:00 PM" ' – Maxence

+0

Я установил дату-время, используя -> дату установки" 8/25/2017 2:32 PM ", но через некоторое время он сбрасывает/изменяет. Итак, tzutil необходим, чтобы правильно установить часовой пояс, поскольку Pi автоматически попытается обновить текущее время-время на основе сервера времени. –

5

Вы можете вызвать любую рутину PowerShell из C# в системах UWP/IoT-Core. Таким образом, команды PowerShell всегда доступны в вашем приложении.

Для примера см. ProcessLauncher sample on GitHub.

АЛЬТЕРНАТИВА, планировать сценарий PS запуска следующим образом:

Запуск PowerShell в качестве администратора на плате (Нажмите кнопку Windows, и начните вводить PowerShell, щелкните правой кнопкой мыши на иконке и выберите «Запуск от имени администратора «).

Set-ExecutionPolicy RemoteSigned

шпатлевки RPi как администратора и:

Setx PATH "% PATH%; C: \ Windows \ System32"

Schtasks/создать/т "StartupPowerShell"/TR C: \ startup.bat/SC OnStart/RU СИСТЕМА

startup.bat

powershell -command "C:\IotCoreStartup.ps1" 

IotCoreStartup.пс

$logFile = 'C:\StartupLog.txt' 

get-date > $logFile 

tzutil /s "UTC" >> $logFile 

# set alternate time servers 
"Setting additional time servers" >> $logFile 
w32tm /config /syncfromflags:manual /manualpeerlist:"0.windows.time.com 1.pool.ntp.org" >> $logFile 

Удаление запланированного задания при необходимости:

Schtasks/Удалить/TN "StartupPowerShell"

Запуск задачи по расписанию, если тест:

Schtasks/Run/т «StartupPowerShell «

+0

Нет, вы не можете вызвать команды PowerShell в приложении UWP. Согласно: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/7835e702-7bff-4076-a2da-006e6828d940/uwprun-powershell-commands-inside-of-an-uwa-with-c ? forum = wpdevelop – ftes

+2

Он работает через ProcessLauncher (https://ms-iot.github.io/content/en-US/win10/samples/ProcessLauncherSample.htm). Просто вызовите script.cmd, который затем использует PowerShell. Немного запутанный, но работает. Спасибо, спасибо. – GGleGrand

0

Я понимаю, что вы спрашиваете, как это сделать программно, однако следующее должно предоставить достаточную информацию для создания сценария PS для запуска при запуске п.

удаленного доступа Raspberry Pi с помощью Powershell

1.) Запустить Windows 10 IoT Ядро Watcher утилиты (C: \ Program Files (x86) \ Microsoft \ IoT WindowsIoTCoreWatcher.exe) на вашем компьютере разработки и копирования ваш IP-адрес малины Pi, щелкнув правой кнопкой мыши на обнаруженном устройстве и выбрав «Копировать IP-адрес».

◦Click окна кнопка «Пуск»

◦Type «WindowsIoTCoreWatcher», чтобы вытащить его в результатах поиска

◦You может щелкнуть правую кнопку мыши на имени программы и выберите пункт «Закрепить в меню Пуска "прикрепить его к стартовому экрану для легкого доступа

◦Press Enter, чтобы запустить его

◦Your устройства должен появиться в списке в течение 5 секунд или около того. Если этого не произойдет, закройте Windows 10 IoT Core, Watcher, и перезапустить его снова

Windows IoT Core Watcher

2.) Запустите администратором PowerShell консоли на локальном компьютере. Самый простой способ сделать это - набрать «powershell» в поле «Поиск в Интернете» и «Windows» рядом с меню «Пуск» Windows. Windows найдет PowerShell на вашем компьютере. Щелкните правой кнопкой мыши запись Windows PowerShell и выберите «Запуск от имени администратора». Появится консоль PS.

Running Powershell as Administrator

3.) Вы, возможно, потребуется запустить службу WinRM на рабочем столе, чтобы разрешить удаленные подключения. В консоли PS введите следующую команду:

net start WinRM 

4.) В консоли PS, введите следующую команду, заменив '' со значением IP скопирована в пред:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value <machine-name or IP Address> 

5.Type Y и нажмите Enter, чтобы подтвердить изменение.

6. Теперь вы можете начать сеанс с помощью устройства Windows IoT Core. С вашего администратора консоль PS, введите:

Enter-PSSession -ComputerName <IP Address> -Credential localhost\Administrator 

7.В верительных диалоговом окне введите следующий пароль по умолчанию:

р @ ssw0rd

Примечание: Процесс подключения не сразу и может занять до 30 секунд.

Если вы успешно подключились к устройству, перед запросом вы должны увидеть IP-адрес своего устройства.

Connected to the Raspberry using PS

Переименование устройства и настройка даты и времени

1.To изменить имя компьютера, используйте утилиту setcomputername. В PowerShell введите следующую команду.

setcomputername

2. Дата и время на Pi должен быть правильным для маркеров безопасности, используемых для публикации Azure позже в лаборатории, чтобы быть действительным. Для проверки текущей настройки часового пояса на Pi, типе:

tzutil/г

3.Ел часовой пояс, не правильно, вы можете найти список действительных часовых поясов, используя (Вам может понадобиться увеличить размер буфера на окне Powershell):

tzutil/л

4.To установить часовой пояс, найдите идентификатор т он часовой пояс вы хотите от указанной выше стадии, а затем использовать:

tzutil/s "Ваше TimeZone Имя"

Например, для "Стандартное тихоокеанское время"

tzutil/s "Стандартное тихоокеанское время"

5.To проверить дату на Raspberry Pi, тип

Get-Date

6.Если дата или время неправильно, используйте утилиту Set-Date

Set-Date "мм/дд/гггг чч: мм: сс AM/PM"

Для примера, если бы это было 12:15 вечера в 3 января 2016:

Set-Date "01/03/16 12:15 PM"

7.Reboot устройство для изменения вступили в силу. Вы можете использовать команду останова следующим образом:

выключения/г/т 0

+0

интересно установить дату не работает вообще в выигрыше IOT –

3

Я использовал RTC, чтобы установить время на моем Raspberry Pi. Хотя Windows-iot не имеет встроенной поддержки для инициализации программных часов Raspberry Pi из часов реального времени после нескольких часов рассмотрения вариантов, я нашел что-то, что работает для меня.

Я создал консольную программу, которая может либо сохранить системное время на RTC, либо прочитать время в RTC и напечатать его как строку. Я создал сценарий командной оболочки, который будет запускать эту программу во время запуска системы, чтобы получить время от часов реального времени и передать строку команде set-date.

Подробности здесь: http://www.codeproject.com/Articles/1113626/Adding-the-Missing-Real-Time-Clock-to-Windows-IoT

1

Использование Renci SSH оболочки подписать обратно в устройство в качестве администратора, а затем использовать команду PowerShell, чтобы установить дату и время.

public static int SshCommand(string command, out string dataOut, out string error) 
    { 

     dataOut = ""; 
     error = ""; 

     try 
     { 

      using (var client = new SshClient("127.0.0.1", USER_NAME, PASSWORD)) 
      { 
       client.Connect(); 
       //command = "powershell -Command " + "\u0022" + "set-date -date '8/10/2017 8:30:00 AM'" + "\u0022"; 
       //command = "netsh interface ip show config"; 
       var cmd = client.RunCommand(command); 
       var output = cmd.Result; 
       client.Disconnect(); 
      } 

      return 1; 
     } 
     catch (Exception ex) 
     { 
      error = ex.Message; 
      return 0; 
     } 

    } 


public static int SSHSetDateTime(DateTime dateTime) 
    { 

     // Variables 
     int returnValue = 0; 
     string command; 
     string error; 
     string dataOut; 

     // Build date 
     command = String.Format("powershell -Command \u0022set-date -date '{0:M/d/yyyy H:mm:ss tt}'\u0022", dateTime); 

     //Build date 
     if (SystemEx.SshCommand(command, out dataOut, out error) == 1) 
     { 
      // Ok 
      returnValue = 1; 
     } 

     // Return 
     return returnValue; 

    } 
1

относятся к Microsoft API Reference Docs и в Windows.System имен вы можете устанавливает системную дату и время с SetSystemDateTime метода.

, но вы должны знать, `s доступно в

  • Windows, IoT Extension SDK (введен v10.0.16225.0) и выше

вы можете использовать DateTimeSettings статический класс

public static class DateTimeSettings 

затем вызовите статический метод SetSystemDateTime и отправьте свой объект типа DateTimeOffset для установки da te и время на Windows Iot.

public static void SetSystemDateTime(DateTimeOffset utcDateTime) 

https://docs.microsoft.com/en-us/uwp/api/windows.system.datetimesettings

0

1-Новый универсальный проект
2-Add Reference> Расширения> Окна IOT Расширения для UWP
3 Положите пуговицу, DatePicker и контроль timepicer на вашем MainPage.xaml
и

private void buttonSetSystemDatetime_Click(object sender, RoutedEventArgs e) 
     { 
      DateTimeOffset dto = datePicker1.Date+ timePicker1.Time; 
      Windows.System.DateTimeSettings.SetSystemDateTime(dto); 
     } 

4- в настройках ПРОЕКТА> установить целевую версию и версию мин 10.0; build 16299
5- двойной щелчок appxmanifest> Возможности> проверить «Управление системой»

6-запустить приложение в IOT и нажать кнопку. чем возврат к стандартным приложениям. вуаля! дата и время системы изменены.

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