WiFiEspAT

WiFiEspAT#

如需使用esp wifi作为网络模块,可以使用Arduino库管理器安装WiFiEspAT,该库可以适用于esp8266或esp32系列wifi模块, esp32c3 esp32s2等,需要对esp模组烧录对应版本的AT固件,详情查阅WiFiEspAT库说明: WiFiEspAT源码

该库通过 ESP8266 或 ESP32 AT 命令创建标准的 Arduino WiFi 网络 API。Arduino WiFi网络API由Arduino WiFi库建立,并由Arduino WiFi101和Arduino WiFiNINA库增强。 该库快速可靠。它可以在高波特率下与AT固件通信,而无需流量控制,仅受UART在所选速度下的可靠性的限制。 该库适用于所有Arduino MCU架构。

例程 - WebServer.ino#

WebServer测试

以下是一个基于Arduino的WiFi Web服务器程序,它使用WiFiEspAT库通过ESP8266或esp32模块连接到WiFi网络,并在本地主机上启动Web服务器,接收HTTP请求并返回相应的HTML页面。

在该程序中,我们首先声明了一个WiFiServer对象和WiFiClient对象,通过WiFiEspAT库初始化并连接到WiFi网络。然后,我们在setup()函数中等待与WiFi网络的连接,并启动Web服务器,将设备IP地址显示在串行端口上。在loop()函数中,我们使用server.available()函数来检测是否有客户端连接到Web服务器,并读取客户端发送的HTTP请求,并根据请求内容生成相应的HTML响应结果,最后将其作为HTTP响应返回给客户端。

需要注意的是,在使用WiFiEspAT库时,需要根据具体情况调整波特率、串口引脚和硬件连接;同时,在进行Web开发时,需要考虑安全问题并遵守相关规定,以避免出现潜在的漏洞和安全隐患。此外,在编写Web服务器程序时,还需要注意HTTP协议格式和数据解析方法,以确保程序正确性和稳定性。

测试以下代码需要设置 Enable Rt-Thread Console: 选项为Disable,并配置自己的串口通信引脚连接到esp模组。更改为自己的wifi ssid与password。

// 引入WiFiEspAT库
#include <WiFiEspAT.h>

// 定义串口1
HardwareSerial Serial1(1);
#define AT_BAUD_RATE 115200

// 定义WiFi网络名称和密码
const char ssid[] = "wifissid";    // your network SSID (name)
const char pass[] = "password";    // your network password (use for WPA, or use as key for WEP)

// 定义WiFi服务器
WiFiServer server(80);

void setup() {
    // 初始化串口
    Serial.begin(115200);
    while (!Serial);

    // 初始化WiFi模块
    Serial1.begin(AT_BAUD_RATE, SERIAL_8N1, 10, 11);
    WiFi.init(Serial1);

    // 检查WiFi模块是否正常
    if (WiFi.status() == WL_NO_MODULE) {
        Serial.println("Communication with WiFi module failed!");
        // don't continue
        while (true);
    }

    // 连接WiFi网络
    int status = WiFi.begin(ssid, pass);
    Serial.println();

    if (status != WL_CONNECTED) {
        Serial.println("Failed to connect to AP");
    } else {
        Serial.println("You're connected to the network");
    }

    // 等待连接到WiFi网络
    Serial.println("Waiting for connection to WiFi");
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print('.');
    }
    Serial.println();

    // 开启WiFi服务器
    server.begin();

    // 获取本地IP地址
    IPAddress ip = WiFi.localIP();
    Serial.println();
    Serial.println("Connected to WiFi network.");
    Serial.print("To access the server, enter \"http://");
    Serial.print(ip);
    Serial.println("/\" in web browser.");
}

// 循环处理客户端请求
void loop() {
    // 等待客户端连接
    WiFiClient client = server.available();
    if (client) {
        IPAddress ip = client.remoteIP();
        Serial.print("new client ");
        Serial.println(ip);

        // 处理客户端请求
        while (client.connected()) {
            if (client.available()) {
                String line = client.readStringUntil('\n');
                line.trim();
                Serial.println(line);

                // 如果已经到达HTTP头的末尾(空行),则开始回复
                if (line.length() == 0) {
                    // 发送标准HTTP响应头
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");  // 完成响应后关闭连接
                    client.println("Refresh: 5");  // 每5秒自动刷新页面
                    client.println();
                    client.println("<!DOCTYPE HTML>");
                    client.println("<html>");
                    // 输出模拟输入引脚的值
                    for (int analogChannel = 0; analogChannel < 4; analogChannel++) {
                        int sensorReading = analogRead(analogChannel);
                        client.print("analog input ");
                        client.print(analogChannel);
                        client.print(" is ");
                        client.print(sensorReading);
                        client.println("<br />");
                    }
                    client.println("</html>");
                    client.flush();
                    break;
                }
            }
        }

        // 关闭连接
        client.stop();
        Serial.println("client disconnected");
    }
}
// 循环处理客户端请求结束