12 httpsrv
作者:拓毅恒 | 最后修改:2026-04-08
一、httpsrv 概述
httpsrv 是 Air780EPM/Air780EHM 提供的轻量级 HTTP 服务器实现,用于创建 Web 服务并处理 HTTP 请求。
其 HTTP 服务器功能主要包括:
- 基础 HTTP 服务器:创建 HTTP 服务、监听端口、处理请求和响应。
- 路由处理:支持不同 URI 路径的请求处理和路由分发。
- 静态文件服务:提供 HTML、CSS、JavaScript 等静态资源访问。
- 设备控制接口:提供 API 接口实现对设备功能的远程控制。
HTTP 服务器功能是 Air780EPM/Air780EHM 的重要扩展功能,通过它可以实现基于 Web 的设备配置、监控和控制,大大简化了设备的使用门槛和远程管理流程。
二、准备硬件环境
参考:Air780EPM/Air780EHM 硬件环境清单,准备好硬件环境
2.1 Air780EPM 开发板

2.2 Air780EHM 核心板 + AirETH_1000 配件板

2.2.1 Air780EHM 核心板 +AirETH_1000 配件板的硬件接线方式

如上图所示,Air780EHM 核心板和 AirETH_1000 配件板的硬件接线方式为:
| Air780EHM核心板 | AirETH_1000配件板 |
| 3V3 | 3.3v |
| gnd | gnd |
| 86/SPI0CLK | SCK |
| 83/SPI0CS | CSS |
| 84/SPI0MISO | SDO |
| 85/SPI0MOSI | SDI |
| 107/GPIO21 | INT |
三、准备软件环境
3.1 文章内容应用
在开始实践本示例之前,先筹备一下软件环境:
1. 烧录工具:Luatools 工具;
2. 本demo开发测试时使用的固件为Air780EPM V2028 版本固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件Air780EPM固件,Air780EHM固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试。
3. 脚本文件:Air780EPM/demo/httpsrv / Air780EHM/demo/httpsrv
4. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。
软件环境准备就绪后,即可开始烧录。EHM 与 EGH 核心板的烧录步骤完全一致,请参考 Air780EPM 开发板烧录指南 或 Air780EGH 核心板烧录指南,将本文演示所需的项目文件烧录至 Air780EPM 开发板或 Air780EHM 核心板。
3.2 API 介绍
这里仅介绍本篇文档所使用的 API,详情请查看:httpsrv 核心库;wlan 核心库
httpsrv.start(port, callback, adapter)
启动 HTTP 服务器
wlan.scan()
扫描周围 WiFi 网络
wlan.scanResult()
获取 WiFi 扫描结果
四、httpsrv 功能实现概述
本小节详细介绍 Air780EPM 开发板/Air780EHM 核心板上 HTTP 服务器各种功能的实现方法和核心代码逻辑。
4.1 HTTP 服务器初始化和启动
HTTP 服务器初始化和启动功能用于创建和配置 HTTP 服务,设置请求处理函数。
4.1.1 功能定义
初始化 HTTP 服务器,配置监听端口和请求处理回调函数,选择网络适配器,然后启动服务开始监听 HTTP 请求。
4.1.2 代码示例
local function start_http_server()
-- 等待网络就绪事件
sys.waitUntil("CREATE_OK")
local local_ip = socket.localIP(socket.LWIP_ETH)
-- 启动HTTP服务器
httpsrv.start(80, handle_http_request, socket.LWIP_ETH)
log.info("HTTP", "文件服务器已启动,使用AirETH_1000-以太网模式")
log.info("HTTP", "访问地址: http://" .. (local_ip or "192.168.4.1"))
end
-- 启动HTTP服务器任务
sys.taskInit(start_http_server)
4.2 HTTP 请求处理
HTTP 请求处理功能用于接收和解析 HTTP 请求,并根据 URI 路径返回相应的响应。
4.2.1 功能定义
定义请求处理回调函数,根据不同的 URI 路径执行相应的处理逻辑,并返回状态码、响应头和响应体。
4.2.2 代码示例
local function handle_http_request(fd, method, uri, headers, body)
log.info("httpsrv", method, uri, body or "")
if uri == "/led/1" then
LEDA(1)
log.info("LED Control", "Turned ON")
return 200, {}, "ok"
elseif uri == "/led/0" then
LEDA(0)
log.info("LED Control", "Turned OFF")
return 200, {}, "ok"
elseif uri == "/send/text" then
log.info("Text Request", "Method:", method, "Body Length:", body and #body or 0)
if method == "POST" and body and #body > 0 then
-- 直接打印接收到的文本内容
log.info("Received Text:", body)
return 200, {}, "ok"
end
return 400, {}, "Invalid request"
elseif uri == "/scan/go" then
wlan.scan()
return 200, {}, "ok"
elseif uri == "/scan/list" then
return 200, {["Content-Type"]="application/json"}, (json.encode({data=scan_result, ok=true}))
elseif uri == "/connect" then
if method == "POST" and body and #body > 2 then
local jdata = json.decode(body)
if jdata and jdata.ssid then
sys.timerStart(wlan.connect, 500, jdata.ssid, jdata.passwd)
return 200, {}, "ok"
end
end
return 400, {}, "ok"
elseif uri == "/connok" then
log.info("connok", json.encode({ip=socket.localIP(2)}))
return 200, {["Content-Type"]="application/json"}, json.encode({ip=socket.localIP(2)})
end
return 404, {}, "Not Found" .. uri
end
4.3 文本发送功能
文本发送功能允许通过 Web 界面向设备发送文本数据,并在设备日志中显示。
4.3.1 功能定义
提供 POST 接口接收文本数据,将接收到的文本内容打印到设备日志中。
4.3.2 代码示例
-- 在请求处理函数中的文本发送逻辑
if uri == "/send/text" then
log.info("Text Request", "Method:", method, "Body Length:", body and #body or 0)
if method == "POST" and body and #body > 0 then
-- 直接打印接收到的文本内容
log.info("Received Text:", body)
return 200, {}, "ok"
end
return 400, {}, "Invalid request"
end
4.4 WiFi 扫描功能
WiFi 扫描功能用于搜索周围可用的 WiFi 网络,并以 JSON 格式返回扫描结果。
4.4.1 功能定义
提供扫描接口启动 WiFi 扫描,提供结果获取接口返回扫描到的 WiFi 网络列表,并监听扫描完成事件。
4.4.2 代码示例
-- 在请求处理函数中的WiFi扫描控制逻辑
if uri == "/scan/go" then
wlan.scan()
return 200, {}, "ok"
elif uri == "/scan/list" then
return 200, {["Content-Type"]="application/json"}, (json.encode({data=_G.scan_result, ok=true}))
end
-- WiFi扫描完成事件处理
local function scan_done_handle()
local result = wlan.scanResult()
_G.scan_result = {}
for k, v in pairs(result) do
log.info("scan", (v["ssid"] and #v["ssid"] > 0) and v["ssid"] or "[隐藏SSID]", v["rssi"], (v["bssid"]:toHex()))
if v["ssid"] and #v["ssid"] > 0 then
table.insert(_G.scan_result, {
ssid = v["ssid"],
rssi = v["rssi"]
})
end
end
log.info("scan", "aplist count:", #_G.scan_result)
end
-- 订阅WiFi扫描完成事件
sys.subscribe("WLAN_SCAN_DONE", scan_done_handle)
五、功能演示
5.1 HTTP 服务器启动
使用 Luatools 将代码烧录到 Air780EPM 开发板或 Air780EHM 核心板

烧录完毕后,日志中会打印 demo 名称和网络初始化的信息

5.2 Web 控制界面访问
首先需要在代码中打开 spi 以太网 网卡

随后烧录进开发板或核心板中,将电脑通过网线连接到同一局域网

然后在浏览器中输入 Air780EPM/Air780EHM 获取到的 IP 地址,进入 web 网页

5.3 文本发送功能演示
在 Web 界面的文本输入框中输入文本

通过串口调试工具,可以在日志中看到接收到的文本内容

5.5 WiFi 扫描功能演示
在 Web 界面中点击 "扫描 WiFi 网络" 按钮

扫描完毕后,会在网页上显示出扫描到的 WIFI 信息

通过串口调试工具,可以在日志中看到扫描到的每个 WiFi 网络的详细信息

六、总结
HTTP 服务器功能为 Air780EPM/Air780EHM 提供了强大的 Web 交互能力,使用户可以通过浏览器方便地配置、监控和控制设备,大大提升了设备的易用性和可管理性。开发者可以基于本文档的示例,进一步扩展和定制 HTTP 服务器功能,实现更复杂的 Web 应用场景。
七、常见问题
7.1 无法访问 Web 界面
问题:已连接到 WiFi 热点,但无法访问 web。
解决方案:
- 确认已正确连接 AirETH_1000 配件板
- 查看设备日志,确认 HTTP 服务器是否成功启动