我正在建立一个实时竞争的应用程序移动设备的健身设备(超过BLE)。由于延迟,移动设备可以在不同的时间从服务器接收命令。我试图实现的东西,所有的设备是“同步”与服务器,并执行“开始竞赛”命令在同一时间。这样,不一定相邻的用户将获得尽可能多的实时体验,并在接近准确的时刻开始竞争。此时,我使用WebSockets向我的移动应用程序发布命令,但假设设备A将在20 my内收到命令,设备B将在150 my内收到命令。虽然这只是一眨眼的功夫,但在健身器材上却是非常引人注目的。如何在架构上创建一个应用程序,例如,在1 PM UTC上在所有设备上执行命令?这里的问题是移动设备可能有不同的时间,所以我希望我的移动应用程序与服务器时间同步,如果我说在1 PM UTC服务器时间执行命令,我知道所有移动设备都会实现这一点。
目前的架构:
调度或手动调用命令-> SignalR通知所有连接设备->设备执行“开始”
可能的架构:
调度或手动调用命令,让设备知道运行命令-> SignalR (WebSockets或其他一些技术)的确切时间,通知连接的设备将移动应用程序时间与服务器同步,并且命令执行时间->命令在许多设备上几乎实时执行。
如何同步时间?使用NTP?对于这个场景,您认为最好的架构是什么?
我见过许多类似于此的应用程序,但我正在尝试理解这种架构。我认为技术是不相关的,我不能控制BLE在健身设备上的执行时间,但它们是快速的。如果它能帮助我使用SignalR for WebSockets (.NET Core 3.x in C#),那么移动应用程序就会在Flutter/Dart上运行。
发布于 2021-02-16 15:44:00
要同步时间,可以使用toUtc法
返回UTC时区中的此DateTime值。
然后在所有设备上完全同时开始使用计时
创建一个新的计时器。回调函数在给定持续时间后调用。
下面是工作实例:
import 'dart:core';
DateTime startTime = DateTime.utc(2021, 2, 16, 15, 0); // you feed the startTime from your server using websocket.
void checkForStart(Timer timer) {
print(startTime);
timer?.cancel();
while (true) {
print('Run Forest!');
// [... do your app things]
}
}
...
initState() {
super.initState();
var current = DateTime.now().toUtc(); // this is what you want
Duration difference = startTime.difference(current);
timer = Timer(Duration(microseconds: difference.inMicroseconds), () => checkForStart(timer));
[...]
dispose() {
timer?.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!这段代码将保证应用程序为每个人同时启动,因为它将执行一个检查与计时器,并在本地设备上启动它,同时,您已经提供给设备的startTime (注意:这是前台版本,意味着每个人都应该打开应用程序)
我没有详细说明websocket部分,因为我假设您在实现它时没有问题,如果没有,您可以查看这个储存库或不同的文档、教程和stackOverflow答案。如果有帮助请告诉我。
https://stackoverflow.com/questions/66041326
复制相似问题