【问题标题】:Programmatically synchronize the time for my device or app with the server?以编程方式将我的设备或应用程序的时间与服务器同步?
【发布时间】:2023-03-22 09:57:01
【问题描述】:

对于工业过程应用程序,我们需要让服务器启动制造活动,该活动通过来自 Android 设备上的应用程序的命令停止或完成。发生这种情况时,应用会向服务器发送一条消息,说明完成时间。

为此,如果 Android 设备上的时间与服务器上的时间“相同”会很好,这样设备发送服务器的时间从服务器的角度来看是正确的。 (一两秒的网络延迟无关紧要)

澄清一下 - 我们公司的许多客户都是国防承包商或其他有安全意识的公司,因此我们的设备通常无法访问外部网络,因此 NITZ 或 NTP 选项可能不可用。我们正在与之交谈的“服务器”只是一台普通的 PC,它控制着一些工业机械,并通过本地无线接入点通过 WiFi 与 Android 交谈。

几年前(例如,How to set time to device programmatically)有人指出,非 root 用户无法以编程方式设置系统时间。在以后的 Android 版本(我们正在运行 5.1)中仍然如此吗?有没有办法为我们的应用程序设置时间?还有其他方法可以做我们想做的事吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    对于我们的应用程序,我们维护一个“客户端上的服务器时间”,如下所示:

    1. 我们每 5 分钟从服务器获取一次服务器时间(通过提供日期、时间和时区的端点)
    2. 获取服务器时间后,我们计算服务器时间与设备本地时间的偏差。
    3. 每当我们需要应用程序中的当前时间时,我们都会获取当前本地时间并添加相应的时间。减去最后计算的偏差。

    此外,我们还有一个 BroadcastReceiver,当设备的时间发生变化时(例如,用户通过设置),它会被调用。在这种情况下,我们立即执行第 1 步和第 2 步。

    【讨论】:

    • 可能会这样,但听起来既麻烦又笨拙。很难相信 Android 被用于如此多的商业和工业用途,以至于在 2017 年,没有一些内在的方法可以在设备和服务器之间同步时间。
    • 如果你说的是有根设备,你可以考虑运行 NTP,因为 android 是基于 linux 的。这可能行得通,唯一的问题是框架是否会及时接受更改。
    • 不仅仅是安卓。 Windows或iOS中是否有任何这样的东西?默认情况下,Android 从 WLAN 或电话网络提供商处获取时间。但是用户可以关闭它并设置自己的时间。你无法改变它,所以你必须应对它。
    • 我不了解 IOS,但在 Windows 中您可以通过编程方式设置时间。我的理解是,除非你是 root,否则你无法在 Android 中执行此操作。
    • 你真的需要设置设备的时间吗?据我了解,您的应用程序与服务器同步就足够了,这可以按照描述来实现。
    【解决方案2】:

    我将假设这是一个封闭系统,并且您不会在随机或不受信任的设备上安装此应用程序(如果是,我建议您根本不要根据客户端做任何事情)。在这种情况下,您可以在您的应用程序中存储一个时间增量——服务器和您的应用程序之间的时间差,而不是设置系统时间(您不能这样做)。然后将其添加到发送到服务器的所有时间。

    【讨论】:

    • 你说得对,它是一个封闭的系统。最好在设备上显示完成时间,并在该时间与 PC 上的用户所看到的一致。
    • 让应用全屏显示(这样顶部栏就会消失)并自己绘制时钟?
    • 它是全屏的,应用程序“拥有”显示屏、主页按钮和一切。这是我们可以为该版本的 Android 制作的最接近 kiosked 的东西。但我不清楚你的建议。服务器说“现在开始”。我们只知道设备上的 NOW 是什么,但是当用户点击“停止”时,我们需要根据 PC 理解的术语说出我们停止的时间,以便我们可以以这种方式显示它。有没有做“时间数学”的图书馆?写一个没那么难,但是已经存在了吗?
    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多