Как реализовать механизм получения обновления от сервера?
Есть приложение которое управляет устройством через сервер. Управление заключается в передаче Json объекта на устройство. Json объект формируется из данных в БД. Выбор передаваемых значений из БД происходит со стороны приложения.
Как правильно реализовать отправление Json объекта на устройство?
Основное время работы устройство не должно получать никаких обновлений, пока в один момент в приложении не будет нажата кнопка.
Пока есть два варианта реализации:
1. Приложение вносит изменения в БД, а веб приложение постоянно слушает БД на предмет изменения определенной таблицы и при изменении формирует Json, а устройство постоянно опрашивает серверное приложение (Flask)
Минусы: - постоянное подключение веб приложения к БД
2. Приложение само в нужный момент вытаскивает из БД необходимые параметры, формирует json и отправляет post запросом в веб приложение flask. Flask сохраняет json в файл, а устройство стучится к этому файлу и, когда он появляется, загружает json.
Минусы: -постоянное создание файлов
И сопутствующий вопрос
2.2 как это реализовывается в flask? Как при post запросе создать новый роут с токеном устройства, и по этому роуту создать файл?
В идеале, хотелось бы сделать что-то среднее:
Приложение отправляет запрос с идентификатором устройства и параметром по которому вытаскивать значения из бд, Flask достаёт данные из бд, формирует json и создаёт роут через обращение к которому устройство в ответ получает json.
В данном случае не понятна техническая реализация того, какие средства flask нужно использовать и реализуемо ли это в принципе?
ну вы нажимаете на кнопку в приложении - отправляете http-запрос на сервер, сервер получает запрос, идет в базу, собирает нужный джейсон для устройства, отправляет на устройство (через какой протокол вы не указали, думаю тоже через http). так не получится?
Alex, да, протокол http
Получается в одном роут, к которому обращается приложение есть функция получения значений из БД, и сборки json
А вот дальше не очень понимаю
По какому url должно обращаться устройство? По идее этот урл должен создаваться после запроса от приложения (чтобы у каждого устройства был собственный урл, а не чтобы устройство парсило большой Джейсон для всех устройств и искала конкретно свои параметры), а потом по этому урлу формировать ответ для устройства.
Как на фласке можно создать динамически урл и на нем сформировать нужный ответ?
Alex, проект в универе - мультиварка на esp8266, просто хотелось бы подойти правильно с точки зрения архитектуры.
Если урлы динамически не создавать, то большое количество устройств обращается по одному урлу, то сервер выдает много джейсона, в котором содержатся параметры для каждого устройства, соответсвенно каждое устройство должно скачивать общий джейсон и искать свои параметры, по ощущениям это не очень хороший подход
во фласке разбираюсь плохо, поэтому хотелось чтобы тыкнули куда копать)
VaniLuksh, вы зря считаете что дело во фласке) надо сначала понять в целом что вы хотите) код и фреймворк это второстепенно, сначала сама архитектура должна быть понятна)
так может из фласка отправлять запрос на мультиварку? такое возможно? я просто так низкоуровнево не играю.
типа
Alex, чтобы на мультиварку отправить запрос, мультиварка должна быть в режиме сервера, а значит у нее должен быть статичный ip, если я правильно понимаю
как вы собирались до мультиварки доставлять json?)
Alex, в мультиварке esp8266, которая в режиме клиента обращается нонстопом к серверу, когда серверу есть что ответить, он формирует json и при следующем обращении мультиварки отправляет ему этот json
Alex, получается каждый раз (а мультиварка должна нонстопом обращаться по /get-task) функция в /get-task обращается к базе
я подумал что не очень хорошо получается, что база постоянно прослушивается на предмет обновления какой то определенной таблицы
VaniLuksh, зависит от того как часто мультиварки стреляют по серваку и сколько их миллионов) можно кэшировать промежуточный результат если вы не хотите напрягать базу ДАННЫХ для получения ДАННЫХ
Есть такая штука API называется. Сделай на своем Flask два API. API 1 будет принимать запросы от ПРИЛОЖЕНИЯ и сохранять их где то. API 2 будет принимать запросы от УСТРОЙСТВА и отдавать ему данные созданные на основе того что было получено от ПРИЛОЖЕНИЯ.
1. update_task. Приложение get запросом передаёт параметры, которые нужны для запроса к БД, после чего Flask создаёт json и сохраняет в static
2. get_task. для устройства, по которому он стучит flask на предмет появления этого файла. Когда файл появляется (после update_task) Flask на запрос от устройства отвечает ранее созданном json’ом
3. Delete_task. нужен для удаления файла, после того как устройство его получило. Выполняется устройством после удачного получения json