Esp8266 - server.handleClient() не может вызвать назначенную функцию

esp8266 wifi nodemcu esp8266webserver

Я пытаюсь заставить одного 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;
    }
  }

}

, 👍1

Обсуждение

Запуск всего веб-сервера + клиента-это перебор для удаленного управления. Вместо этого используйте UDP-пакеты., @Majenko


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