ESP8266WebServer - 重构 class,std::bind 和 handleRoot 的问题

ESP8266WebServer - Refactoring class, problems with std::bind and handleRoot

我在将我的 ESP8266WebServer 标准连接过程放到它自己的过程中时遇到了一些问题 class。我无法通过 bind::std 将对象服务器传递给我的 handleRoot 函数。我尝试了多种方法,但现在没有成功。所以也许你可以帮助我。现在,代码编译,我已经注释掉了相应的行。但是为了根据客户端请求执行某些操作,我需要访问函数 handleRoot 和 handleForm 中的服务器 class 方法。这是相应的草图。感谢您的帮助。

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();
}

我是按照下面的方式做的,顺便说一下,这个原理也适用于异步网络服务器:

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 ...

 }

在相当复杂的应用程序中工作数月稳定。

更改回调终于完成了工作。

  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
}