Точка доступа ESP32 и веб сервер HTTP, как отправить несколько параметров?

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

Файлы находятся ниже и здесь: https://github.com/adamelli/MinimalExamples/tree/main/22-1-25_query_parameters_submitButton

Структура файла

скетч (папка)

  • sketch.ino
  • данные (папка)
    • index.html
    • selection.html

sketch.ino

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#include <painlessMesh.h>

const char* ssid = "Wireless Controller";
const char* password = "12345678";

// User stub
void sendMessage() ; // Prototype so PlatformIO doesn't complain

Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );

void sendMessage() {
  taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
}

AsyncWebServer server(80);

void notFound(AsyncWebServerRequest *request) {
    request->send(404, "text/plain", "Not found");
}
IPAddress IP(192, 168, 1, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

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



  // Initialize SPIFFS
  if (!SPIFFS.begin(true))
  {
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }



  WiFi.softAP(ssid, password);
  delay(500);
  WiFi.softAPConfig(IP, gateway, subnet);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);









// Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send(SPIFFS, "/index.html", String(), false );
  });

  // Index.HTML NAVIGATION BUTTIONS ************************************************

  server.on("/index.html", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send(SPIFFS, "/index.html", String(), false);
  });

  server.on("/selection.html", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send(SPIFFS, "/selection.html", String(), false );
  });









  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request)
  {

    int paramsNr = request->params();
    Serial.println(paramsNr);

    for (int i = 0; i < paramsNr; i++)
    {
      AsyncWebParameter* p = request->getParam(i);
      Serial.print("Param name: ");
      Serial.println(p->name());
      
      Serial.print("Param value: ");
      Serial.println(p->value());
      
      Serial.println("------");
    }

    request->send(200, "text/plain", "message received");
  });






  server.begin();
}



void loop() {}

index.html

<!DOCTYPE html>
<html>
<body>

  <h1>Main Menu</h1>
  

<p><a href="/selection.html"><button class="button">Selection</button></a></p>

<p><a href="/notMinimal.html"><button class="button">Oblivion</button></a></p>


</body>
</html>

selection.html

<!DOCTYPE html>
<html>
<body> 
<!-- -->
<form action="/" method="get"> 



    <label for="size" style="font-size: 22px">Shape Size:</label>

    <select name="size" id="size" style="font-size: 22px;">
      <option value="1"> 1   </option>
      <option value="2"> 1/2 </option> 
        </select>


    <p><label for="speed" style="font-size: 22px">Speed:</label>
    
    <select name="speed" id="speed" style="font-size: 24px">
      <option value="1">          Slowest </option>
      <option value="2" selected> Regular </option>
    </select></p>




  <p><a href="/selection"><button class="submit" name="circle" value="3">Circle</button></a></p>
  
  <p><a href="/selection"><button class="submit" name="square" value="4">Square</button></a></p>



</form>

</body>
</html>

Файлы данных должны быть загружены через "Инструменты" → "Загрузка данных скетча ESP32".

Как данные (размер и скорость) просматриваются на последовательном мониторе? Что нужно изменить?

, 👍2

Обсуждение

Спасибо, что сделали минимальный пример! Так много людей не потрудятся это сделать, и это огромная помощь в отладке., @romkey


1 ответ


2

У вас есть два обработчика для "/":

  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send(SPIFFS, "/index.html", String(), false );
  });

и

server.on("/", HTTP_GET, [](AsyncWebServerRequest * request)
  {

    int paramsNr = request->params();
    Serial.println(paramsNr);

    for (int i = 0; i < paramsNr; i++)
    {
...

Только один из них будет вызван при загрузке страницы верхнего уровня. Вам нужно будет объединить их, чтобы они оба служили index.html и обрабатывать передаваемые ему параметры.

,

Спасибо, но я до сих пор не понимаю, как изменить тело запроса/сообщение. Я просто хочу, чтобы он вернулся в индекс главного меню без изменения содержимого этой главной страницы индекса. В скетче ino request->send(200, "text/plain", "message received") изменяется вся главная индексная страница. Тем не менее, когда я вынимаю эту часть запроса, программа не компилируется., @Adam

@Adam вы спросили, почему параметры не печатаются. Ну, потому что обработчик, в котором вы их печатаете, никогда не вызывается из-за двойного определения., @Sim Son

Да, но первое определение делает главное меню видимым. Вы упомянули об их объединении. Я попытался объединить их методом проб и ошибок, но ничего не вышло. Одна из двух страниц всегда либо становится "Не найдена", либо очищается, чтобы остаться с надписью "сообщение получено". Полагаю, я могу задать еще один вопрос, но он будет почти таким же., @Adam

Я думаю, что то, что @romkey говорит "объединить", означает, что вам нужно что-то о двух повторяющихся маршрутах. Не объединяйте их буквально. Один из простых способов решить эту проблему-переименовать маршрут, обрабатывающий параметры, в"server.on ("/submit", HTTP_GET, callback_func)", и изменить свой selection.html подача формы в `<form action="/submit" method="get">., @hcheung

Меняется selection.html подача формы в `<form action="/submit" method="get">делает selection.html страница "Не найдена" (и дескриптор параметров был изменен), @Adam

@hcheung прав. Вам нужно переосмыслить, как вы собираете свою веб - страницу и где вы обрабатываете параметры. Вы не можете иметь два обработчика для одного и того же пути ("/"). Однако вы можете изменить то, что вы возвращаете, в зависимости от наличия или значений параметров. Если вы измените путь на "/submit", то вам понадобится обработчик для "/submit"., @romkey

@romkey Я изменил дескриптор параметров на этот (как я уже упоминал), и это приводит к тому, что "Не найдено" на selection.html страница., @Adam

Вы также изменили маршрут обработки параметров на `server.on("/submit", HTTP_GET, [](AsyncWebServerRequest * request)"?, @hcheung

@hcheung Да, я это сделал. Тем не менее, это не работает для меня. Вы заставили его работать?, @Adam