• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как .handleClient() применить на данные полученные от сервера

Всем здрасте.
Есть такая проблема.
Создал устройство с вэб-интерфейсом и сервером.
Но проброс портов и т.п. - надоело. Решил сделать облако - т.е. оператор и устройство подключаются к удаленному серверу где происходит "состыковка" (ddns + простой маршрутизатор, сделанный в процессинге).
Всё вроде получилось и данные перенаправляются и к устройству и к оператору, но библиотека для вэбсервера очень проста к счастью и все ответы расшифровываются автоматически - в loop указываем server.handleClient() и небольшая инициализация страниц.
Но если ESP получает данные от сервера, то парсинг html запроса не так легко сделать. Так как библиотека webserverclient не поддерживает данные от client.
В общем как даные полученные client передать собственному серверу, чтобы web страница работала и как сервер и как клиент.
Может кто помочь?
 
Пардон... Нифига не понял.
Можно создать сервер на есп. Подключиться к нему, отправить запрос и получить ответ html, и на планшете появится вэб страница.
А есть вариант, когда есп подключается к удаленному серверу и ждёт запрос от него чтобы после ответить удаленному серверу.
 

Алексей.

Active member
qwertynoon, Если Ваш есп может подключаться к удаленному серверу, я полагаю через wifi-роутер с доступом в и-нет, то почему нельзя удаленному серверу подключаться к есп через wifi-роутер.
wifi-роутер строит туннель до сервера, сервер проксирует запросы заворачивая их на wifi-роутер через туннель, wifi-роутер в свою очередь пробрасывает tcp на есп. В этом случае всю тяжеловесную статику можно вынести на сервер, на на есп оставить только апи для получения данных.
 
Всем здрасте.
...Но если ESP получает данные от сервера, то парсинг html запроса не так легко сделать. Так как библиотека webserverclient не поддерживает данные от client.
В общем как даные полученные client передать собственному серверу, чтобы web страница работала и как сервер и как клиент.
Тоже ищу способ повернуть server.handleClient() мордой к серверу-ретранслятору на белом IP. Получилось ли что нибудь?
 

Алексей.

Active member
Тоже ищу способ повернуть server.handleClient() мордой к серверу-ретранслятору на белом IP. Получилось ли что нибудь?
А в чем проблема то?
На сервере поднимаете vpn, на роутере поднимаете клиента, на сервере пробрасываете порт клиенту (роутеру), а он пробрасывает на esp.
 
А в чем проблема то?
На сервере поднимаете vpn, на роутере поднимаете клиента, на сервере пробрасываете порт клиенту (роутеру), а он пробрасывает на esp.
Спасибо, но или я вас не понимаю (даже определенно не понимаю пока предложенный способ) или вы меня.
У меня есть ESP, уже работающий как сервер. В локальной сети я через браузер подключаюсь к нему и получаю ответы в виде веб страниц. Браузер может подключаться к ESP откуда угодно, но ESP должен быть в локалке за белым IP.
Я хочу иметь то же самое в случае, когда и ESP находится где угодно.
За белым IP в локальной сети запущен сервер, к которому на один порт подключается ESP как клиент (через сокет), на другой порт коннектится устройство с браузером. Сервер просто получает запрос от браузера и пересылает через сокет на ESP. Это работает.
Но, теперь на ESP приходится добавлять функции, обрабатывающие запрос, что увеличивает объем программы. Вопрос в том, чтобы использовать код ESP как сервера (обработка HTTP запроса и построение HTML страницы - все что делают функции библиотеки ESP8266WebServer) в случае, когда запрос приходит на ESP как к клиенту.
По сути, нужно найти буферы, куда server.handleClient() принимает запрос и куда server.send ( 200, "text/html", html_page ) помещает готовый к посылке ответ.
Надеюсь, понятно написал.
 

Алексей.

Active member
Но, теперь на ESP приходится добавлять функции, обрабатывающие запрос, что увеличивает объем программы. Вопрос в том, чтобы использовать код ESP как сервера (обработка HTTP запроса и построение HTML страницы - все что делают функции библиотеки ESP8266WebServer) в случае, когда запрос приходит на ESP как к клиенту.
По сути, нужно найти буферы, куда server.handleClient() принимает запрос и куда server.send ( 200, "text/html", html_page ) помещает готовый к посылке ответ.
Надеюсь, понятно написал.
Да у вас уж всё работает, только, как я понял, ресурсов не достаточно чтоб тяжёлые страницы отгружать.
Так на сервере поднимите nginx, вся тяжёлая статика пусть на сервере лежит, её nginx отгружать броузеру будет, а рестОвые запросы для esp по урлам nginx проксить будет и только.
Буферы только для джейсонов останутся например, всё остальное скриптами, что на сервере.

Например: нужно отобразить на странице градусник, броузер загружает страницы стили скрипты изображения и т.п. в сртипте запрашивает по определенному урлу температуру, этот запрос проксится на esp, получив ответ в скрипте - раскрашиваем градусник.

П.С. Если вы ещё для вашего сервера зарегили домен, то можете получить бесплатный ssl сертификат и использовать защищенное соединение.
 
Да у вас уж всё работает, только, как я понял, ресурсов не достаточно чтоб тяжёлые страницы отгружать.
Например: нужно отобразить на странице градусник, броузер загружает страницы стили скрипты изображения и т.п. в сртипте запрашивает по определенному урлу температуру, этот запрос проксится на esp, получив ответ в скрипте - раскрашиваем градусник.
Это понятно (и даже легче), но пока что хочется просто встроить этот функционал в существующие программы без особой переделки кода и "оставить все в одном стакане".
Пытаюсь копать саму библиотеку ESP8266WebServer, попутно изучая ООП. Надеюсь все же вытащить искомые поля.
 

nikolz

Well-known member
Это понятно (и даже легче), но пока что хочется просто встроить этот функционал в существующие программы без особой переделки кода и "оставить все в одном стакане".
Пытаюсь копать саму библиотеку ESP8266WebServer, попутно изучая ООП. Надеюсь все же вытащить искомые поля.
попробуйте изучить ардуино и примеры скриптов на нем. ООП изучать пока нет смысла.
 

CodeNameHawk

Moderator
Команда форума
А есть вариант, когда есп подключается к удаленному серверу и ждёт запрос от него чтобы после ответить удаленному серверу.
Пусть есп каждую секунду обращается к удаленному серверу и проверяет поступили ли ей данные, если есть дает ответ, если нет отключение.
 

CodeNameHawk

Moderator
Команда форума
Без сервера на есп, если она не подключилась к кому то, данные с есп не получите.
 
как я понял ESP слушает WiFi-порт постоянно, и для отсылки данных нужно останавливать сервер. подобную проблему решил таким способом: через UART подключил ESP-01 в режиме клиента, можно сделать 2-й модуль прозрачным UART -> WiFi
 

CodeNameHawk

Moderator
Команда форума
как я понял ESP слушает WiFi-порт постоянно
У WiFi нет порта, есть номер канала, а вот сервер имеет порт.
и для отсылки данных нужно останавливать сервер
Не надо останавливать сервер, если речь об отсылке данных с есп, то нужен client, который подсоединиться к удаленному серверу и отошлет данные.
 
У меня упорно не хотел отправлять данные на удаленный сервер пока не остановишь сервер на ESP, только после остановки срабатывал .client . Отправка по UART при этом работает нормально
 

CodeNameHawk

Moderator
Команда форума
У меня упорно не хотел отправлять данные на удаленный сервер пока не остановишь сервер на ESP
Вы же понимаете, что сделать так. что бы не работало то, что может работать, многих усилий не требует?
 
Вы же понимаете, что сделать так. что бы не работало то, что может работать, многих усилий не требует?
Понимаю, но с ESP я новичок, и искал информацию как отправлять данные на удаленный сайт с данного модуля работающего в режиме сервера, и не нашел нигде адекватных разъяснений как это сделать. В основном всё что я нашел работает по принципу Ардино ->UART -> ESP, но ведь если подключен 1 датчик это равносильно забиванию гвоздя микроскопом. Сам опытным путем сделать смог только так, как описано выше, либо с помощью запроса с сайта, но при динамическом айпи запрос с сайта обрастает кучей настроек, которые без нормального роутера сложно сделать. Точнее их надо при каждом запуске делать
 

nikolz

Well-known member
Понимаю, но с ESP я новичок, и искал информацию как отправлять данные на удаленный сайт с данного модуля работающего в режиме сервера, и не нашел нигде адекватных разъяснений как это сделать. В основном всё что я нашел работает по принципу Ардино ->UART -> ESP, но ведь если подключен 1 датчик это равносильно забиванию гвоздя микроскопом. Сам опытным путем сделать смог только так, как описано выше, либо с помощью запроса с сайта, но при динамическом айпи запрос с сайта обрастает кучей настроек, которые без нормального роутера сложно сделать. Точнее их надо при каждом запуске делать
сервер отправляет данные только по запросам.
чтобы отправлять на сервер надо поставить клиента.
--------------------
для справки:
сервер - это программа которая слушает порт и если что-то пришло то обрабатывает и отвечает
клиент - это программа которая посылает что-то на порт по ip других программ которые называются серверами.
 
Сверху Снизу