同时在多个设备上触发一个动作

Triggering an action on multiple devices at the same time

我正在尝试同时在多台设备上触发我的 Android 应用程序中的操作(或者以最低的 delay/shift 可能)。

这些设备非常相似(品牌、型号、版本),通过 USB 插入 Macbook Pro。到目前为止,我有 4 台设备,但最终解决方案将包括更多设备,因此我需要一个适用于大量设备的解决方案。

我已经尝试通过 Wifi 和 USB 使用套接字(Socket.io 和常规 WS),但每个设备的延迟略有增加,因此操作不会同步触发。

我还尝试通过 USB 发送广播 UDP 数据包,这提供了更好的结果,但似乎非常不一致:最大延迟从 10 毫秒变为 100 毫秒。

同步时钟是我正在考虑的另一种选择,但不确定它在许多设备上的准确性如何(NTP 在 Android 上似乎很棘手)

有什么想法或模式可以满足这种要求吗?谢谢!

编辑

所以在做了一些测试之后,最准确的选择是按照 Sam Mason 的建议使用 NTP 同步设备时钟(我正在使用 this library)。我设法在我的 4 台设备之间实现了平均 5 毫秒的转换。

首先是一些观察:

  1. 移动设备往往会主动关闭 NIC 以节省电量(我不确定它们当前是否正在充电对这有多大影响)
  2. 如果它们不被使用,它们也会限制它们的 CPU 频率,并且可能需要一段时间(即毫秒)才能让它们恢复速度。考虑到您的设备都是 "same",您的测量值的差异可能也会由其他应用程序主导 运行
  3. 测量应用程序响应的延迟似乎很重要,通过网络执行此操作可能会增加差异,因为所有设备都在相互竞争(请注意 USB 是 "serial bus",因此这也适用于此)。取决于这有多重要,可能值得设置摄像机并观看他们的屏幕

就是说,我很想依靠他们的时钟来做这件事。 NTP 同步可能很棒(例如,亚毫秒级精度非常容易)但可能不适用于移动设备(我假设 Android NTP 客户端更关心功率,任何少于几秒的时间对人类来说都很好)。也就是说,他们的时钟应该非常稳定,所以让您的客户签入(随机签入以减少网络争用,并签入几次以便 NIC 正确启动)。客户端可以使用它来计算 "event" 之前的时间,然后休眠直到在此之前的几毫秒。然后他们可以醒来并进行忙循环检查时间(以确保 CPU 已通电)然后在适当的时间继续