乐鑫技术交流
直播中

李明

8年用户 1355经验值
私信 关注
[问答]

使用ESP8266WebServer提供页面时出现问题怎么处理?

我正在尝试实现 ESP8266WebServer 以使其成为服务器页面。只要所有内容都在我的核心脚本中,它就可以正常工作,但当它移入外部库时(对于我的项目,此功能属于该库),它就无法正常工作。当我这样做时,它只提供一个页面,之后 Firefox 说“Firefox 无法建立与服务器的连接”,仅此而已,直到我重置它。与此同时,它确实会响应 ping。
由于我的代码分布在多个类中,而且太大而无法在此处全部发布(而且我还没有设置 git),特此提供相关片段。设置未完成(它添加了用于 OTA 和连接到 WiFi 的代码,所有这些都很好用)。函数循环完成,这就是其中的全部内容。
ESP8266WebServer 的其他值得注意的行为是第一个请求需要大约 5 秒才能得到服务,而任何后续请求都会立即出现。将我的 PC 和 ESP8266 连接到同一个 WiFi 路由器(PC 有线连接)。
.ino 脚本:
代码:全选void setup() {
  master.begin();
}

void loop() {
  master.execute();
  ArduinoOTA.handle();
}


来自 master.cpp:
代码:全选void HydroMonitorMaster::begin() {

  Serial.print(F("Size (in bytes) of settings: "));
  Serial.println(String(sizeof(settings)));

  // Initialise the EEPROM storage.
  EEPROM.begin(EEPROM_SIZE);
  
  // Start by trying to read the existing settings from flash storage.
  readSettings();

  // Set up the http request handlers.
  server.on("/", std::bind(&HydroMonitorMaster::handleRoot, this));
  server.begin();

  yield();
  return;
}


void HydroMonitorMaster::execute() {
  
  // Check for incoming connections.
  server.handleClient();
}


来自 master.h:
代码:全选public:
    void execute(void);

private:
    void handleRoot();


现在,当我将以下内容添加到 master 时,它起作用了:
代码:全选void HydroMonitorMaster::handleRoot() {
  server.send(200, "text/html", "Request for ROOT received.");
}


但是当我想将 html 响应卸载到第二个类时,它失败了。该页面在我第一次请求时加载,但之后就不再加载了。
master.cpp 的替代代码:
代码:全选void HydroMonitorMaster::handleRoot() {
  network.htmlResponse(server, "test HTML network class response!");
}


这会调用 HydromonitorNetwork.cpp 中的一个函数:
代码:全选void HydroMonitorNetwork::htmlResponse(ESP8266WebServer server, String response) {
  server.send(200, "text/html", response);
  return;
}



               


                        

更多回帖

发帖
×
20
完善资料,
赚取积分