Esp8266 - server.handleClient() не может вызвать назначенную функцию
Я пытаюсь заставить одного esp посылать целые числа второму как часть простого пульта дистанционного управления, но через несколько дней я не могу заставить его работать. Передатчик, кажется, подключается и отправляет правильно, насколько я могу судить, а приемник посылает какой-то ответ, но функция, которую я подключил с помощью server.on (), никогда не вызывается.
Код в основном копируется и вставляется из учебника, единственное, что я изменил, - это удаление кода для отображения прочитанных данных на ЖК-дисплее и отображения на последовательный.
Это код получателя.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char *ssid = "controllerReceiver";
const char *password = "password";
ESP8266WebServer server(80);
void setup() {
Serial.begin(115200);
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
server.on("/data/", HTTP_GET, handleSentVar);
server.begin();
Serial.println("server online");
}
void loop() {
server.handleClient();
}
void handleSentVar() {
Serial.println("Handling");
if (server.hasArg("x_value")) { // this is the variable sent from the client
int readingInt = server.arg("x_value").toInt();
Serial.println(readingInt);
server.send(200, "text/html", "Data received");
}
}
А вот и передатчик
#include <ESP8266WiFi.h>
const char *ssid = "controllerReceiver";
const char *password = "password";
int outputValue = 999;
void setup() {
Serial.begin(115200);
delay(10);
// Explicitly set the ESP8266 to be a WiFi-client
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.println("connecting...");
delay(500);
}
}
void loop() {
char intToPrint[5];
itoa(outputValue, intToPrint, 10); //integer to string conversion for OLED library
// Use WiFiClient class to create TCP connections
WiFiClient client;
const char * host = "192.168.4.1";
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request. Something like /data/?sensor_reading=123
String url = "/data/";
url += "x_value=";
url += intToPrint;
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
}
@Eric Ardis, 👍1
Обсуждение1 ответ
Лучший ответ:
Замените "/data/" на "/data", а url += "x_value="
на url += "?x_value="
.
Параметры HTTP GET отделяются от пути символом "?". Функция on
выполняется для пути ("/data").
Если вы добавляете server.on("/data/"
, разве вам не нужна конечная косая черта в запросе? некоторые веб-хостинги закрепляют это за вас, но ESP этого не делает., @dandavis
@dandavis, нет.., @Juraj
Я просто проверил его с помощью on()
ing /test
и /test/
с разными функциями, и они действительно дискретны. Вот почему в моих старых скетчах есть повторяющиеся вещи вроде"server.on ("/read/", getReading); server.on ("/read", getReading);". Теперь я использую макрос, который подменяет как простой, так и разрезанный путь, чтобы сделать его проще, и был бы рад+удивлен, узнав, что это бесполезно. Может быть, асинхронный сервер-это другое дело..., @dandavis
- ESP8266 не подключается к Wi-Fi
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
- Обнаружение ESP8266 в сети
- NodeMCU продолжает отключаться
- Соединение сетей Wi-Fi на nodemcu: как настроить esp8266 в качестве расширителя Wi-Fi, простейший случай
- Ошибка запуска FirebaseDemo в NodeMCU
- Как связать MPU9250 и NodeMcu?
- Как изменить тайм-аут загрузки ArduinoOTA?
Запуск всего веб-сервера + клиента-это перебор для удаленного управления. Вместо этого используйте UDP-пакеты., @Majenko