ESP8266WebServer-重构类,std :: bind和handleRoot有问题

问题描述 投票:0回答:2

将我的ESP8266WebServer标准连接过程放到自己的类时遇到了麻烦。我无法通过bind :: std ...将对象服务器传递给我的handleRoot函数。我尝试了多种方法,但是现在没有任何成功。所以也许您可以帮助我。现在,代码已编译,我已经注释掉了相应的行。但是,为了对客户端请求执行某些操作,我需要有权访问handleRoot和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();
}
c++ c arduino iot esp8266
2个回答
0
投票

我通过以下方式进行操作,该原理也适用于异步网络服务器:

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

 }

可在一个非常复杂的应用程序中稳定运行数月。


0
投票

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

  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
}
© www.soinside.com 2019 - 2024. All rights reserved.