rt-thread webnet软件包详解-打造轻量级WEB服务器
- 一、rt-thread webnet软件包介绍
-
- 1、 WebNet 概述
- 2、WebNet 软件包架构
- 3、 核心工作流程简述
- 4、主要特性和使用方法接口 (API)
- 5、 配置选项 (ENABLE 宏)
- 6、总结
- 二、使用流程
-
- 1、软件包获取
- 2、页面文件准备
- 3、启动例程
- 4、例程获取

一、rt-thread webnet软件包介绍
1、 WebNet 概述
WebNet 是 RT-Thread 实时操作系统社区提供的一款专为嵌入式设备设计的、轻量级的 Web 服务器软件包。它主要用于实现设备端的 Web 服务功能,允许用户通过 Web 浏览器访问和管理嵌入式设备,如查看设备信息、配置设备参数、上传/下载文件等。
其主要特点包括:
- 轻量级: 资源占用少,能在资源受限的嵌入式系统上运行(如 RAM、ROM)。
- 适配性强: 与 RT-Thread 的网络框架(如 SAL 套接字抽象层、网络接口设备、LwIP 协议栈)紧密集成。
- 功能完善: 支持 HTTP/1.0 和部分 HTTP/1.1 特性(如 Keep-Alive)、静态文件服务、CGI(Common Gateway Interface)动态请求处理、WebSocket 支持等。
- 高度可配置: 通过宏定义可裁剪功能,去掉不用的功能来减少资源消耗。
- 集成便利: 作为 RT-Thread 的一个软件包,可以通过 RT-Thread 的包管理工具方便地添加、配置和裁剪。
2、WebNet 软件包架构
WebNet 软件包采用了分层设计的思想:
- 请求处理器 (Request Handler): 用于接收客户端请求、解析 HTTP 请求头、确定请求类型(静态文件?CGI?WS?)、传递请求给对应处理器处理、生成并发送 HTTP 响应。
- 静态文件服务 (Static File Service): 处理静态资源(如 .html, .js, .css, 图片)的请求,检索文件系统中的资源并返回。
- CGI 处理器 (Common Gateway Interface): 处理动态请求。开发者注册 CGI 回调处理函数来处理特定路径的请求,实现设备交互逻辑(如修改设置、执行操作、上传数据)。通常返回动态生成的响应体(如 JSON, HTML)。
- WebSocket 处理器 (WebSocket, WS): 提供双向通信能力,用于实时数据推送等场景。
- 配置 WebNet 的工作模式和参数(根目录、监听端口、线程数)。
- 注册 CGI 处理函数入口到 WebNet。
- 定义静态文件服务的存放路径。
- 注册 WebSocket 的回调函数。
3、 核心工作流程简述

- 如果路径匹配静态文件,则调用静态文件服务模块:在文件系统中定位文件 -> 读取文件(可能需要分块读取大文件以节省内存)-> 设置 Content-Type -> 准备好响应报文。
- 如果路径是 CGI 格式(如前缀 /api/)且已注册匹配回调,则调用CGI模块:解析可能的请求参数 -> 执行回调处理函数 -> 获取动态生成的响应体 -> 设置 Content-Type -> 准备响应报文。
- 如果请求是 WebSocket 升级请求(Upgrade: websocket),则调用WebSocket模块完成协议升级握手 -> 后续消息通过 WebSocket 接口处理。
4、主要特性和使用方法接口 (API)
- 启动服务: int webnet_init(void); 通常在应用初始化线程中调用启动 WebNet。webnet_set_config(port, root_dir, …); 用于配置参数(可在 webnet_init 前调用)。
- 静态文件服务: 默认基础功能。通过 SETTING_ROOT_DIR 宏设置文件服务起始根目录(如 /sdcard/www)。
- CGI 注册: void webnet_cgi_register(const char* cgi_prefix, int (*handler)(struct webnet_session* session)); 。开发者实现的 handler 函数接收一个 webnet_session 结构体指针,其中包含请求信息 (method, path, query_param 等) 和用于发送响应的函数 (session_printf, session_write),以及获取表单参数、上传文件的函数。
- 示例注册: webnet_cgi_register("/api/get-status", my_get_status_handler);。当请求路径为 /api/get-status 时会调用 my_get_status_handler。
- WebSocket 注册: void webnet_ws_register(const char* ws_path, void* (*on_ws_enter)(struct webnet_session* session), int (*on_ws_message)(struct webnet_session* session, int opcode, const char* payload, size_t length));。这涉及更底层直接操作分帧数据的接口(完整的实现还涉及协议升级处理)。
- on_ws_enter: 在连接 WebSocket 时触发(主要用于获取 session 上下文)。
- on_ws_message: 在接收到 WebSocket 消息帧时触发。
- 上传文件处理: webnet_session_upload_get_name(…) webnet_session_upload_open(…) webnet_session_upload_read(…) webnet_session_upload_close(…)。在实际应用中,常用的是 webnet_session_get_session(…)->request->form, webnet_session_form_xxx(…)(用于一般表单参数)和特设的文件处理 CGI 处理函数。
- 内部事件处理: 主要通过 webnet_session_send 及其变种发送响应到客户端。
- 辅助工具: 提供一些工具函数,如 URL 解码、Base64 编码/解码。
5、 配置选项 (ENABLE 宏)
WebNet 的可裁剪性非常高。通过在 rtconfig.h 或工程的预定义中选择性启用宏定义来开启/关闭功能:
- PKG_USING_WEBNET 开启整个 WebNet 软件包。
- WEBNET_USING_SERVO 启用静态文件服务。
- WEBNET_USING_ALIAS 支持别名。
- WEBNET_USING_TIME 支持添加日期响应头。
- WEBNET_USING_AUTH 支持 HTTP 基本认证 (Authorization)。
- WEBNET_USING_CGI 支持 CGI。
- WEBNET_USING_WS 支持 WebSocket (需要 RT-Thread 的 SAL)。
- WEBNET_USING_SSL 支持 HTTPS (需要依赖如 mbedtls 软件包)。
- WEBNET_USING_LOG 开启调试日志。
- WEBNET_USING_DUMP_REQUEST 和 WEBNET_USING_DUMP_RESPONSE 用于调试转储报文数据。
- WEBNET_PATH_MAX / WEBNET_BUFSZ / WEBNET_CONN_MAX 用于配置路径长度、缓冲区大小、最大连接数。
6、总结
RT-Thread 的 WebNet 软件包是一个功能强大且灵活、定制程度高的轻量级嵌入式 Web 服务器解决方案。它紧密集成到 RT-Thread 的生态系统中,利用 RT-Thread 的网络工具链 (SAL) 和协议栈 (LwIP) 提供 Web 服务能力。开发者能够方便地启动 HTTP 服务,为嵌入式设备提供 Web 访问接口扩展设备网络交互能力(如接入远程显示控制界面、前端数据可视化、功能配置等)。
二、使用流程
1、软件包获取
menuconfig 配置获取软件包和示例代码 打开 RT-Thread 提供的 Env 工具,使用 menuconfig 配置软件包。启用 WebNet 软件包,并配置使能测试例程配置(Enable webnet samples),如下所示:
RT–Thread online packages
IoT – internet of things —->
[*] WebNet: A HTTP Server for RT–Thread
(80) Server listen port ## 服务器监听套接字端口号
(16) Maximum number of server connections ## 服务器最大支持的连接数
(/webnet) Server root directory ## 服务器根目录
Select supported modules —-> ## 默认开启使用的功能模块
[ ] LOG: Enanle output log support
–*– AUTH: Enanle basic HTTP authentication support
–*– CGI: Enanle Common Gateway Interface support
–*– ASP: Enanle Active Server Pages support
–*– SSI: Enanle Server Side Includes support
–*– INDEX: Enanle list all the file in the directory support
–*– ALIAS: Enanle alias support
[ ] DAV: Enanle Web–based Distributed Authoring and Versioning support
–*– UPLOAD: Enanle upload file support
[ ] GZIP: Enable compressed file support by GZIP
(0) CACHE: Configure cache level
[*] Enable webnet samples ## 开启测试例程
Version (latest) —->
使用 pkgs –update 命令下载软件包 编译下载
2、页面文件准备
WebNet 软件包示例中需要获取本地静态页面,需要文件系统的支持(FAT 文件系统,ROMFS 文件系统等,只需要支持 RT-Thread 的设备虚拟文件系统)。 静态页面需要上传到文件系统中服务器根目录下(示例中使用根目录为 /webnet)。设备挂载文件系统成功,需要依次执行下面操作:
- 使用 mkdir webnet 命令创建 WebNet 软件包根目录 /webnet,并使用 cd webnet 命令进入该目录;
- 使用 mkdir admin 和 mkdir upload 命令创建 /webnet/admin 和 /webnet/upload ,用于 AUTH 功能和 Upload 功能测试;
- 将 WebNet 软件包 /sample 目录下的:index.html、index.shtml、version.asp 三个文件依次上传到设备 /webnet 目录(WebNet 根目录)中。(可以使用 TFTP 工具上传文件,具体操作方式参考 TFTP 使用说明)
创建目录和上传文件成功之后,就可以启动例程,测试 WebNet 软件功能。
3、启动例程
本例程参数和环境配置如下:
- 监听端口号:80
- 根目录地址:/webnet
- 文件系统:FAT 文件系统 设备启动,连接网络成功之后,在 Shell 命令行输入 webnet_test 命令启动 WebNet 服务器。查看 Shell 命令行,显示如下日志信息,说明 WebNet 服务器初始化成功:
msh />webnet_test
[I/wn] RT–Thread webnet package (V2.0.0) initialize success.
然后在 Shell 命令行中使用 ifconfig 命令获取本设备 IP地址为 192.168.12.29。
msh />ifconfig
network interface: w0 (Default)
MTU: 1500
MAC: 44 32 c4 75 e0 59
FLAGS: UP LINK_UP ETHARP BROADCAST IGMP
ip address: 192.168.12.29
gw address: 192.168.10.1
net mask : 255.255.0.0
dns server #0: 192.168.10.1
dns server #1: 223.5.5.5
接着在浏览器(这里使用谷歌浏览器)中输入设备 IP 地址,将默认访问设备根目录下 /index.html 文件,如下图所示,页面文件正常显示: 
4、例程获取
https://gitee.com/RT-Thread-Mirror/webnet/tree/master/samples




