• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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-страницы. Поэтому я и пытался построить аналогию. Поскольку реакции ТС не было и нет - значит я зря потратил время. Не считая, что вот с Вами пообщались:). Мне нравиться Ваша черта характера - разбирать досконально заинтересовавший вопрос вплоть до "глубин" текстов библиотек. Я слишком ленив для этого. Что-то похватал по верхушкам - теперь пытаюсь помочь совсем уж нулевым "энтузиастам"...
 
Сверху Снизу