本例程脱胎自官方例程
除翻译之外,还做了些许代码修改
/*
使用Wifi网页服务来控制开关灯
一个简单的网络服务,让你可以通过网页控制LED。
此例程将打印WiFi模块(一旦连接)的ip地址到串行监视器。
你可以在浏览器中访问该ip地址来打开和关闭LED。
访问的网页地址格式如下:
http://esp32的ip地址/H 开灯
http://esp32的ip地址/L 关灯
This example is written for a network using WPA encryption. 本例程为WPA加密所写
For WEP or WPA, change the Wifi.begin() call accordingly. 对于WEP或者WPA,可以对照着更改Wifi.begin()函数的调用
需要的电路:
* esp32附带的wifi模块
* 一个连接了led灯的引脚(出于方便,我以串口打印文字模拟开关灯)
*/
#include <WiFi.h>
const char* ssid = "名称";
const char* password = "密码";
WiFiServer server(80);
void setup()
{
Serial.begin(115200);
delay(10);
// 程序从连接一个wifi网络开始
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi 已连接.");
Serial.println("IP 地址: ");
Serial.println(WiFi.localIP());
server.begin();
}
int value = 0;
void loop(){
WiFiClient client = server.available(); // 监听新连接的客户端
if (client) { // 如果有客户端连接
Serial.println("New Client."); // 打印信息到串口
String currentLine = ""; // 创建一个字符串来保存来自客户端的传入数据
while (client.connected()) { // 当客户端连接时保持循环
if (client.available()) { // 如果有来自客户端的数据可以读取
char c = client.read(); // 读取一个字节
Serial.write(c); // 打印到串口
if (c == '\n') { // 如果是换行符
// 如果当前行为空,在一行中会有两个换行符。
// 这是客户端HTrP请求的结束标志,所以发送一个响应:
if (currentLine.length() == 0) {
// HTTP 头经常以一串响应代码开始,即(e.g. HTTP/1.1 200 OK)
// 然后是一个内容类型,这样客户就知道收到了什么,然后是一个空白行:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// 紧接着http响应的内容是:
client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 5 on.<br>");
client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 5 off.<br>");
// HTTP响应以另一个空行结束
client.println();
//跳出循环
break;
} else { //如果你收到了新行,则清空currentLine:
currentLine = "";
}
} else if (c != '\r') { // //如果收到除回车符以外的其他字符,
currentLine += c; // 将其加到currentLine的末尾
}
// 检查来自客户端的请求是否是"GET /H" 或者 "GET /L":
if (currentLine.endsWith("GET /H")) {
Serial.println("开灯...");
}
if (currentLine.endsWith("GET /L")) {
Serial.println("关灯...");
}
}
}
// 关闭连接
client.stop();
Serial.println("客户端断联");
}
}
结果:
流程讲解:
又翻了下这个例程,决定再补充一点,方便理解
当esp32连接上wifi后,会将它自己分配到的ip通过串口打印出来(局域网ip)
同局域网内的设备,即同一wifi下的设备都可以在浏览器中填入该ip进行访问
当esp32检测到有新的客户端连接进来时,我们创建了个字符类型变量c用来一个字符一个字符地接收客户端发来的信息。且,当有连接保持时,进入循环while (client.connected())
此外,我们还定义了一个字符串currentLine,用来存储客户端发来的一行信息
进入循环后,第一个 条件判断if (client.available())
,判断缓冲区是否收到信息,若没有则循环等待(直到接收到或者连接断开)。
若有,则c读取一个字符,进入第二级条件判断if (c == '\n')
,检测是否接收到的是换行符
如果是则进入第三级条件判断if (currentLine.length() == 0);
若currentLine长度为0,代表客户端发送信息完毕(客户端Http请求的结束标志为两个连续的换行符),我们就可以向客户端发送一个http网页了,并跳出循环(感觉这里官方例程思路写绕了,可以优化);
否则,仅代表客户端发了个新行,故清空currentLine currentLine = "";
,用来接收新行内容,currentLine += c;
接着就是两个二级条件判断,看是开灯或是关灯指令即可