ESP32 WiFi点灯web控制主体代码错误

主题代码

#include <WiFi.h>

const int led1Pin = 2;
boolean led1Flag = false;
String led1State = "OFF";
String receline = "";
String receAll = "";
const char* ssid = "开始上";
const char* password = "12345678";

WiFiServer server(80);
WiFiClient newClient;


void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println();
  Serial.println("现出原型吧:");

  WiFi.softAP(ssid,password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("你的原型是:");
  Serial.println(myIP);
  Serial.println();
  
  server.begin();

  pinMode(led1Pin,OUTPUT);
}


void loop() {
  newClient = server.available();
  if(newClient)
  {
    Serial.print("你的原型是个蛆啊:");
    Serial.println(newClient.remoteIP());

    while(newClient.connected())
    {
      if(newClient.available() > 0)
      {
        char c = newClient.read();
        Serial.print(c);
        receAll += c;
        if(c == '\n')
        {
          if(receline.length() == 0)
          {
            getCommand();
            pageDisplay();
            break;
          }
          else
          {
            receline = "";
          }
        }
        else if(c != '\r')
        {
          receline += c;
        }
      }
    }
    newClient.stop();
    Serial.println("现出蛆了啊");
  }
  ledControl();
  receAll = "";
}

void getCommand()
{
  if((receAll.indexof("GET/LED1_on")) >= 0)
    led1Flag = true;
  else if((receAll.indexof("GET/LED1_off")) >= 0)
    led1Flag = false;
  led1State = (led1Flag)?"ON":"OFF";
}

void ledControl()
{
  digitalWrite(led1Pin,led1Flag);
}

void pageDisplay()
{
  newClient.println("HTTP/1.1 200 OK");
  newClient.println("Content-type;text/html");
  newClient.println();
  newClient.print("<!DOCTYPE html>");
  newClient.print("<html>");
  newClient.print("<head>");
  newClient.print("<title>三界的上神体</title>");
  newClient.print("<meta charset = "utf-8">");
  newClient.print("<style>html{text-align:center;}</style>");
  newClient.print("</head>");
  newClient.print("<body><br>");
  newClient.print("<h2>三界的上神体</h2>");
  newClient.print("<p>GPIO2 - "+ led1State +"</p>");
  newClient.print("<P><a href = "/LED1_on"><button>打开</button></a></P>");
  newClient.print("<P><a href = "/LED1_off"><button>关闭</button></a></P>");
  newClient.print("</body></html>");
  newClient.println();
}

错误码

H:\8266xm\xxdd82663\xxdd82663.ino: In function 'void getCommand()':
H:\8266xm\xxdd82663\xxdd82663.ino:76:15: error: 'class String' has no member named 'indexof'
   if((receAll.indexof("GET/LED1_on")) >= 0)
               ^
H:\8266xm\xxdd82663\xxdd82663.ino:78:20: error: 'class String' has no member named 'indexof'
   else if((receAll.indexof("GET/LED1_off")) >= 0)
                    ^

一楼正解

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: ESP32学习笔记(3)WIFI实现demo代码中的 支持配置: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    • 基站模式(即 STA 模式或 Wi-Fi 客户端模式),此时 ESP32 连接到接入点 (AP)。此时相当于ESP在蹭网
    • AP 模式(即 Soft-AP 模式或接入点模式),此时基站连接到 ESP32。此时相当于ESP开热点
    • AP-STA 共存模式(ESP32 既是接入点,同时又作为基站连接到另外一个接入点)。此时相当于ESP连着隔壁wifi开热点给自家用
    • 上述模式的各种安全模式(WPA、WPA2 及 WEP 等)。可以理解成安全蹭网
    • 扫描接入点(包括主动扫描及被动扫描)。主动找别人家网蹭
    • 使用混杂模式监控 IEEE802.11 Wi-Fi 数据包。可以理解成ESP能看到你上了什么不可描述的网站
  • 以下回答来自chatgpt:

    问题解决方案:

    错误码显示 'WL_CONNECTED' was not declared in this scope,这意味着'WL_CONNECTED'未在当前作用域中声明。这是因为缺少WiFi库的定义。为了解决这个问题,我们需要添加对WiFi库的引用。

    将以下代码行添加到顶部的包含部分:

    #include <WiFi.h>
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这错误码提示的很清楚诶
说这个类里面没有这个函数成员

错误提示你的代码的第76行出现的问题,就是以下给你圈起来的位置:

img


同样的问题也出现在第78行。
错误的意思就是string类型的变量没有indexof属性。因此你要看下你的这个indexof方法是否写错了,拼写问题或者需要不需要导入库。

Arduino的String类中确实没有indexof方法,需要使用indexOf()方法,注意是大小写敏感

TechWhizKid参考GPT回答:

  • 错误在于indexof是不正确的方法名称,正确是indexOf。所以,把代码中的
receAll.indexof("GET/LED1_on")`和`receAll.indexof("GET/LED1_off")

改为

receAll.indexOf("GET/LED1_on")

receAll.indexOf("GET/LED1_off")

修改后的代码片段:

void getCommand()
{
  if((receAll.indexOf("GET/LED1_on")) >= 0)
    led1Flag = true;
  else if((receAll.indexOf("GET/LED1_off")) >= 0)
    led1Flag = false;
  led1State = (led1Flag)?"ON":"OFF";
}

函数pageDisplay()中,直接插入的HTML字符串也存在问题,双引号使用不正确。C++中,如果想在字符串中使用双引号,要用反斜杠(\)进行转义。修改后的代码如下:

void pageDisplay()
{
  newClient.println("HTTP/1.1 200 OK");
  newClient.println("Content-type;text/html");
  newClient.println();
  newClient.print("<!DOCTYPE html>");
  newClient.print("<html>");
  newClient.print("<head>");
  newClient.print("<title>三界的上神体</title>");
  newClient.print("<meta charset = \"utf-8\">");
  newClient.print("<style>html{text-align:center;}</style>");
  newClient.print("</head>");
  newClient.print("<body><br>");
  newClient.print("<h2>三界的上神体</h2>");
  newClient.print("<p>GPIO2 - "+ led1State +"</p>");
  newClient.print("<P><a href = \"/LED1_on\"><button>打开</button></a></P>");
  newClient.print("<P><a href = \"/LED1_off\"><button>关闭</button></a></P>");
  newClient.print("</body></html>");
  newClient.println();
}

在您的代码中,错误是由于使用了indexof而不是正确的方法名indexOf引起的。String类的方法名是区分大小写的,所以请将所有的indexof改为indexOf

以下是修改后的代码片段:

void getCommand()
{
  if((receAll.indexOf("GET/LED1_on")) >= 0)
    led1Flag = true;
  else if((receAll.indexOf("GET/LED1_off")) >= 0)
    led1Flag = false;
  led1State = (led1Flag)?"ON":"OFF";
}

请注意,你还可以将String对象转换为C风格字符串来使用strstr函数进行匹配,这样也可以实现相同的功能。例如:

void getCommand()
{
  if(strstr(receAll.c_str(), "GET/LED1_on") != NULL)
    led1Flag = true;
  else if(strstr(receAll.c_str(), "GET/LED1_off") != NULL)
    led1Flag = false;
  led1State = (led1Flag)?"ON":"OFF";
}

以下答案参考newbing,回答由博主波罗歌编写:
根据您提供的代码和错误信息,问题出现在getCommand()函数中的indexof()函数调用上。

indexof() 是一个非标准的函数名称,应该是 indexOf(),注意大小写。此函数用于检查字符串中是否包含另一个字符串,并返回它在原字符串中的位置。而错误信息中提到的String类没有indexof成员。

请在 getCommand() 函数中将 indexof 改为 indexOf,同时请确保包含了 "Arduino.h" 头文件,该头文件包含了String类的定义。修改后的函数如下:

void getCommand()
{
  if((receAll.indexOf("GET/LED1_on")) >= 0)
    led1Flag = true;
  else if((receAll.indexOf("GET/LED1_off")) >= 0)
    led1Flag = false;
  led1State = (led1Flag)?"ON":"OFF";
}

请确认您的代码中是否还有其他错误,并注意拼写和大小写的正确性。希望我的回答对您有所帮助!如果还有其他问题,请随时提问。
如果我的回答解决了您的问题,请采纳!