Получение строкового ввода с веб-страницы NodeMCU и его печать на последовательном мониторе

Недавно я начал работать с NodeMCU. Я очень мало знаю об этом устройстве и о том, как работает веб-сайт. Я пытаюсь получить длинную строку с веб-сайта, размещенного на NodeMCU, сохранить ее в переменной, а затем распечатать на последовательном мониторе NodeMCU.

У меня есть следующая программа. Здесь я только создал текстовое поле для ввода. Но я не знаю, как поместить эти входные данные в переменную и использовать их позже для последовательной печати.

#include <ESP8266WiFi.h>

const char* ssid = "****";
const char* password = "*************";

WiFiServer server(80);

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

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    } 
    server.begin(); 
}

void loop() {
    WiFiClient client = server.available();
    if (!client) {
    return;
    }

    Serial.println("new client");
    while(!client.available()){
    delay(1);
    }

    String request = client.readStringUntil('\r');
    Serial.println(request);
    client.flush();

    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("");  

    client.println("<!DOCTYPE HTML>");
    client.println("<html>");

    client.println("<label for='name'>Serial Printer (Put Text here: ): </label>");
    client.println("<br><br>");
    client.println("<input type='text' id='name' name='name' required minlength='0' maxlength='800' size='100'>");
    client.println("</html>");

    delay(1);
    Serial.println("Client disonnected");
    Serial.println("");

}

, 👍0

Обсуждение

Сначала вам нужно узнать о HTML-формах. Вам нужно больше, чем просто входной тег., @Majenko

используйте ESP8266WebServer и посмотрите пример SimpleAuthentification, @Juraj


1 ответ


Лучший ответ:

1

Попробуйте это. Он использует библиотеку веб-сервера. Я думал, что это более чистый код. У меня также есть более удобный способ включить чистый HTML-код.

Исходную форму можно найти по адресу yourIPaddress/single

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid = "MTS61752";
const char* password = "6900979039";

ESP8266WebServer webserver(80);

//------------------------------------------------
static const char PROGMEM singleLine[] = R"rawliteral(  
<!DOCTYPE html>
<html>
<head>
<title>Single Line Input</title>
</head>
<body>
<form method="post" action="/save" >
<label for='name'>Serial Printer (Put Text here: ): </label>
<br><br>
<input type='text' id='name' name='name' required minlength='0' maxlength='800' size='100'>
<input type="submit" name="clk_action" value="accept">
</form>
</body>
</html>
)rawliteral";

//------------------------------------------------
static const char PROGMEM INDEX_HTML[] = R"rawliteral(  
<!DOCTYPE html>
<html>
<head>
<title>Clock Settings</title>
</head>
<body>
<form method="post" action="/save" >
Turn on time:<br><input name="onTime" type="text" size="16" value="" ><br><br>
Turn off time:<br><input name="offTime" type="text" size="16" value="" ><br><br> 
<input type="submit" name="clk_action" value="accept">
</form>
</body>
</html>
)rawliteral";

//------------------------------------------------
void handleRoot() {
  webserver.send(200, "text/html", INDEX_HTML);
}

//------------------------------------------------
void handleNotFound() {
  webserver.send(404, "text/plain", "Page not found ...");
}

//------------------------------------------------
void handleSave() {
  String str = "Settings Saved ...\r\n";

  Serial.print("number of arguments "); 
  Serial.println(webserver.args());                    // количество аргументов

  if (webserver.args() > 0 ) {
    for ( uint8_t i = 0; i < webserver.args(); i++ ) {
      str += webserver.argName(i) + " = " + webserver.arg(i) + "\r\n";

      Serial.println("Arg "+ String(i)+"="+ webserver.argName(i));     
      Serial.println("Arg "+ String(i)+"="+ webserver.arg(i));
    }
  }
  webserver.send(200, "text/plain", str.c_str());
}

//------------------------------------------------
void handleSingleLine() {
  webserver.send(200, "text/html", singleLine);
}

//------------------------------------------------
void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Ожидаем соединения
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());


  webserver.on("/", handleRoot);
  webserver.on("/save", handleSave);
  webserver.onNotFound(handleNotFound);
  webserver.on("/single", handleSingleLine);

  webserver.begin();
  Serial.println("Web server has started");
}

//------------------------------------------------
void loop() {
  webserver.handleClient();

}
,

[pedant]Теги нужно правильно закрывать.[/pedant], @Majenko

Вы можете быть более конкретным. Я не вижу ничего, чего не хватало бы закрывающих тегов., @Rudy

Входы и теги BR., @Majenko

<input .... /> и <br/>, @Majenko

<input> </input> https://stackoverflow.com/a/13232170/6544572 --- Это пустые элементы. Это означает, что они не предназначены для содержания текста или других элементов и поэтому не требуют (и фактически не могут иметь) закрывающего тега в HTML. ----- Я немного поискал и обнаружил, что XHTML использует </input>, но я нашел документацию, описывающую его использование в HTML. (обратите внимание, мои знания HTML ограничены) На </br> http://w3c.github.io/html-reference/br.html#br, @Rudy

Я всегда работаю в XHTML. HTML – это девяностые. Я придерживаюсь мнения, что XHTML — это разновидность XML, поэтому к нему следует относиться соответственно. Упрощает переключение с одного на другой: к обоим применяется один и тот же набор правил, поскольку они оба являются просто XML., @Majenko