WebServer получить данные из input (Arduino IDE)

nkYellOw
Offline
Зарегистрирован: 23.11.2015
Всем привет. Поднял вебсервер на Arduino IDE,Коннекчусь на страницу там нужно ввести логин,пароль и нажать Save. По нажатию Save ардуино получает значение полей логин пароль.
Событие Save обработать могу, но там ничего нет. Как вернуть в ардуино значения из инпутов? Нашел старый код где пишут:
String login = iserver.arg(0); //Но это не работает а как сделать по другому - не понимаю..
Выложил код, где я получаю строку после нажатия кнопки на сайте. Поднятие вай фай, и прочую мелочь - не выкладываю, в этом смысла нет.

#include <WiFi.h> //Использую эту библиотеку
//Хедер моей страницы. Остальная часть страницы в самом низу
String html_header = "<html>\
 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
 <head>\
   <title>Cannabee</title>\
   <style>\
     body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
   </style>\
 </head>";

//body страницы, заполняется в setup
String str = "";

//Обьект вебсервера
WiFiServer iserver(80);

void setup() {
  Serial.begin(115200);
 
//Заполняем тело сайта.
  str += html_header;
  str += "<body>\
              <form method=\"POST\" action=\"ok\">\
              <input name=\"ssid\"> WIFI Net</br>\
              <input name=\"pswd\"> Password</br></br>\
              <input type=SUBMIT value=\"Save\">\
              </form>\
              </body>\
              </html>";
 
//Запускаем сервер
  iserver.begin();
}

void loop() { WiFiClient iclient = iserver.available(); if (iclient) { String currentLine = ""; bool currentLineIsBlank = true; while (iclient.connected()) { if (iclient.available()) { char c = iclient.read(); Serial.write(c); if (c == '\n' && currentLineIsBlank) { if (currentLine.length() == 0) { iclient.println(); break; } else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } if (currentLine.endsWith("POST /ok")) { Serial.println(currentLine); // ВОТ ТУТ МНЕ НАДО ОБРАБОТАТЬ ЗНАЧЕНИЯ ИЗ ИНПУТА... // старый код с других форумов был такой: string login = iserver.arg(0); } } } delay(1); iclient.stop(); Serial.println("Client Disconnected."); }

}

 

nkYellOw
Offline
Зарегистрирован: 23.11.2015
Всем привет. Поднял вебсервер на Arduino IDE,Коннекчусь на страницу там нужно ввести логин,пароль и нажать Save. По нажатию Save ардуино получает значение полей логин пароль.
Событие Save обработать могу, но там ничего нет. Как вернуть в ардуино значения из инпутов? Нашел старый код где пишут:
String login = iserver.arg(0); //Но это не работает а как сделать по другому - не понимаю..
Выложил код, где я получаю строку после нажатия кнопки на сайте. Поднятие вай фай, и прочую мелочь - не выкладываю, в этом смысла нет.

#include <WiFi.h>

String html_header = "<html>\
 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
 <head>\
   <title>Cannabee</title>\
   <style>\
     body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
   </style>\
 </head>";

String str = "";

WiFiServer iserver(80);



void setup() {
  Serial.begin(115200);


  str += html_header;
  str += "<body>\
              <form method=\"POST\" action=\"ok\">\
              <input name=\"ssid\"> WIFI Net</br>\
              <input name=\"pswd\"> Password</br></br>\
              <input type=SUBMIT value=\"Save\">\
              </form>\
              </body>\
              </html>";

  iserver.begin();
}

void loop() {
  WiFiClient iclient = iserver.available();

  if (iclient) {

    String currentLine = "";
    bool currentLineIsBlank = true;
    while (iclient.connected()) {
      if (iclient.available()) {
        char c = iclient.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {

          if (currentLine.length() == 0) {
            iclient.println(str);
            iclient.println();
          
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }

        if (currentLine.endsWith("POST /ok")) {
          Serial.println(currentLine);

        }
      }
    }
    delay(1);
    iclient.stop();
    Serial.println("Client Disconnected.");
  }

}
inspiritus
Offline
Зарегистрирован: 17.12.2012

АВывсегдапишетевсебезпробеловипереносовстроки?

Ну теперь получше стало:)

nkYellOw
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

АВывсегдапишетевсебезпробеловипереносовстроки?

Ну теперь получше стало:)

Нет редактирования только что созданной темы - это эпик фейл. Хотя бы первые 5 минут... Тупизм какой то.

Вставляешь код, он никак тегами не определяется. Я туда еще кода начал добавлять а он строкой добавился. Сорри парни))) Не специально

inspiritus
Offline
Зарегистрирован: 17.12.2012

А где Вы header и str  засылаете в клиент?

nkYellOw
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

А где Вы header и str  засылаете в клиент?

if (currentLine.length() == 0) {

            iclient.println(str);

            iclient.println();

           

            break;

          } 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Данные, передаваемые методом POST, приходят в теле запроса, после двух переводов строки \r\n. Кодировка данных зависит от указанной в атрибутах тега FORM, по умолчанию кодировка, емнип, application/x-www-form-urlencoded. Обрабатывать соответственно, раз вы ручками читаете запрос клиента.

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

@nkYellOw, у вас в заголовке топика WebServer, а в коде WiFiServer, где правда !?

nkYellOw пишет:
Нашел старый код где пишут:String login = iserver.arg(0); //Но это не работает а как сделать по другому - не понимаю..

У класса WiFiServer пытаетесь выполнить метод класса ESP8266WebServer? Каша какая то.
Про "прочую мелочь" которую вы не выкладываете, версия ардуино-иде, версия сдк, если речь идет об есп8266, будем догадываться.
Для есп8266 в сдк есть примеры ESP8266WebServer, втом числе и для базовой аутентификации HttpBasicAuth.ino
К библиотекам что в сдк доверия нет?

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Алексей. пишет:

@nkYellOw, у вас в заголовке топика WebServer, а в коде WiFiServer, где правда !?

nkYellOw пишет:
Нашел старый код где пишут:String login = iserver.arg(0); //Но это не работает а как сделать по другому - не понимаю..

У класса WiFiServer пытаетесь выполнить метод класса ESP8266WebServer? Каша какая то.
Про "прочую мелочь" которую вы не выкладываете, версия ардуино-иде, версия сдк, если речь идет об есп8266, будем догадываться.
Для есп8266 в сдк есть примеры ESP8266WebServer, втом числе и для базовой аутентификации HttpBasicAuth.ino
К библиотекам что в сдк доверия нет?

да сорри, писал сначала под esp8266 WebServer потом переключился на Wemos ESP32 OLED и писал уже WiFiServer. Капец меня глючит))))

P.S. это с мелким дисплеем.

Arduino IDE 1.8.9

Прошиваю через ардуино

nkYellOw
Offline
Зарегистрирован: 23.11.2015

DIYMan пишет:

Данные, передаваемые методом POST, приходят в теле запроса, после двух переводов строки \r\n. Кодировка данных зависит от указанной в атрибутах тега FORM, по умолчанию кодировка, емнип, application/x-www-form-urlencoded. Обрабатывать соответственно, раз вы ручками читаете запрос клиента.

 

Вот это выходит после нажатия кнопки на форме.

В логин пишу Qqqq

в пароль Wwww

Ничего не выходит...

POST /okPOST /ok
 HTTP/1.1
Host: 192.168.4.1
Origin: http://192.168.4.1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/73.0.3683.68 Mobile/15E148 Safari/605.1
Referer: http://192.168.4.1/
Content-Length: 20
Accept-Language: ru

Client Disconnected.
GET /favicon.ico HTTP/1.1
Host: 192.168.4.1
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/73.0.3683.68 Mobile/15E148 Safari/605.1
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7

Client Disconnected.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

nkYellOw пишет:

DIYMan пишет:

Данные, передаваемые методом POST, приходят в теле запроса, после двух переводов строки \r\n. Кодировка данных зависит от указанной в атрибутах тега FORM, по умолчанию кодировка, емнип, application/x-www-form-urlencoded. Обрабатывать соответственно, раз вы ручками читаете запрос клиента.

 

Вот это выходит после нажатия кнопки на форме.

В логин пишу Qqqq

в пароль Wwww

Ничего не выходит...

POST /okPOST /ok
 HTTP/1.1
Host: 192.168.4.1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/73.0.3683.68 Mobile/15E148 Safari/605.1
Content-Length: 20
Accept-Language: ru

Ключевое - выделил жирным. Данные есть - просто вы их не вычитываете и игнорируете. Они идут, как я говорил - после двойного перевода строки.

nkYellOw
Offline
Зарегистрирован: 23.11.2015

DIYMan пишет:

nkYellOw пишет:

DIYMan пишет:

Данные, передаваемые методом POST, приходят в теле запроса, после двух переводов строки \r\n. Кодировка данных зависит от указанной в атрибутах тега FORM, по умолчанию кодировка, емнип, application/x-www-form-urlencoded. Обрабатывать соответственно, раз вы ручками читаете запрос клиента.

 

Вот это выходит после нажатия кнопки на форме.

В логин пишу Qqqq

в пароль Wwww

Ничего не выходит...

POST /okPOST /ok
 HTTP/1.1
Host: 192.168.4.1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/73.0.3683.68 Mobile/15E148 Safari/605.1
Content-Length: 20
Accept-Language: ru

Ключевое - выделил жирным. Данные есть - просто вы их не вычитываете и игнорируете. Они идут, как я говорил - после двойного перевода строки.

 

Спасибо огромное за направление. Теперь вижу! Буду разбираться как их читать)))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

nkYellOw пишет:

Спасибо огромное за направление. Теперь вижу! Буду разбираться как их читать)))

Для начала сделайте просто: пока клиент не отконнекчен - скидывайте всё от него в Serial, чтобы увидеть ПОЛНЫЙ запрос. Ну и, попутно - можно ознакомиться с обзорными статейками по протоколу HTTP ;)

nkYellOw
Offline
Зарегистрирован: 23.11.2015

DIYMan пишет:

nkYellOw пишет:

Спасибо огромное за направление. Теперь вижу! Буду разбираться как их читать)))

Для начала сделайте просто: пока клиент не отконнекчен - скидывайте всё от него в Serial, чтобы увидеть ПОЛНЫЙ запрос. Ну и, попутно - можно ознакомиться с обзорными статейками по протоколу HTTP ;)

Спасибо =)

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Для есп32 (сдк последний релиз кандидат 1.0.2-rc1) есть как раз WebServer и пример базовой аутентификации libraries/WebServer/examples/HttpBasicAuth/HttpBasicAuth.ino
Открыли бы секрет, почему же не доверяете библиотекам, есть печальный опыт? Или много свободного времени и есть желание самостоятельно сделать реализацию веб сервера?

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Алексей. пишет:

Для есп32 (сдк последний релиз кандидат 1.0.2-rc1) есть как раз WebServer и пример базовой аутентификации libraries/WebServer/examples/HttpBasicAuth/HttpBasicAuth.ino
Открыли бы секрет, почему же не доверяете библиотекам, есть печальный опыт? Или много свободного времени и есть желание самостоятельно сделать реализацию веб сервера?

Скорее от ограниченной информации в голове. Наткнулся. начал делать... Сейчас почитаю и про это! Спасибо

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Алексей. пишет:

Для есп32 (сдк последний релиз кандидат 1.0.2-rc1) есть как раз WebServer и пример базовой аутентификации libraries/WebServer/examples/HttpBasicAuth/HttpBasicAuth.ino
Открыли бы секрет, почему же не доверяете библиотекам, есть печальный опыт? Или много свободного времени и есть желание самостоятельно сделать реализацию веб сервера?

Получилось взять данные! использовал WebServer. Код сократился на 80 строк, примерно. Крутая вещь!!! Спасибо огромное!!!!

Sebastyan_pareiro
Offline
Зарегистрирован: 10.06.2019


Здравствуйте, у меня такая же проблема, хотя прошёл уже год). Я приобрёл Ethernet Shield и захотел сделать систему учёта ресурсов, накидал код обработку GET запросов, но застопорился на одном моменте.

Не получается считать числовое значение из тега <input> в HTML странице и записать его в переменную.В Arduino недавно полез, поэтому не судите строго. Заранее спасибо. Прилагаю код

#include <SPI.h>
#include <Ethernet2.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 0, 81);
int value;
int value1;
String p;
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
boolean receiving = false;

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
boolean sentHeader = false;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (receiving && c == ' ') receiving = false;
if (c == '?') receiving = true;
if (!sentHeader)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html\n");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
//===================form1====================================
client.println("<form action='' method='get'>");
p = String(value);
client.println("<input type='hidden' name='L' value="+p+" />");
value1 = p.toInt();
client.println("<input type='submit' value='Send1' />");
client.println("<input type='number' value=""");
client.println("<p>");
p = "";
client.println("</form>");
//===================form1====================================
client.println("</html>");
sentHeader = true;
}
if (receiving) {
if (c == 'L')
{
Serial.println("OK 1");
Serial.println(value1);
break;
}
else if (c == 'S')
{
Serial.println("OK 2");
break;
}
//код для доп.устройств
}

if (c == '\n' && currentLineIsBlank) {
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(5);
client.stop();
Serial.println("client disconnected");
}
}

 

 

Sebastyan_pareiro
Offline
Зарегистрирован: 10.06.2019



#include <SPI.h>
#include <Ethernet2.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 0, 81);
int value;
int value1;
String p;
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
boolean receiving = false;

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}


// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}


void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
boolean sentHeader = false;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (receiving && c == ' ') receiving = false;
if (c == '?') receiving = true;
if (!sentHeader)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html\n");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
//===================form1====================================
client.println("<form action='' method='get'>");
p = String(value);
client.println("<input type='hidden' name='L' value="+p+" />");
value1 = p.toInt();
client.println("<input type='submit' value='Send1' />");
client.println("<input type='number' value=""");
client.println("<p>");
p = "";
client.println("</form>");
//===================form1====================================
client.println("</html>");
sentHeader = true;
}
if (receiving) {
if (c == 'L')
{
Serial.println("OK 1");
Serial.println(value1);
break;
}
else if (c == 'S')
{
Serial.println("OK 2");
break;
}
//код для доп.устройств
}

if (c == '\n' && currentLineIsBlank) {
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(5);
client.stop();
Serial.println("client disconnected");
}
}
Здравствуйте, у меня такая же проблема, хотя прошёл уже год). Я приобрёл Ethernet Shield и захотел сделать систему учёта ресурсов, накидал код обработку GET запросов, но застопорился на одном моменте.
 
Не получается считать числовое значение из тега <input> в HTML странице и записать его в переменную.В Arduino недавно полез, поэтому не судите строго. Заранее спасибо. Прилагаю код