2015-03-28 3 views
0

Я пытаюсь получить функцию интервала, запрограммированную на отдельных устройствах, для синхронизации друг с другом. Таким образом, несколько мобильных устройств выполняют синхронизацию с одним и тем же интервалом. Сначала я подумал, что могу просто использовать внутренние часы устройств и запускать функции на 0 минут. Теперь я понимаю, что мобильные часы на самом деле не такие точные и не синхронизированы друг с другом. Теперь мне нужно новое решение.Метод синхронизации интервальных функций по отдельным устройствам

Я использую heroku, node.js, socket.io и ионный, если это вообще помогает.

+0

В чем проблема, которую вы действительно пытаетесь решить? И насколько точным в мс должна быть синхронизация? – jfriend00

+0

Я пытаюсь получить эффект изменения цвета для синхронизации на разных устройствах, чтобы все они менялись на один и тот же цвет одновременно. Как можно точнее было бы неплохо, но я бы согласился на менее 200 мс. –

ответ

0

Концептуально, вы можете сделать следующее:

  1. У каждого клиента установить привязку по времени против общего сервера.
  2. Отправляйте сообщение изменения цвета каждому клиенту с определенной меткой времени в будущем, когда должен быть запущен эффект изменения цвета.
  3. Когда каждый клиент получает сообщение с изменением цвета, он смотрит на запланированную временную метку в ближайшее время, исправляет привязку времени и назначает событие против своих собственных часов.
  4. Когда это время приходит к каждому клиенту, каждый клиент начинает воспроизведение события.

Это будет точно так же, как указание времени, которое вы устанавливаете на шаге 1, и здесь находится сложная часть и где установлена ​​точность отсутствия точности. В этом посте описано описание одного метода: Measuring time difference between networked devices.

Как только вы установили временную дельта между клиентскими часами и опорными часами, вы храните эту дельту локально, и вы можете применить эту дельта к любым директивам будущего времени с сервера. Итак, если вы получаете директиву для выполнения какой-либо операции в 12:30 - 05.00, но ваши клиентские часы были измерены на +12.33 секунды быстрее от ссылки на сервер, тогда вы вычтите это +12.33 секунды с запланированного времени и установите таймер, который будет срабатывать при 12: 29: 52.67 на ваших местных часах.

Вы обрабатываете тот факт, что время транзита для каждого клиента может быть не таким, отправив директиву на определенное время в будущем. Вы можете выбрать любое время в будущем, но это не должно быть более длительным временем в будущем, чем самое длинное время перехода к любому клиенту. Вы также можете измерить это от каждого клиента и сообщить об этом на сервер или если у вас есть достаточно времени для планирования заранее, вы можете просто отправить сообщение с директивой по крайней мере за несколько секунд досрочно (дольше, чем любое время транзита, вероятно, будет быть в нормальных условиях эксплуатации).

Смежные вопросы