Официальный сайт компании Arduino по адресу arduino.cc
WebServer получить данные из input (Arduino IDE)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 04/04/2019 - 20:18
Всем привет. Поднял вебсервер на 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."); }
}
АВывсегдапишетевсебезпробеловипереносовстроки?
Ну теперь получше стало:)
АВывсегдапишетевсебезпробеловипереносовстроки?
Ну теперь получше стало:)
Нет редактирования только что созданной темы - это эпик фейл. Хотя бы первые 5 минут... Тупизм какой то.
Вставляешь код, он никак тегами не определяется. Я туда еще кода начал добавлять а он строкой добавился. Сорри парни))) Не специально
А где Вы header и str засылаете в клиент?
А где Вы header и str засылаете в клиент?
Данные, передаваемые методом POST, приходят в теле запроса, после двух переводов строки \r\n. Кодировка данных зависит от указанной в атрибутах тега FORM, по умолчанию кодировка, емнип, application/x-www-form-urlencoded. Обрабатывать соответственно, раз вы ручками читаете запрос клиента.
@nkYellOw, у вас в заголовке топика WebServer, а в коде WiFiServer, где правда !?
У класса WiFiServer пытаетесь выполнить метод класса ESP8266WebServer? Каша какая то.
Про "прочую мелочь" которую вы не выкладываете, версия ардуино-иде, версия сдк, если речь идет об есп8266, будем догадываться.
Для есп8266 в сдк есть примеры ESP8266WebServer, втом числе и для базовой аутентификации HttpBasicAuth.ino
К библиотекам что в сдк доверия нет?
@nkYellOw, у вас в заголовке топика WebServer, а в коде WiFiServer, где правда !?
У класса WiFiServer пытаетесь выполнить метод класса ESP8266WebServer? Каша какая то.
Про "прочую мелочь" которую вы не выкладываете, версия ардуино-иде, версия сдк, если речь идет об есп8266, будем догадываться.
Для есп8266 в сдк есть примеры ESP8266WebServer, втом числе и для базовой аутентификации HttpBasicAuth.ino
К библиотекам что в сдк доверия нет?
да сорри, писал сначала под esp8266 WebServer потом переключился на Wemos ESP32 OLED и писал уже WiFiServer. Капец меня глючит))))
P.S. это с мелким дисплеем.
Arduino IDE 1.8.9
Прошиваю через ардуино
Данные, передаваемые методом POST, приходят в теле запроса, после двух переводов строки \r\n. Кодировка данных зависит от указанной в атрибутах тега FORM, по умолчанию кодировка, емнип, application/x-www-form-urlencoded. Обрабатывать соответственно, раз вы ручками читаете запрос клиента.
Вот это выходит после нажатия кнопки на форме.
В логин пишу Qqqq
в пароль Wwww
Ничего не выходит...
Данные, передаваемые методом POST, приходят в теле запроса, после двух переводов строки \r\n. Кодировка данных зависит от указанной в атрибутах тега FORM, по умолчанию кодировка, емнип, application/x-www-form-urlencoded. Обрабатывать соответственно, раз вы ручками читаете запрос клиента.
Вот это выходит после нажатия кнопки на форме.
В логин пишу Qqqq
в пароль Wwww
Ничего не выходит...
Ключевое - выделил жирным. Данные есть - просто вы их не вычитываете и игнорируете. Они идут, как я говорил - после двойного перевода строки.
Данные, передаваемые методом POST, приходят в теле запроса, после двух переводов строки \r\n. Кодировка данных зависит от указанной в атрибутах тега FORM, по умолчанию кодировка, емнип, application/x-www-form-urlencoded. Обрабатывать соответственно, раз вы ручками читаете запрос клиента.
Вот это выходит после нажатия кнопки на форме.
В логин пишу Qqqq
в пароль Wwww
Ничего не выходит...
Ключевое - выделил жирным. Данные есть - просто вы их не вычитываете и игнорируете. Они идут, как я говорил - после двойного перевода строки.
Спасибо огромное за направление. Теперь вижу! Буду разбираться как их читать)))
Спасибо огромное за направление. Теперь вижу! Буду разбираться как их читать)))
Для начала сделайте просто: пока клиент не отконнекчен - скидывайте всё от него в Serial, чтобы увидеть ПОЛНЫЙ запрос. Ну и, попутно - можно ознакомиться с обзорными статейками по протоколу HTTP ;)
Спасибо огромное за направление. Теперь вижу! Буду разбираться как их читать)))
Для начала сделайте просто: пока клиент не отконнекчен - скидывайте всё от него в Serial, чтобы увидеть ПОЛНЫЙ запрос. Ну и, попутно - можно ознакомиться с обзорными статейками по протоколу HTTP ;)
Спасибо =)
Для есп32 (сдк последний релиз кандидат 1.0.2-rc1) есть как раз WebServer и пример базовой аутентификации libraries/WebServer/examples/HttpBasicAuth/HttpBasicAuth.ino
Открыли бы секрет, почему же не доверяете библиотекам, есть печальный опыт? Или много свободного времени и есть желание самостоятельно сделать реализацию веб сервера?
Для есп32 (сдк последний релиз кандидат 1.0.2-rc1) есть как раз WebServer и пример базовой аутентификации libraries/WebServer/examples/HttpBasicAuth/HttpBasicAuth.ino
Открыли бы секрет, почему же не доверяете библиотекам, есть печальный опыт? Или много свободного времени и есть желание самостоятельно сделать реализацию веб сервера?
Скорее от ограниченной информации в голове. Наткнулся. начал делать... Сейчас почитаю и про это! Спасибо
Для есп32 (сдк последний релиз кандидат 1.0.2-rc1) есть как раз WebServer и пример базовой аутентификации libraries/WebServer/examples/HttpBasicAuth/HttpBasicAuth.ino
Открыли бы секрет, почему же не доверяете библиотекам, есть печальный опыт? Или много свободного времени и есть желание самостоятельно сделать реализацию веб сервера?
Получилось взять данные! использовал WebServer. Код сократился на 80 строк, примерно. Крутая вещь!!! Спасибо огромное!!!!
Здравствуйте, у меня такая же проблема, хотя прошёл уже год). Я приобрёл 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");
}
}