使用Arduino开发ESP32(二十二):SimpleWiFiServer例程

本例程脱胎自官方例程
除翻译之外,还做了些许代码修改

/*
 使用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;

接着就是两个二级条件判断,看是开灯或是关灯指令即可

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值