Плата NodeMCU (ESP8266), управляемая через базу данных общего хостинга

У меня есть плата NodeMCU (ESP8266), которой я хочу управлять через Интернет. Я пытаюсь найти решение, при котором мне не придется настраивать какие-либо конфигурации на моем маршрутизаторе, например переадресацию портов. Я придумал следующее решение:

У меня есть веб-сайт, на котором пользователь меняет статус устройства (под статусом я имею в виду, например, ВЫСОКОЕ или НИЗКОЕ значение контакта GPIO5), который затем сохраняется в базе данных на сервере общего хостинга. NodeMCU периодически (например, каждые 5 секунд) отправляет запрос HTTP GET в базу данных. В соответствии со значением, полученным из базы данных, плата NodeMCU меняет значение контакта на HIGH или LOW. Если NodeMCU меняет свой статус (например, значение контакта с HIGH на LOW), новый статус устройства отправляется в базу данных с помощью HTTP-запроса POST. Устройство также периодически отправляет запрос HTTP POST (например, каждые 60 секунд), чтобы пользователь мог отслеживать состояние устройства на веб-сайте.

С этой конфигурацией есть несколько проблем:

  1. Между NodeMCU и пользователем нет соединения в реальном времени (есть всегда задержка ответа устройства)
  2. Устройство каждый день отправляет тысячи запросов, которые являются нагрузкой для сервер общего хостинга. Например, если отправлен запрос GET каждые 5 секунд, что дает 17280 запросов в день для одного устройства.

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

, 👍1

Обсуждение

HTTP-запрос может подождать, пока серверу не будет что отправить в качестве ответа., @Juraj

@Juraj, пожалуйста, ознакомьтесь с моим вопросом в stackoverflow https://stackoverflow.com/questions/55932766/postpone-http-get-response-until-the-user-changes-the-value-in-the-database, @Slaven Tojic

вы можете проверить, подключен ли клиент, и если нет, отправить запрос еще раз. но я не знаю, как справиться со стороной php, @Juraj

просто используйте веб-сокеты; двусторонний протокол с постоянным соединением и низкими издержками, поддерживаемый платформами веб-серверов и ESP. Вы также можете использовать события, отправляемые сервером, которые может поддерживать практически любой PHP-блок, и для которых вы можете легко модифицировать существующие библиотеки ESP для обработки., @dandavis

@dandavis могу ли я использовать веб-сокеты без необходимости настройки маршрутизатора (например, настройки переадресации портов), @Slaven Tojic

websockets работает без изменения каких-либо настроек маршрутизатора., @dandavis

@dandavis Я пытался использовать веб-сокеты, но у меня возникли некоторые трудности с поиском примера (как установить сервер веб-сокетов на сервере общего хостинга) в Интернете. Знаете ли вы, где я могу найти пример, где сервер веб-сокета находится на сервере общего хостинга, а клиент веб-сокета — ESP8266?, @Slaven Tojic

вы, вероятно, не сможете сделать это на общем сервере, вам придется использовать SSE, легкую модификацию обычного HTTP., @dandavis


1 ответ


Лучший ответ:

2

Используйте MQTT.

Вам нужно:

  1. Библиотека PubSubClient.h
  2. Сервер MQTT

Для MQTT в Интернете есть несколько бесплатных программ (спросите Google). Или, если у вас есть доступный для использования сервер Linux (например, дешевый VPS-сервер от одного из многих онлайн-провайдеров), вы можете запустить свой собственный с помощью mosquitto.

MQTT работает примерно так, как вы описываете, но он не выполняет постоянные запросы GET — он открывает одно соединение с сервером MQTT, и запросы в реальном времени отправляются по нему клиенту и обратно от клиента на сервер.

р>

Общение практически в реальном времени.

,