Точка доступа 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".
Как данные (размер и скорость) просматриваются на последовательном мониторе? Что нужно изменить?
@Adam, 👍2
Обсуждение1 ответ
У вас есть два обработчика для "/":
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
- EspAsyncWebServer обрабатывает HTTPS в HTTP
- Использование ESPAsyncWebServer.h с ArduinoJson версии 6 для транзакций мастер-клиент
- HTTP_GET не уточняется в области применения
- Отправка переменной в IFTTT через ESP32 с помощью Асинхронного веб-сервера
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- Интернет-сервер Arduino IDE + ESP32 — как перенаправить на root после нажатия кнопки
- Автоматическая веб-страница ESP32 AP
Спасибо, что сделали минимальный пример! Так много людей не потрудятся это сделать, и это огромная помощь в отладке., @romkey