ESP8266WebServer - Класс рефакторинга, проблемы с std :: bind и handleRoot - PullRequest
0 голосов
/ 27 марта 2020

У меня возникли проблемы при переносе стандартной процедуры подключения ESP8266WebServer к своему классу. Я не могу передать объектный сервер своей функции Root дескриптора через bind :: std .... Я пробовал несколько подходов, но сейчас ничего не получается. Так что, возможно, вы могли бы помочь мне. Прямо сейчас, код компилируется, я закомментировал соответствующие строки. Но чтобы выполнить некоторые действия по запросу клиента, мне нужно иметь доступ к методам класса сервера в функциях handle Root и handleForm. Вот соответствующие эскизы. Спасибо за вашу помощь.

Эскиз Arduino:

#include "WiFiHandler.h"
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);
WiFiHandler myWiFiHandler;


void setup(){
  Serial.begin(115200);
  myWiFiHandler.setupWiFi(server); // Setup WiFi
}

void loop(){     
  myWiFiHandler.clientHandler(server); //Handle client requests
}

Заголовочный файл:

#ifndef WiFiHandler_h
#define WiFiHandler_h

#include <WiFiSetup.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "handleHTML.h"

class WiFiHandler
{
private:
  WiFiSetup myWiFiSetup; // Create object myWiFiSetup
  handleHTML myHTMLhandler; // Create object myHTMLHandler
  char* _ssid;
  char* _password;
  void handleRoot();
  void handleForm();
public:
  WiFiHandler();
  ~WiFiHandler();
  void setupWiFi(ESP8266WebServer&);
  void clientHandler(ESP8266WebServer&);
};

#endif

Исходный файл:

#include <WiFiSetup.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "handleHTML.h"
#include "Arduino.h"
#include "WiFiHandler.h"

WiFiHandler::WiFiHandler() 
  : _ssid(myWiFiSetup.ssid()), _password(myWiFiSetup.passcode())
{
}

WiFiHandler::~WiFiHandler(){/*Nothing to destruct*/}

void WiFiHandler::setupWiFi(ESP8266WebServer& server_)
{
  WiFi.begin(_ssid, _password);

    // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("Status: \n");
    Serial.println(WiFi.status());
  }

  //If connection successful show IP address in serial monitor
  Serial.print("Connected to ");
  Serial.println(_ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());  //IP address assigned to your ESP

  server_.on("/", std::bind(&WiFiHandler::handleRoot, this)); // Which routine to handle at root location
  server_.on("/", std::bind(&WiFiHandler::handleForm, this));  // Form action is handled here

  server_.begin(); //Start server
  Serial.println("HTTP server started");
}

void WiFiHandler::handleRoot()
{
  Serial.print("WiFi-Request received");
  // server_.send(200, "text/html", myHTMLhandler.getHTML());  //Send web page
}

void WiFiHandler::handleForm()
{
  // String buttonState = server.arg("State");
  Serial.print("State: ");
  // Serial.println(buttonState);

  String s = "<a href='/'> Go Back </a>";
  // server_.send(200, "text/html", s); //Send web page 
}

void WiFiHandler::clientHandler(ESP8266WebServer& server_)
{
  server_.handleClient();
}

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Изменение обратного вызова, наконец, сделало свою работу.

  server_.on("/", [&]() { handleRoot(server_); });
  server_.on("/action_page", [&]() { handleForm(server_); });

и соответствующая функция:

void WiFiHandler::handleRoot(ESP8266WebServer& server_)
{
  server_.send(200, "text/html", myHTMLhandler.getHTML());  //Send web page
}
0 голосов
/ 28 марта 2020

Я делаю это следующим образом, принцип работает, кстати, также с веб-сервером asyn c:

class MY_WebServer : public WebServer  { // inherit from the lib class
  public:
    MY_WebServer();
    void begin() {
       MDNS.addService("http", "tcp", 80);
       WebServer::begin();
    }
    void startWebServer(); // this function initializes wifi, all handlers and params

 private:
    void handleFileList();
 //.... some 30 handlers ...

 }

Работает в довольно сложном приложении, стабильном в течение нескольких месяцев.

...