ESP8266WebServer ошибка времени выполнения при попытке доступа к аргументам запроса POST или GET, отправленным на сервер - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь запрограммировать мой NodeMCU (ESP8266) в Arduino IDE.Мне нужно получить данные из формы HTML и сохранить их в EEPROM.Проблема возникает, когда я пытаюсь получить доступ к аргументам POST или GET.Первые 2 аргумента я могу получить просто отлично.Но когда я пытаюсь что-то преодолеть, мой ESP просто умирает без какой-либо отладочной информации.

Я пытался использовать разные методы запроса, изменить форму HTML, Content-Type, заголовки HTML.Ничего не сработало.

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

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

ESP8266WebServer server(80);
...

void setup(void)
{
...
    server.on("/", handleRoot);
    server.on("/ok", HTTP_POST, handleOk);
    server.begin();
    Serial.println("HTTP server started");
  }


void handleRoot() {
  String str = "";
  str += html_header;
  str += "<body>\
   <form method=\"POST\" action=\"ok\">\
     <input name=\"ssid\"> WIFI Net<br>\
     <input name=\"pswd\"> Password<br>\
     <input name=\"ip0\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"ip1\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"ip2\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"ip3\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" /> Static AP<br />\
     <input name=\"gate0\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"gate1\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"gate2\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"gate3\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" /> Gateway<br />\
     <input name=\"mask0\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"mask1\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"mask2\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" />\
     <input name=\"mask3\" type=\"number\" style=\"width:45px\" min=\"0\" max=\"255\" /> IP MASK<br /><br />\
     <input type=\"SUBMIT\" value=\"Save settings\" />\
   </form>\
 </body>\
</html>";
  server.send ( 200, "text/html", str );
}

void handleOk() {
  String ssid_ap;
  String pass_ap;

  String str = "";
  str += html_header;
  str += "<body>";

  EEPROM.begin(111);

  ssid_ap = server.arg("ssid");
  pass_ap = server.arg("pswd");

  Serial.println(ssid_ap);
  Serial.println(pass_ap);

  /* 
  Serial.println(server.arg("ip0"));
  Serial.println(server.arg("ip1"));
  Serial.println(server.arg("ip2"));
  Serial.println(server.arg("ip3")); <======== Anything below this arg
  Serial.println(server.arg("gate0")); <====== kills server
  Serial.println(server.arg("gate1"));
  Serial.println(server.arg("gate2"));
  Serial.println(server.arg("gate3"));
  Serial.println(server.arg("mask0"));
  Serial.println(server.arg("mask1"));
  Serial.println(server.arg("mask2"));
  Serial.println(server.arg("mask3"));
  */
  ...
}

Когда я вывожу что-то на консоль (в данном случае последовательный порт), я ожидаю увидеть что-то или ничего.Но это отключает весь сервер вместо этого.Я думаю, что-то не так с моей HTML-формой, поэтому сервер не может разобрать это правильно.Или с самой библиотекой (ESP8266WebServer).Потому что, когда я пытаюсь получить количество аргументов, которое использует запрос server.args(), сервер тоже выключается.

...