有没有办法在 Windows 10 IoT Core Insider Preview 中从我在 Raspberry Pi 2 上运行的应用程序设置系统时间?
这不适用于缺少 kernel32.dll
[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
extern static bool Win32SetSystemTime(ref SystemTime sysTime);
有没有办法在 Windows 10 IoT Core Insider Preview 中从我在 Raspberry Pi 2 上运行的应用程序设置系统时间?
这不适用于缺少 kernel32.dll
[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
extern static bool Win32SetSystemTime(ref SystemTime sysTime);
使用命令set-date设置时间。例如,如果要将日期设置为 2015 年 10 月 3 日星期六下午 2:00,您可以键入set-date 10/3/2015 2:00PM.
该命令tzutil设置时区。tzutil /?使用类型
1-新建通用项目
2-添加参考>扩展>适用于 UWP
的 Windows IOT 扩展 3-在 MainPage.xaml
和
private void buttonSetSystemDatetime_Click(object sender, RoutedEventArgs e)
{
DateTimeOffset dto = datePicker1.Date+ timePicker1.Time;
Windows.System.DateTimeSettings.SetSystemDateTime(dto);
}
4-在项目设置中>设置您的目标版本和最低版本10.0;构建 16299
5-双击 appxmanifest > 功能 > 选中“系统管理”
6- 在 IOT 中运行应用程序并按下按钮。而不是返回默认应用程序。瞧!系统日期时间已更改。
注意:而不是每次都设置它。我建议您购买便宜的 rtc(实时时钟)模块。(也需要额外的编码)
您可以在 UWP/IoT-Core 系统上从 C# 调用任何 PowerShell 例程。因此,PowerShell 命令始终在您的应用程序中可用。
有关示例,请参阅GitHub 上的 ProcessLauncher 示例。
在板上以管理员身份运行 PowerShell(按 Windows 按钮,然后开始键入 PowerShell,右键单击图标并选择“以管理员身份运行”)。
Set-ExecutionPolicy RemoteSigned
PuTTy 以管理员身份添加到 RPi,并且:
setx PATH "%PATH%;C:\Windows\System32"
schtasks /create /tn "StartupPowerShell" /tr c:\Startup.bat /sc onstart /ru SYSTEM
powershell -command "C:\IotCoreStartup.ps1"
$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 /Delete /TN "StartupPowerShell"
schtasks /Run /tn "StartupPowerShell"
似乎到目前为止似乎没有办法实际编辑系统时间,但这是我想出的一种解决方法,至少可以在您的应用程序中获得正确的时间。我创建了一个 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.
}
我还建议添加诸如跟踪上次更新时间之类的内容,并标记以指示时间是否已更新,只是不想弄乱代码示例。
我使用 RTC 在我的 Raspberry Pi 上设置时间。虽然 Windows-iot 不支持从实时时钟初始化 Raspberry Pi 的软件时钟,但在考虑了几个小时后,我发现了一些适合我的方法。
我制作了一个控制台程序,可以将系统时间保存到 RTC 或读取 RTC 中的时间并将其打印为字符串。我制作了一个 power shell 脚本,它将在系统启动时运行该程序,以从实时时钟获取时间并将字符串传递给 set-date 命令。
详细信息在这里: http: //www.codeproject.com/Articles/1113626/Adding-the-Missing-Real-Time-Clock-to-Windows-IoT
使用 Renci SSH shell 以管理员身份重新登录设备,然后使用 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;
}
请参阅 Microsoft API 参考文档,在Windows.System命名空间中,您可以使用SetSystemDateTime方法设置系统日期和时间。
但你必须知道它可以在
你可以使用 DateTimeSettings 静态类
public static class DateTimeSettings
然后调用 SetSystemDateTime 静态方法并发送 DateTimeOffset 类型的对象以在 Windows Iot 上设置日期和时间。
public static void SetSystemDateTime(DateTimeOffset utcDateTime)
https://docs.microsoft.com/en-us/uwp/api/windows.system.datetimesettings
我知道您在问如何以编程方式执行此操作,但是,以下内容应提供足够的信息来创建一个在启动时运行的 PS 脚本。
通过 Powershell 远程访问 Raspberry Pi
1.) 在您的开发 PC 上运行 Windows 10 IoT Core Watcher 实用程序 (C:\Program Files (x86)\Microsoft IoT\WindowsIoTCoreWatcher.exe) 并通过右键单击检测到的设备并选择复制来复制您的 Raspberry Pi IP 地址IP地址。
◦单击窗口“开始”按钮
◦键入“WindowsIoTCoreWatcher”以在搜索结果中将其拉出
◦您可能需要右键单击程序名称并选择“固定到开始”以将其固定到您的开始屏幕以便于访问
◦按 Enter 运行它
◦您的设备应在 5 秒左右出现在列表中。如果没有,请关闭 Windows 10 IoT Core Watcher,然后重新启动它
2.) 在本地 PC 上启动管理员 PowerShell 控制台。最简单的方法是在 Windows 开始菜单附近的搜索网络和 Windows 文本框中键入“powershell”。Windows 将在您的计算机上找到 PowerShell。右键单击 Windows PowerShell 条目并选择以管理员身份运行。PS控制台将显示。
3.) 您可能需要在桌面上启动 WinRM 服务以启用远程连接。从 PS 控制台键入以下命令:
net start WinRM
4.) 在 PS 控制台中,键入以下命令,将 '' 替换为 prev 中复制的 IP 值:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value <machine-name or IP Address>
5.键入 Y 并按 Enter 确认更改。
6.现在您可以开始与您的 Windows IoT Core 设备的会话。在您的管理员 PS 控制台中,键入:
Enter-PSSession -ComputerName <IP Address> -Credential localhost\Administrator
7.在凭据对话框中输入以下默认密码:
p@ssw0rd
注意:连接过程不是立即的,最多可能需要 30 秒。
如果您成功连接到设备,您应该会在提示前看到设备的 IP 地址。
重命名您的设备并设置日期和时间
1.要更改计算机名称,请使用 setcomputername 实用程序。在 PowerShell 中,键入以下命令。
设置计算机名
2. Pi 上的日期和时间必须正确,以便稍后在实验室中发布到 Azure 的安全令牌有效。要检查 Pi 上的当前时区设置,请键入:
tzutil /g
3.如果报告的时区不正确,您可以使用以下方法查找有效时区列表(您可能需要在您的 powershell 窗口中增加缓冲区大小):
tzutil /l
4.要设置时区,从上面的步骤中找到你想要的时区的id,然后使用:
tzutil /s "你的时区名称"
例如,对于“太平洋标准时间”
tzutil /s "太平洋标准时间"
5.要检查树莓派上的日期,输入
获取日期
6.如果日期或时间不正确,请使用 Set-Date 实用程序
设置日期“mm/dd/yy hh:mm:ss AM/PM”
例如,如果是 2016 年 1 月 3 日下午 12:15:
设置日期“01/03/16 12:15 PM”
7.重新启动设备以使更改生效。您可以按如下方式使用关闭命令:
关机 /r /t 0