把esp32当作一个Web服务器!
一、ESP32 到底有多强?
很多人只把 ESP32 看作一块带 Wi‑Fi 的单片机,用来驱动继电器、读取温湿度。
但它有一个非常强悍、却常被忽视的能力:
它可以自己架设一个完整的 Web 服务器。
就是那种你在浏览器输入一个 IP 地址,就能看到一个网页,还能在上面操作、看数据的服务器。
不需要云平台,不需要树莓派,ESP32 自己就把活儿全干了。
它凭什么能做到?
-
内置 Wi‑Fi 和 TCP/IP 协议栈
ESP32 芯片本身就支持 802.11 b/g/n,官方固件里移植了 lwIP 网络库,让它可以像电脑一样理解“IP 地址”“端口”“TCP 连接”。 -
轻量级 HTTP 服务库
ESP‑IDF 开发框架提供了一个叫httpd的组件,能自动处理 HTTP 请求的解析、路由分发。你只需要给他相应的路由。
所以,它本质上就是一台性能虽弱但功能完备的网络服务器,只不过它专为物联网而生,功耗只有几瓦,体积比硬币还小。
二、How to do that?
要让 ESP32 成为一个 Web 服务器,你需要让它监听对应的 HTTP 请求、根据 URL 路径分发处理、并返回 HTML 或 JSON 等内容。
整个流程可以概括为:
连网 → 启动服务器 → 注册路由 → 处理请求
下面以 ESP‑IDF 的 esp_http_server 库为例,梳理核心步骤和关键函数。
① 连接 Wi‑Fi
ESP32 必须先获取一个局域网 IP 地址,否则服务器无法被访问。
对应函数:esp_wifi_init()、esp_wifi_start()、esp_wifi_connect() 等,通常由 wifi_provisioning 或事件回调完成。
② 启动 HTTP 服务器
调用一次 httpd_start(),它会创建一个后台任务,默认监听 80 端口。
③ 注册 URI 路由
告诉服务器:
-
当访问
/时调哪个函数 -
访问
/api/status时调哪个函数……
每个路由都是一个 httpd_uri_t 结构体,包含 路径、方法(GET/POST)、处理函数,通过 httpd_register_uri_handler() 绑定。
④ 编写处理函数
每个处理函数接收一个 httpd_req_t* 句柄,从中可以读取请求信息,然后调用一系列函数构造并发送响应。
⑤ 关闭服务器(可选)
程序结束时可以调用 httpd_stop() 释放资源。
连接 Wi‑Fi 后,启动服务与注册路由
void start_http_server(void)
{
//开启http服务
httpd_handle_t server = NULL;
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_start(&server, &config);
//注册路由(这里注册的是网页根2路由,本质是Html字符串)
httpd_uri_t uri = { .uri = "/", .method = HTTP_GET, .handler = root_handler };
httpd_register_uri_handler(server, &uri);
}
这段代码绑定了 GET / 这个请求,由 root_handler 处理(返回网页)。
🔗 本质是“路由表”的建立
注册完成后,ESP32 的 HTTP 服务内部就生成了一张表:
客户端请求
GET /时,自动调用root_handler如果注册了其他的路由,路由表里面就会有对应的路由处理函数
路由处理函数
esp_err_t root_handler(httpd_req_t *req)
{
const char *html ="......"
httpd_resp_set_type(req, "text/html; charset=utf-8");
httpd_resp_send(req, html, strlen(html));
return ESP_OK;
}
关键函数解读:
-
httpd_resp_set_type(req, "text/html; charset=utf-8");
设置 HTTP 响应头里的Content-Type,浏览器看到这个才会按网页渲染,并且正确处理中文字符。 -
httpd_resp_send(req, html, strlen(html));
真正把字符串内容推送给客户端。它会自动在前面拼好状态行HTTP/1.1 200 OK、Content-Length等必要的头部,你只管给内容。
🌐 完整请求流程
连接 Wi‑Fi 且开启 HTTP 服务后:
你在浏览器地址栏输入
http://192.168.1.100(假设这是 ESP32 的 IP)。浏览器会向
192.168.1.100的 80 端口 发送一个 HTTP 请求,内容大致是:GET / HTTP/1.1 Host: 192.168.1.100
HTTP 服务器收到这个请求后,发现请求路径是
/,而且方法是 GET。查找路由表 → 找到
uri = "/",method = HTTP_GET,handler = root_handler。调用
root_handler。
root_handler直接把准备好的网页字符串发出。浏览器收到 HTML,开始渲染出深色面板、距离数字、按钮……
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)