Как синхронизировать информацию между облаком и устройством

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

Облаку необходимо знать состояние устройства, например, когда сеть прерывается и когда сеть восстанавливается.

Когда сеть восстанавливается, измененная информация в облаке синхронизируется с устройством.

кто-нибудь понял, каким должен быть мой подход? какие-нибудь советы?

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

Я хочу, чтобы управляющая информация и информация о данных синхронизировались в облаке и на устройстве


person moluzhui    schedule 29.07.2019    source источник


Ответы (1)


Основываясь на вашем теге, я предполагаю, что вы используете MQTT в качестве протокола обмена сообщениями для своей системы. Если это так, чтобы удовлетворить вашу потребность в отслеживании состояния подключения устройства к облаку, MQTT определяет функцию под названием «Последняя воля и завещание».

Из стандартного раздела MQTT 3.1.1 3.1.2.5:

Если для параметра Will Flag установлено значение 1, это указывает на то, что, если запрос на подключение принят, Will Message ДОЛЖЕН быть сохранен на сервере и связан с сетевым подключением. Сообщение Will ДОЛЖНО быть опубликовано, когда сетевое соединение впоследствии закрывается, если только сообщение Will не было удалено сервером после получения пакета DISCONNECT [MQTT-3.1.2-8].

Это можно использовать, чтобы сообщить удаленному клиенту MQTT в облаке, когда устройство подключено и когда оно отключается, путем публикации online полезной нагрузки в теме (например) device/conn_status после успешного подключения и регистрации сообщения Last Will offline в та же тема. Теперь всякий раз, когда клиент устройства отключается, брокер будет публиковать полезные данные offline от его имени в облачном клиенте, который теперь может действовать соответствующим образом.

person Skrino    schedule 02.08.2019
comment
Во-первых, большое спасибо, это было здорово в моем тесте. Во-вторых, я обнаружил небольшую проблему, он не может вовремя реагировать, когда сеть отключается вручную, задержка составляет около 90 секунд, и вовремя реагировать, когда я нажимаю ctrl + c, чтобы прервать программу. Есть ли какой-либо другой API, который позволяет ему вовремя реагировать на волю? - person moluzhui; 03.08.2019
comment
Эта 90-секундная задержка, которую вы наблюдаете, связана с периодом Keep Alive, предоставленным клиентом брокеру во время установления соединения. Период Keep Alive указывает количество секунд, по прошествии которых, если не было обмена сообщениями (pub/subs и pings), брокер сочтет клиента аварийно отключенным и отправит сообщение LWT (если клиент зарегистрировал его). 90-секундный период, вероятно, является значением по умолчанию для реализации вашего клиента — вы можете изменить его на любое значение, подходящее для вашего приложения. - person Skrino; 03.08.2019