Flutter 将移动设备与服务器同步以跨多个移动设备同时运行命令

Flutter 将移动设备与服务器同步以跨多个移动设备同时运行命令,flutter,time,architecture,signalr.client,ntp,Flutter,Time,Architecture,Signalr.client,Ntp,我正在为健身设备(通过BLE)的移动设备构建一个实时竞争应用程序。由于延迟,移动设备可以在不同的时间从服务器接收命令。我正在尝试实现所有设备与服务器“同步”,并同时执行“启动竞速”命令。这样,不一定挨着的用户将尽可能多地获得接近实时的体验,并在接近准确的时刻开始竞争。目前,我使用WebSockets将命令发布到我的移动应用程序中,但假设设备A将在20毫秒内收到命令,设备B将在150毫秒内收到命令。虽然这只是一眨眼的功夫,但在健身器材上却非常明显。如何在体系结构上创建一个应用程序,例如在UTC下午

我正在为健身设备(通过BLE)的移动设备构建一个实时竞争应用程序。由于延迟,移动设备可以在不同的时间从服务器接收命令。我正在尝试实现所有设备与服务器“同步”,并同时执行“启动竞速”命令。这样,不一定挨着的用户将尽可能多地获得接近实时的体验,并在接近准确的时刻开始竞争。目前,我使用WebSockets将命令发布到我的移动应用程序中,但假设设备A将在20毫秒内收到命令,设备B将在150毫秒内收到命令。虽然这只是一眨眼的功夫,但在健身器材上却非常明显。如何在体系结构上创建一个应用程序,例如在UTC下午1点在所有设备上执行命令?这里的问题是,移动设备可能有不同的时间,所以我希望我的移动应用程序与服务器时间同步,如果我说在UTC服务器时间下午1点执行命令,我知道所有移动设备都会实现这一点

当前架构:

计划或手动调用命令->信号器通知所有连接的 设备->设备执行“启动”

可能的架构:

安排或手动调用命令,让设备知道确切的时间 运行命令->信号器(WebSockets或其他一些技术)通知 连接的设备可将移动应用程序时间与服务器和命令同步 执行时间->命令在多个系统中几乎实时执行 装置

如何同步时间?使用NTP?您认为此场景的最佳架构是什么


我见过许多类似的应用程序,但我正在努力了解其体系结构。我认为技术是无关紧要的,我无法控制健身器材的执行时间,但它们很快。如果我使用SignalR for WebSockets(.C#中的NET Core 3.x)有帮助的话,移动应用程序正在flift/Dart上运行。

要同步时间,可以使用

返回UTC时区中的此日期时间值

然后在所有设备使用的同一时间启动

创建一个新计时器。在给定的持续时间后调用回调函数

工作示例如下:

导入“dart:core”;
DateTime startTime=DateTime.utc(2021,2,16,15,0);//您可以使用websocket从服务器提供startTime。
void checkForStart(计时器){
打印(开始时间);
计时器?.cancel();
while(true){
打印('runforest!');
//[…做你的应用程序事情]
}
}
...
initState(){
super.initState();
var current=DateTime.now().toUtc();//这就是您想要的
持续时间差=开始时间差(当前);
计时器=计时器(持续时间(微秒:差分为微秒),()=>checkForStart(计时器));
[...]
处置{
计时器?.cancel();
super.dispose();
}
输出:

I/flutter ( 5819): 2021-02-16 15:00:00.000Z
I/flutter ( 5819): Run Forest!
I/chatty  ( 5819): uid=10154() 1.ui identical 65535 lines
I/flutter ( 5819): Run Forest!
此代码将保证每个人的应用程序在同一时间启动,因为它将使用计时器执行检查,并在本地设备上启动它,同时您已将启动时间馈送到设备(注意:这是前台版本,意味着每个人都应打开应用程序)


我没有详细说明websocket部分,因为我假设您在实现它方面没有问题,如果没有问题,您可以查看或查看不同的文档、教程和stackOverflow答案。如果有帮助,请告诉我。

谢谢您的回答。我对websocket或应用程序的任何其他部分没有问题,它都处于工作状态n、 我只是在尝试“同步”设备以同时执行命令(或者几乎同时执行,因为Android硬件可能会非常快、便宜、更慢)。不管怎样,应用程序都必须在前台运行,因为在后台运行会在某个点禁用WebSocket(iOS比Android快),这是由操作系统设计的。虽然Android有一定的灵活性,但iOS非常严格,如果应用程序也在后台运行一段时间,它会在某个时候杀死它们