2015-06-02 7 views
12

Gibt es eine Möglichkeit, Systemzeit von meiner App auf einem Raspberry Pi 2 in Windows 10 IoT Core Insider Preview zu setzen?Wie Systemzeit in Windows 10 IoT festlegen?

Dies funktioniert nicht für Mangel an kernel32.dll

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

Ich sehe keine "Fähigkeit", die Sie aus der Sandbox tun könnten - https://msdn.microsoft.com/en-us/library/windows/apps /hh464936.aspx –

+0

Außerhalb des Programmcodes sollten Sie in der Lage sein, eine PowerShell auf einem IOT-Gerät zu öffnen und den Befehl 'Set-Date' auszuführen. – Dai

+0

Mm ja Powershell funktioniert, das ist, wie ich es getan habe, aber das, kombiniert mit keinem System ui effektiv würde bedeuten, dass es keine Möglichkeit gibt, genaue Zeit darauf als ein unabhängiges Gerät zu haben. Hoffe, dass sie das nach der Release-Zeit beheben. Die Uhr scheint erheblich zu driften, besonders wenn das Gerät ausgeschaltet und dann wieder eingeschaltet wird. (z. B. über Nacht abgeschaltet zu werden verursachte fast 10 Minuten Fehler) –

Antwort

3

Scheinbar wie es jetzt tatsächlich die Systemzeit keine Möglichkeit zu sein scheint zu bearbeiten, aber hier ist eine Arbeit um kam ich mit zu Erhalte die richtige Zeit in deiner App. Ich habe eine TimeManager-Klasse erstellt, die wichtigen Teile sind wie folgt.

Holen Sie sich die richtige Zeit, wie immer Sie wollen (z. B. NTP, andere Netzwerkzeit, Benutzereingaben usw.) und geben Sie sie in die UpdateOffset-Methode ein.

Im Rest der App verwenden TimeManager.Now statt 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. 
    } 

Ich schlage vor, auch Dinge wie die Verfolgung die letzte Aktualisierungszeit hinzufügen und Flag, um anzuzeigen, ob die Zeit aktualisiert wurde je, wollte einfach nicht das Code-Sample durcheinander bringen.

10

Zuerst connect to your Pi 2 using PowerShell.

Verwenden Sie den Befehl set-date, um die Uhrzeit einzustellen. Wenn Sie beispielsweise das Datum auf Samstag, 3. Oktober 2015, 14.00 Uhr festlegen möchten, geben Sie set-date 10/3/2015 2:00PM ein.

Der Befehl tzutil legt die Zeitzone fest. Typ tzutil /? zur Verwendung

+1

Die Frage war, wie Sie es einstellen von einer App. Wie in den Kommentaren erwähnt, verstehe ich, wie man es von Powershell aus setzt. Es ist jedoch unpraktisch, eine Verbindung mit der Powershell herzustellen, um die Zeit jedes Mal festzulegen, wenn das Gerät eingeschaltet wird. Das Gerät wäre dann nur verwendbar wenn immer an einen Computer angebunden, –

+3

Das Datum sollte zwischen den Anführungszeichen stehen: 'set-date" 03.10.2015 14:00 "' – Maxence

+0

ich setze die datetime mit -> set-date "8/25/2017 2:32 PM ", aber nach einer Weile wird es zurückgesetzt/ändert sich. Also wird der tzutil benötigt, um die Zeitzone richtig einzustellen, da der Pi automatisch versucht, die aktuelle Datetime basierend auf einem Zeitserver zu aktualisieren. –

5

Sie können jede PowerShell-Routine von C# auf UWP/IoT-Core-Systemen aufrufen. Daher sind die PowerShell-Befehle immer in Ihrer App verfügbar.

Ein Beispiel finden Sie unter ProcessLauncher sample on GitHub.

ALTERNATIVE, ein Startup-PS-Script Zeitplan wie folgt:

Run Powershell als Administrator auf der Platine (Drücken Sie die Windows-Taste, und starten Sie Powershell eingeben, klicken Sie rechts auf das Icon und wählen Sie „Als Administrator ausführen ").

Set-ExecutionPolicy RemoteSigned

PuTTy RPI als admin und:

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

schtasks/create/tn "StartupPowerShell"/tr c: \ Startup.bat/sc onstart/ru SYSTEM

Startup.bat

powershell -command "C:\IotCoreStartup.ps1" 

IotCoreStartup.ps

$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 

eine geplante Aufgabe löschen, wenn erforderlich:

schtasks/Löschen/TN "StartupPowerShell"

eine geplante Aufgabe zu laufen, wenn auf Test:

schtasks/Run/tn „StartupPowerShell "

+0

Nein, PowerShell-Befehle können nicht in einer UWP-App aufgerufen werden. Nach: 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

Es funktioniert über den ProcessLauncher (https://ms-iot.github.io/content/en-US/win10/samples/ProcessLauncherSample.htm). Rufen Sie einfach eine script.cmd auf, die PowerShell verwendet. Ein wenig verschachtelt, aber funktioniert. Ich werde mir deinen Link ansehen, danke. – GGleGrand

0

Ich weiß, dass Sie fragen, wie dies programmgesteuert zu tun ist, jedoch sollte das Folgende genug Informationen bereitstellen, um ein PS-Skript zu erstellen, das bei startu ausgeführt wird p.

Remote Access Raspberry Pi via Powershell

1.) Führen Sie die Windows-10 IoT Core-Watcher-Programm (C: \ Program Files (x86) \ Microsoft IoT \ WindowsIoTCoreWatcher.exe) auf dem Entwicklungs-PC und kopieren Ihre Raspberry Pi IP-Adresse, indem Sie mit der rechten Maustaste auf das erkannte Gerät klicken und IP-Adresse kopieren auswählen.

◦Click die Fenster Schaltfläche „Start“

◦Type „WindowsIoTCoreWatcher“ es bei der Suche nach oben ziehen Ergebnissen

◦You wollen auf dem Programmnamen rechte Maustaste und wählen Sie „Pin zu starten "es dem Stift zu Ihrem Startbildschirm für den einfachen Zugriff

◦Press Geben sie es in der Liste innerhalb von 5 Sekunden angezeigt werden soll oder so

◦Your Gerät ausgeführt werden. Wenn dies nicht der Fall, schließen Sie das Windows-10 IoT Core-Watcher, und es Relaunch wieder

Windows IoT Core Watcher

2.) Starten Sie ein Administrator-Powershell-Konsole auf Ihrem lokalen PC. Der einfachste Weg, dies zu tun, ist "powershell" in das Textfeld "Search the web and Windows" in der Nähe des Windows-Startmenüs eingeben. Windows findet PowerShell auf Ihrem Computer. Klicken Sie mit der rechten Maustaste auf den Windows PowerShell-Eintrag, und wählen Sie Als Administrator ausführen aus. Die PS-Konsole wird angezeigt.

Running Powershell as Administrator

3.) Sie müssen möglicherweise den WinRM-Dienst auf Ihrem Desktop starten Remote-Verbindungen zu ermöglichen. Von der PS-Konsole den folgenden Befehl ein:

net start WinRM 

4.) aus der PS-Konsole den folgenden Befehl ein, und ersetzen '' mit dem Wert IP i.Vj. kopiert:

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

5.Type Y und drücken Sie die Eingabetaste, um die Änderung zu bestätigen.

6. Jetzt können Sie eine Sitzung mit Ihrem Windows IoT Core-Gerät starten. Geben Sie in Ihrer Administrator PS-Konsole Folgendes ein:

7.Im Berechtigungsnachweis-Dialog geben Sie das folgende Standardkennwort:

p @ ssw0rd

Hinweis: Der Verbindungsprozess nicht unmittelbar ist und bis zu 30 Sekunden dauern kann.

Wenn Sie erfolgreich mit dem Gerät verbunden sind, sollten Sie die IP-Adresse Ihres Geräts vor der Eingabeaufforderung sehen.

Connected to the Raspberry using PS

Umbenennung des Geräts und die Einstellung von Datum und Uhrzeit

1.To die Computernamen ändern, das SetComputerName Dienstprogramm verwenden. Geben Sie in PowerShell den folgenden Befehl ein.

SetComputerName

2. Datum und Uhrzeit auf dem Pi muss für die Sicherheitstoken korrekt sein verwendet Azure später im Labor zu veröffentlichen ihre Gültigkeit. So überprüfen Sie die aktuelle Zeitzone-Einstellung auf dem Pi, Typ:

TZUtil/g

3. Wenn die Zeitzone nicht korrekt gemeldet ist, können Sie eine Liste der gültigen Zeitzonen finden mit (Sie können die Puffergröße auf Ihrem Powershell-Fenster erhöhen müssen):

TZUtil/l

4.To die Zeitzone einstellen, suchen Sie die ID von t er Zeitzone von dem Schritt wollen oben, dann verwenden:

TZUtil/s "Your Time-Zone-Name"

Zum Beispiel für "Pacific Standard Time"

TZUtil/s "Pacific Standard Time"

5.To das Datum auf dem Raspberry Pi überprüfen, Typ

012.351.

Get-Date

6.Wenn das Datum oder die Uhrzeit falsch ist, verwenden Sie den Set-Date-Dienstprogramm

Set-Date "mm/tt/jj hh: mm: ss AM/PM"

Zum Beispiel wenn es 12.15 am 3. Januar 2016:

Set-Date "01/03/16 12.15"

7.Reboot das Gerät für die Änderung wirksam wird. Sie können den Befehl shutdown wie folgt verwenden:

shutdown/r/t 0

+0

Interessant Set-Date funktioniert überhaupt nicht in Win IOT –

3

ich eine RTC verwendet, um die Zeit auf meiner Raspberry Pi einzustellen. Während Windows-iot keine native Unterstützung für die Initialisierung der Software-Uhr des Raspberry Pi von einer Echtzeituhr nach mehreren Stunden der Berücksichtigung von Optionen hat, fand ich etwas, das für mich funktioniert.

Ich habe ein Konsolenprogramm erstellt, das entweder die Systemzeit auf der RTC speichern oder die Uhrzeit in der RTC lesen und als Zeichenfolge ausgeben kann. Ich habe ein Power-Shell-Skript erstellt, das dieses Programm zum Zeitpunkt des Systemstarts ausführt, um die Zeit von der Echtzeituhr abzurufen und die Zeichenfolge an den Befehl set-date zu übergeben.

Einzelheiten sind hier: http://www.codeproject.com/Articles/1113626/Adding-the-Missing-Real-Time-Clock-to-Windows-IoT

1

Verwenden Renci SSH-Shell in das Gerät als Administrator anmelden zurück und dann Powershell-Befehl zum Einstellen von Datum und Uhrzeit verwenden.

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

beziehen sich auf Microsoft-API-Referenz-Dokumente und in der Windows.System Namespace können Sie legt das Systemdatum und die Uhrzeit mit SetSystemDateTime Methode.

aber Sie müssen wissen `s in

  • Windows-IoT Erweiterung SDK (eingeführt v10.0.16225.0) und über

Sie DateTimeSettings statische Klasse

verwenden können
public static class DateTimeSettings 

Dann rufen Sie die statische Methode SetSystemDateTime auf und senden Sie Ihr Objekt vom DateTimeOffset-Typ zum Festlegen von da te und Zeit auf Windows Iot.

public static void SetSystemDateTime(DateTimeOffset utcDateTime) 

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

0

1-New Universal Project
2-Add Reference> Erweiterungen> Windows-IOT-Erweiterungen für UWP
3- Setzen Sie auf eine Schaltfläche, eine Datumsauswahl und eine timepicer Kontrolle über Ihre MainPage.xaml
und

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

4- in poject Einstellungen> stellen Sie Ihre Zielversion und min Version 10.0; build 16299
5- Doppelklick appxmanifest> Funktionen> check ON "System Management"

6- App in IOT ausführen und Taste drücken. als zur Standard-App zurückkehren. voila! System Datetime geändert.

hinweis: eher um es jedes mal zu setzen. Ich biete Ihnen an, ein billiges rtc-Modul (Echtzeituhr) zu kaufen. (benötigt auch zusätzliche Codierung)

Verwandte Themen