Плата NodeMCU (ESP8266), управляемая через базу данных общего хостинга
У меня есть плата NodeMCU (ESP8266), которой я хочу управлять через Интернет. Я пытаюсь найти решение, при котором мне не придется настраивать какие-либо конфигурации на моем маршрутизаторе, например переадресацию портов. Я придумал следующее решение:
У меня есть веб-сайт, на котором пользователь меняет статус устройства (под статусом я имею в виду, например, ВЫСОКОЕ или НИЗКОЕ значение контакта GPIO5), который затем сохраняется в базе данных на сервере общего хостинга. NodeMCU периодически (например, каждые 5 секунд) отправляет запрос HTTP GET в базу данных. В соответствии со значением, полученным из базы данных, плата NodeMCU меняет значение контакта на HIGH или LOW. Если NodeMCU меняет свой статус (например, значение контакта с HIGH на LOW), новый статус устройства отправляется в базу данных с помощью HTTP-запроса POST. Устройство также периодически отправляет запрос HTTP POST (например, каждые 60 секунд), чтобы пользователь мог отслеживать состояние устройства на веб-сайте.
С этой конфигурацией есть несколько проблем:
- Между NodeMCU и пользователем нет соединения в реальном времени (есть всегда задержка ответа устройства)
- Устройство каждый день отправляет тысячи запросов, которые являются нагрузкой для сервер общего хостинга. Например, если отправлен запрос GET каждые 5 секунд, что дает 17280 запросов в день для одного устройства.
Поэтому мой вопрос заключается в том, насколько практична эта конфигурация на общем хостинге или любом другом хостинге, каковы альтернативы или улучшения этой конфигурации и как установить соединение с NodeMCU, чтобы устройство отправляло GET-запрос в базу данных. только тогда, когда статус устройства изменяется в базе данных пользователем.
@Slaven Tojic, 👍1
Обсуждение1 ответ
Лучший ответ:
Используйте MQTT.
Вам нужно:
- Библиотека PubSubClient.h
- Сервер MQTT
Для MQTT в Интернете есть несколько бесплатных программ (спросите Google). Или, если у вас есть доступный для использования сервер Linux (например, дешевый VPS-сервер от одного из многих онлайн-провайдеров), вы можете запустить свой собственный с помощью mosquitto
.
MQTT работает примерно так, как вы описываете, но он не выполняет постоянные запросы GET — он открывает одно соединение с сервером MQTT, и запросы в реальном времени отправляются по нему клиенту и обратно от клиента на сервер.
р>Общение практически в реальном времени.
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
- Простой запрос GET с ESP8266HTTPClient
- В ESP-12E NodeMCU, какой выход PIN A0?
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