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

2.2 Air780EGH 核心板 +AirETH_1000 配件板的硬件接线

如上图所示,Air780EGH 核心板和 AirETH_1000 配件板的硬件接线方式为:
| Air780EGH核心板 | 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开发测试时使用的固件为Air780EGH V2032 版本固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
3. 脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air780EGH/demo/httpsrv
4. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。
准备好软件环境之后,接下来查看如何烧录项目文件到 780EGH 中,将本篇文章中演示使用的项目文件烧录到 Air780EGH 核心板中。
3.2 API 介绍
这里仅介绍本篇文档所使用的 API,详情请查看:httpsrv 核心库;wlan 核心库
httpsrv.start(port, callback, adapter)
启动 HTTP 服务器
wlan.scan()
扫描周围 WiFi 网络
wlan.scanResult()
获取 WiFi 扫描结果
四、httpsrv 功能实现概述
本小节详细介绍 Air780EGH 核心板上 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 将代码烧录到 Air780EGH 核心板

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

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

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

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

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

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

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

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

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

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