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

Данные из сайта

Cuper

Member
Есть 2 EPS8266. Оба подключены к одному и тому же роутеру. Первая создает http сервер, помещая туда 0 или 1(В зависимости от данных с датчика, подключёного к первой ESP.) Вторая ESP должна зайти на этот сервер и вытащить эту 0 или 1. Как это можно реализовать?
 

CodeNameHawk

Moderator
Команда форума
самый простой вариант написать свою прошивку.
чуть Более сложный вариант найти готовy прошивкую, которых много.
 

Сергей_Ф

Moderator
Команда форума
@Cuper, не совсем понятно что вызывает трудности? Вы же задачу полностью сформулировали. Берете знакомый язык программирования и пишете. Если Lua или Arduino IDE то примеров в сети полно. Если языками не владеете, то сначала надо их выучить. В качестве старта вполне подойдут уроки Сергея Третьякова.
 

kab

New member
@Cuper, не совсем понятно что вызывает трудности? Вы же задачу полностью сформулировали. Берете знакомый язык программирования и пишете. Если Lua или Arduino IDE то примеров в сети полно. Если языками не владеете, то сначала надо их выучить. В качестве старта вполне подойдут уроки Сергея Третьякова.
Насколько я помню (уроки не пересматривал довольно давно) - у Сергея Третьякова основная концепция - сервер на ESP, а вход к нему с компа, либо смартфона. Но, пока ТС освоит сервер на ESP, к тому времени, надеюсь, попадется и пример для клиента на ESP. На форуме это было. Если будут затруднения - поможем.:)
 

Cuper

Member
Если будут затруднения - поможем.:)
Спасибо :)
У меня возникла небольшая проблема. Смотрел я 6 урок Сергея Третьякова по подключению на сайт, и у него, при нажатии на кнопку отправлялись данные. Но у меня это должно происходить автоматически. Но это не большая проблема, а как сделать подключение?
Код:
void HTTP_init(void) {
  HTTP.on("192.168.1.7", handle_Set_Ssdp);   // Как тут указать запрос?
}
void handle_Set_Ssdp() {
  v = HTTP.arg("192.168.1.7/"); // А тут как?
  HTTP.send(200, "text/plain", "OK");
}
Ниже сам сервер, как оттуда вытащить эту единицу?
 

Вложения

  • 15.2 KB Просмотры: 11

Сергей_Ф

Moderator
Команда форума
@Cuper, в смысле других? Вы же сами хотели достать единицу со страницы сайта.
Есть много других вариантов передачи данных без сайта и без http.
 

Сергей_Ф

Moderator
Команда форума
@Cuper, UDP, esp-now, mqtt, провода, наконец. Есть ещё прошивка для Sonoff от того же Третьякова, там тоже можно передать данные от одного esp к другому, если не ошибаюсь.
 

kab

New member
кнопку отправлялись данные. Но у меня это должно происходить автоматически
У меня сложилось впечатление, что Вы нечетко представляете взаимодействие клиент-сервер. Сервер ничего не делает автоматически. Это пассивная сторона (не подумайте чего плохого :)). Клиент посылает запрос - сервер в ответ посылает ответ. Простейший запрос, это когда в адресной строке интернет браузера указывается просто адрес сервера. В стандартном обмене подразумевается, что сервер, получив такой запрос, выполнит у себя файл index.html (формирование страницы сайта по умолчанию) - и сформированный ответ-страницу вернёт клиенту. Если стандартному серверу отправите запрос состоящий из адреса сервера плюс что-то типа page1 - сервер у себя будет искать страницу page1.html и запускать её для формирования ответа клиенту.
Библиотека сервера для ESP8266 работает чуть по-другому: в функции ... .on('page1',func1) Вы описываете поведение сервере на ESP - если сервер увидит в составе строки от клиента буквы "page1", то он (сервер) запустит функцию func1. И подразумевается (хотя это не обязательно), что эта функция сформирует строку с ответом otvet (включив все значения всех датчиков :)) и потом функцией .... .send(otvet) отошлет назад на клиента.

Как-то так(с)...

ЗЫ1.
HTTP.on("192.168.1.7", handle_Set_Ssdp);
Т.к. это ip-адрес сервера и присутствует в каждой строке, то здесь это означает, что функция handle_Set_Ssdp будет вызываться на каждое обращение клиента.

ЗЫ2. Насчет парсить ответ для поиска значений: если Вы в состав ответа сервера включите что-то типа "per1='123'", то существуют функции в клиенте позволяющие получить этот ответ типа
otvet.parse('par1') -- вернёт '123'
Писал по памяти - точные выражения ищите в документации и примерах.

ЗЫ3 Что делает ... .arg - не помню
 
Последнее редактирование:

Алексей.

Active member
Простейший запрос, это когда в адресной строке интернет браузера указывается просто адрес сервера. В стандартном обмене подразумевается, что сервер, получив такой запрос, выполнит у себя файл index.html (формирование страницы сайта по умолчанию) - и сформированный ответ-страницу вернёт клиенту.
Вы так считаете? Сервер "выполняет файлы"???
Сервер выполняет методы, передаваемые в запросах, и возвращает результат выполнения в ответах, разве не так?

ЗЫ1.
HTTP.on("192.168.1.7", handle_Set_Ssdp);
Т.к. это ip-адрес сервера и присутствует в каждой строке, то здесь это означает, что функция handle_Set_Ssdp будет вызываться на каждое обращение клиента.
kab, У Вас действительно так работает?

При вызове метода void on(const String &uri, THandlerFunction handler) у сервера, передется тот самый ip-адрес в качестве uri и это означает что запрос будет обработан если он буде выглядеть http://192.168.1.7/192.168.1.7

Здесь добавление обработчика ESP8266WebServer/src/ESP8266WebServer.cpp
Код:
void ESP8266WebServer::on(const String &uri, ESP8266WebServer::THandlerFunction handler) {
  on(uri, HTTP_ANY, handler);
}

void ESP8266WebServer::on(const String &uri, HTTPMethod method, ESP8266WebServer::THandlerFunction fn) {
  on(uri, method, fn, _fileUploadHandler);
}

void ESP8266WebServer::on(const String &uri, HTTPMethod method, ESP8266WebServer::THandlerFunction fn, ESP8266WebServer::THandlerFunction ufn) {
  _addRequestHandler(new FunctionRequestHandler(fn, ufn, uri, method));
}
в нашем случае uri=192.168.1.7 передается в конструктор FunctionRequestHandler

Здесь обертка над обработчиком ESP8266WebServer/src/detail/RequestHandlersImpl.h, uri и метод (наш HTTP_ANY) просто сохраняются
Код:
class FunctionRequestHandler : public RequestHandler {
public:
    FunctionRequestHandler(ESP8266WebServer::THandlerFunction fn, ESP8266WebServer::THandlerFunction ufn, const String &uri, HTTPMethod method)
    : _fn(fn)
    , _ufn(ufn)
    , _uri(uri)
    , _method(method)
    {
    }
protected:
    String _uri;
А вот тут вызов обработчика если uri совпадает (тот же файл ESP8266WebServer/src/detail/RequestHandlersImpl.h)
Код:
bool canHandle(HTTPMethod requestMethod, String requestUri) override  {
        if (_method != HTTP_ANY && _method != requestMethod)
            return false;

        if (requestUri != _uri)
            return false;

        return true;
    }
bool handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) override {
        (void) server;
        if (!canHandle(requestMethod, requestUri))
            return false;

        _fn();
        return true;
    }
 
Последнее редактирование:

kab

New member
@Алексей.
C ... .on(...) я действительно несколько промахнулся, не обратив внимания, что аргументы какие-то не такие как в примерах, которые я разбирал для себя. Переопределение функций, тудыт его... :(. Что-то понял, что-то дофантазировал...

А насчет
Сервер "выполняет файлы"???
- пытался более простым языком изложить то, что я и представляю весьма примерно. Но вроде бы такого понимания пока хватало для моих целей.

Спасибо за подробный разбор. Надеюсь, Вам тоже это принесло какую-либо пользу...

ЗЫ. А кстати, разве я был не прав, утверждая, что отправляя с браузера(клиента) на сервер чисто адрес сервера, мы на клиенте в ответе получим html-страницу, сформированную на основе index.html? По сути, не придираясь к точности формулировок...
 

Алексей.

Active member
ЗЫ. А кстати, разве я был не прав, утверждая, что отправляя с браузера(клиента) на сервер чисто адрес сервера, мы на клиенте в ответе получим html-страницу, сформированную на основе index.html? По сути, не придираясь к точности формулировок...
Какая я страница, о чем Вы? Самое простое что нужно ТС, это простой rest без каких либо html, ничего больше не нужно, один модуль (клиент) выполняет запрос, другой (сервер) отвечает, обмениваются простым плайн-текстом или джейсоном если хотите, библиотека клиента и сервера уже есть.
Зачем тянуть туда ещё html?? На клиенте броузер чтоли по вашему должен работать???

Отправляя запрос с броузера, в адресной строке "чисто адрес сервера" сервер обрабатывает его в соответствии с правилами обработки запрошенного uri и заголовка Host:, в данном случае броузер пытается выполнить метод GET / HTTP/1.1 в ответ может например получить
HTTP/1.1 301 Moved Permanently
Location: https://esp8266.ru/
Я запросил пытался открыть http://esp8266.ru а почему то открылась другая ссылка, вот чудеса, куда делся index.html

Теперь попробуем выполнить запрос для ya.ru но укажем "чисто адрес сервера"
сначала резолвем днс
alex@hp-envy-13:~$ host ya.ru
ya.ru has address 87.250.250.242
ya.ru has IPv6 address 2a02:6b8::2:242
ya.ru mail is handled by 10 mx.yandex.ru.

теперь выполним запрос
alex@hp-envy-13:~$ curl -v http://87.250.250.242
* Rebuilt URL to: http://87.250.250.242/
* Trying 87.250.250.242...
* Connected to 87.250.250.242 (87.250.250.242) port 80 (#0)
> GET / HTTP/1.1
> Host: 87.250.250.242
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 406 Not acceptable
< Content-Length: 0
< Connection: Close
<
* Closing connection 0
вот вам и 406-я ошибка

kab, А зачем Вам всё это? типо поржать?
 

kab

New member
kab, А зачем Вам всё это? типо поржать?
Похоже, ТС понимает тему еще хуже меня - я пытался дотянуть его хотя бы до своего уровня (типа популярного введения во взаимодействие клиент-сервер). Жалко, что допустил фактические ошибки - на которые Вами было указано...
Конечно, я не предлагал использовать на есп8266 index.html. Его привел просто для примера, т.к. сразу грузить ТС особенностями реализации сервера ESP8266WebServer - человека жалко :).
 

Алексей.

Active member
Его привел просто для примера, т.к. сразу грузить ТС особенностями реализации сервера ESP8266WebServer - человека жалко :)
Грузить я вовсе не собирался, просто сказал почему не будет работать HTTP.on("192.168.1.7", handle_Set_Ssdp), извините я забыл что разбираться как оно работает, здесь не принято.
TC в первом посте про html даже и не упомянул, сказал что на одном модуле должен быть http сервер, а другой модуль с этого сервера должен получать состояние датчика, а Вы туману с броузером, страницами и html-ами всякими напустили.
 

kab

New member
Грузить я вовсе не собирался, просто сказал почему не будет работать HTTP.on("192.168.1.7", handle_Set_Ssdp), извините я забыл что разбираться как оно работает, здесь не принято.
TC в первом посте про html даже и не упомянул, сказал что на одном модуле должен быть http сервер, а другой модуль с этого сервера должен получать состояние датчика, а Вы туману с броузером, страницами и html-ами всякими напустили.
Б'ольшая часть человечества (разумного :) ) начинает знакомиться с интернет-программированием, всё-таки с броузера, и простейшей html-страницы. Поэтому я и пытался построить аналогию. Поскольку реакции ТС не было и нет - значит я зря потратил время. Не считая, что вот с Вами пообщались:). Мне нравиться Ваша черта характера - разбирать досконально заинтересовавший вопрос вплоть до "глубин" текстов библиотек. Я слишком ленив для этого. Что-то похватал по верхушкам - теперь пытаюсь помочь совсем уж нулевым "энтузиастам"...
 
Сверху Снизу