Отправка данных в POST массив.

Тема в разделе "ESP8266, ESP32", создана пользователем dima11711, 29 дек 2019.

  1. DIYMan

    DIYMan Guest

    Да господи, почитайте уже документацию к jQuery, в частности, к методу ajax - там можно указывать URL, куда посылать запрос.
     
  2. parovoZZ

    parovoZZ Гуру

    А что там есть? На веб-сервере должен быть кто-то, кто ждёт информацию. А смысл отправлять, если на веб-сервере ничего нет?
     
  3. Aleksander_33

    Aleksander_33 Нерд

    Здравствуйте!
    Позвольте мне вмешаться со своим вопросом.
    Для ESP 8266 всё понятно там "Data = server.arg("Name"); " получаешь данные и всё.
    А как для ESP 32 не понятно " class WiFiServer " не поддерживает метод " server.arg " возможно есть другая библиотека или другой метод
    для получения данных с веб формы метод POST?
    Поясните пожалуйста.
    Для примера вот HTML страничка:
    client.println("<!DOCTYPE html><html>");
    client.println("<meta charset=\"utf-8\">");
    client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
    client.println("<title>Ticker control</title>");
    // аголовок Веб-Страницы
    client.println("<body><h1>ESP 32 Web Server</h1>");
    client.println("<form action=\"\" method=\"post\">");
    client.println("<input type=\"text\" name=\"text\" placeholder= \"Введите текст\" required >");
    client.println("<input type=\"text\" name=\"Size\"/>");
    client.println("<input type=\"submit\" value=\"применить\">");
    client.println("</form>");
    client.println("</body></html>");
    В ESP 8266 все работает, а в ESP 32 ?????
     
    Последнее редактирование: 1 апр 2020
  4. И на esp8266 метода arg нет у класса WiFiServer, а у класса ESP8266WebServer есть.
    Точно так-же и у esp32, у класса WebServer (espressif/esp32/libraries/WebServer/src/WebServer.h) есть метод arg.
     
  5. Aleksander_33

    Aleksander_33 Нерд

    Да но " class WebServer " не поддерживает метод " .available() " как слушать порт
     
  6. Подскажите пожалуйста, для чего веб-серверу, обрабатывающему http запросы нужен available()?
    Для методов get/post добавили бы соответствующие обработчики, получали бы разобранные запросы и строили ответы, почему этого не достаточно?
    Уровень протокола http уже реализован (в каком-то объеме).

    На esp8266 тоже нет этого метода у веб-сервера :)
    Код (Text):
    using ESP8266WebServer = class esp8266webserver::ESP8266WebServerTemplate<WiFiServer>' has no member named 'available'
     
    Последнее редактирование: 1 апр 2020
  7. Aleksander_33

    Aleksander_33 Нерд

    Я думал, что это должно выглядеть примерно так:
    Код (Text):
      WiFiClient client = webServer.available();   // Прослушивание входящих клиентов
      if (client) {                             // Если подключается новый клиент,
        Serial.println("New Client.");          //распечатайте сообщение в последовательном порту
        String currentLine = "";                //создайте строку для хранения входящих данных от клиента
        while (client.connected()) {            // зацикливаемся пока клиент подключен
          if (client.available()) {             // если есть байты для чтения с клиента,
            char c = client.read();             // тогда считайте байт
            Serial.write(c);                    // распечатайте его на серийном мониторе
            header += c;
            if (c == '\n') {                    // если байт является символом новой строки
              // если текущая строка пуста, вы получаете два символа новой строки в строке.
              // это конец HTTP-запроса клиента, поэтому отправьте ответ:
              if (currentLine.length() == 0) {
                // Заголовки HTTP всегда начинаются с кода ответа (например, HTTP / 1.1 200 OK)
                // и тип контента, чтобы клиент знал, что будет дальше, а затем пустая строка:
                client.println("HTTP/1.1 200 OK");
                client.println("Content-type:text/html");
                client.println("Connection: close");
                client.println();
               

               
                // Отображение веб-страницы HTML
                client.println("<!DOCTYPE html><html>");
                client.println("<meta charset=\"utf-8\">");
                client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
                client.println("<title>Ticker control</title>");
                // аголовок Веб-Страницы
                client.println("<body><h1>ESP32 Web Server</h1>");
                client.println("<form action=\"\" method=\"post\">");
                client.println("<input type=\"text\" name=\"text\" placeholder= \"Введите текст\" required >");
                client.println("<input type=\"text\" name=\"Size\"/>");
                client.println("<input type=\"submit\" value=\"применить\">");
                client.println("</form>");
                client.println("</body></html>");
               
                // Ответ HTTP заканчивается еще одной пустой строкой
                client.println();
                // Вырваться из цикла while
                break;
              } else { // если у вас есть новая строка, то очистите текущую строку
                currentLine = "";
              }
            } else if (c != '\r') {  // если у вас есть что-нибудь еще, кроме символа возврата каретки,
              currentLine += c;      // добавьте его в конец текущей строки
            }
          }
        }
        // Очистите переменную заголовка
        header = "";
        // Закрывать соединение
        client.stop();
        Serial.println("Client disconnected.");
        Serial.println("");
      }
    String tape = webServer.arg("text");
     
  8. @Aleksander_33,
    По какой причине не используете реализацию веб-сервера из СДК, а используете wifi-сервер?
    Нет доверия к чужому коду? Или свой код завсегда лучше?
     
  9. Aleksander_33

    Aleksander_33 Нерд

    Да я и с этим справиться не могу, перелопатил интернет пытаюсь набраться знаний хоть на старости лет.
    Но всё даётся очень тяжело вся инфа на английском которого я практически не знаю, а машинный перевод очень корявый
     
  10. Aleksander_33

    Aleksander_33 Нерд

    Не понял, поясните пожалуйста.
     
  11. Просто пытался выполнить метод available у веб-сервера ESP8266WebServer
    Код (Text):
    server.available();
    И получил ошибку, про это и сказал.

    Вы говорите что на esp8266 "всё понятно", на esp32 начинаете искать методы соответствующие esp8266, но для esp8266 у веб-сервера нет метода available и нет смысла его искать у веб-сервера esp32.

    available есть для esp8266
    у WiFiServer для получения подключенного клиента
    Код (Text):
    WiFiClient available(uint8_t* status = NULL);
    у WiFiClient для получения количества доступных байт для чтения
    Код (Text):
    virtual int available() override;
    у esp32 аналогично в WiFiServer и WiFiClient
     
  12. Aleksander_33

    Aleksander_33 Нерд

    Возвращаемся в начало в WiFiServer и WiFiClient нет метода server.arg
     
  13. Нет как в esp8266, так и в esp32, а для чего он должен быть?
     
  14. Aleksander_33

    Aleksander_33 Нерд

    А как получать именованные данные из веб формы.
     
  15. На esp8266 WiFiServer и ESP8266WebServer это две большие разницы, точно так-же WiFiServer и WebServer на esp32.
    Скажите как на esp8266 для которого "всё понятно" используя WiFiServer Вы получали данные из веб формы через метод arg
     
  16. Aleksander_33

    Aleksander_33 Нерд

    В esp8266 я подключаю 2 библиотеки <ESP8266WiFi.h> и <ESP8266WebServer.h> объявляю ESP8266WebServer server(80) и пользуюсь всем функционалом в том числе и server.available() и server.arg(). Хотя стоп, нет server.available() тоже не поддерживается для этого нужно объявлять
    WiFiServer server(80) вообщем я окончательно запутался в своих вопросах.
    А скажите пожалуйста <WebServer.h> поддерживает server.send(200, "text/html", page) или что то подобное
     
    Последнее редактирование: 2 апр 2020
  17. В отличии от Вас у меня не получается
    Код (C++):
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    ESP8266WebServer web_server(81);
    WiFiServer wifi_server(82);
    void setup() {
      web_server.arg("Name");
      wifi_server.available();
      wifi_server.arg("Name");
      web_server.available();
    }
    void loop() {
    }
     
    Код (Text):
    /tmp/arduino_modified_sketch_872284/sketch_apr02a.ino: In function 'void setup()':
    sketch_apr02a:8:15: error: 'class WiFiServer' has no member named 'arg'
      wifi_server.arg("Name");
      ^
    sketch_apr02a:9:14: error: 'using ESP8266WebServer = class esp8266webserver::ESP8266WebServerTemplate<WiFiServer>' has no member named 'available'
      web_server.available();
      ^
    Используем библиотеку ESP8266WiFi версии 1.0 из папки: /home/alex/Arduino/hardware/esp8266com/esp8266/libraries/ESP8266WiFi
    Используем библиотеку ESP8266WebServer версии 1.0 из папки: /home/alex/Arduino/hardware/esp8266com/esp8266/libraries/ESP8266WebServer
    exit status 1
    'class WiFiServer' has no member named 'arg'
    Нет метода arg у wifi-сервера и нет метода available у веб-сервера
    И наоборот есть arg у веб-сервера и есть available у wifi-сервера
    Версия SDK 2.6.3

    Покажите пожалуйста минимальный пример кода в котором для WiFiServer выполняете метод arg, для ESP8266WebServer метод available.

    Установив поддержку платы esp32 и в примерах для класса WebServer обнаружив вызов метода send Вы спрашиваете работает ли он, да работает.
    Кроме этого метода, есть ещё и send_P, который работает с прогмем-ом.
     
    Последнее редактирование: 2 апр 2020
  18. Aleksander_33

    Aleksander_33 Нерд

    Да я уже на писал, что запутался Ваша правда.
    Сижу думаю как правильно сформулировать вопрос,чтоб меня поняли.
    Если у веб-сервера нет available () то как определить,что появился Client и просит прислать страницу?
    Если у wifi-сервера нет server.arg() то как получить именованные данные с отправленной формы?
    Извините за профанизм.
     
  19. Я одного понять не могу, есть же примеры для веб-сервера, в которых обрабатываются запросы клиентов, почему отказываться от этого.
    Реализация веб-сервера получает запрос от клиента, разбирает его, если задан обработчик для url и метода, вызывает его, если обработчик не задан, отвечает клиенту 404-м кодом.
    Вам же, почему-то, этого не требуется, а нужно получить wifi-клиента через метод available, после этого судя по #27 не взирая на то какой http метод выполняется и какой url запрошен, на любой метод и любой url дать один и тот-же ответ клиенту, даже если запрос от клиента получен не полностью.
     
  20. Aleksander_33

    Aleksander_33 Нерд

    Я так и думал,что меня не поймут.
    Начну сначала. Есть ESP 8266 с прикрученным BME 280, ESP 8266 получает данные с датчика и отправляет через UDP соединение на ESP 32
    который представляет из себя прог рамную точку доступа, к нему также прикручены датчики и RTC DS3231 ESP 32 принимает обрабатывает данные
    и отправляет их на бегущую строку под управлением MD_Parola. эта часть проекта спешно работает, но нужно ещё принимать сообщения со смартфона и также отправлять на б.строку и вот тут заковычька, получается увидеть смартфон (Client) передать форму где необходимо заполнить
    2 поля с сообщением и скоростью анимации и кнопкой submit отправить методом POST обратно на сервер, в этом случае указывать обработчик не обязательно, ESP 32 должен принять эти данные и использовать по назначению и вот с этим хвостиком проблема которой я вас и мучаю.
    Как оказалось я даже сформулировать проблему не могу. на ESP8266, в пошлом я делал бегущую строку но без датчиков и использовал домашнюю WIFI сеть всё работало нормально
     
    Последнее редактирование: 2 апр 2020