欢迎光临
我们一直在努力

rt-thread webnet软件包详解-打造轻量级WEB服务器

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 软件包采用了分层设计的思想:

  • 适配层: 最底层负责与 RT-Thread 的网络框架对接(SAL),由它调用底层的 TCP/IP 协议栈(通常是 LwIP)和网络接口驱动,完成 Socket 的基础操作(创建、监听、接收、发送、关闭)。
  • 网络操作层: 提供基于 Socket 的异步事件处理框架(如使用 RT-Thread 的多线程或多事件监听)。在此层可以选择性地支持 HTTPS(通过加载如 MbedTLS 库)。
  • 连接模型层: 这层核心定义了处理模式:
    • 请求处理器 (Request Handler): 用于接收客户端请求、解析 HTTP 请求头、确定请求类型(静态文件?CGI?WS?)、传递请求给对应处理器处理、生成并发送 HTTP 响应。
    • 静态文件服务 (Static File Service): 处理静态资源(如 .html, .js, .css, 图片)的请求,检索文件系统中的资源并返回。
    • CGI 处理器 (Common Gateway Interface): 处理动态请求。开发者注册 CGI 回调处理函数来处理特定路径的请求,实现设备交互逻辑(如修改设置、执行操作、上传数据)。通常返回动态生成的响应体(如 JSON, HTML)。
    • WebSocket 处理器 (WebSocket, WS): 提供双向通信能力,用于实时数据推送等场景。
  • HTTP 服务层: 实现了 HTTP 报文的解析与生成逻辑。它解析请求行、请求头、处理状态码、构建响应头、支持验证某些标记 (如 Content-Length) 等。
  • 用户应用层: 不属于 WebNet 内部结构,开发者在这层定义具体业务逻辑:
    • 配置 WebNet 的工作模式和参数(根目录、监听端口、线程数)。
    • 注册 CGI 处理函数入口到 WebNet。
    • 定义静态文件服务的存放路径。
    • 注册 WebSocket 的回调函数。
  • 3、 核心工作流程简述

    在这里插入图片描述

  • 监听: WebNet 创建一个监听 Socket(端口通常为 80 或用户指定)。
  • 接收连接: 当有客户端发起 HTTP 或 WebSocket 连接请求时,监听的 Socket 会接收到一个新连接请求。
  • 创建处理线程: WebNet 会创建一个或多个线程来处理这个 Socket 连接(取决于配置)。
  • 接收请求: 在线程中不断读取该客户端发送过来的字节流。
  • 协议解析: 将字节流解析成符合 RFC 标准的 HTTP 请求报文(方法、路径、协议版本、请求头)。
  • 路由分发: 检查请求的路径:
    • 如果路径匹配静态文件,则调用静态文件服务模块:在文件系统中定位文件 -> 读取文件(可能需要分块读取大文件以节省内存)-> 设置 Content-Type -> 准备好响应报文。
    • 如果路径是 CGI 格式(如前缀 /api/)且已注册匹配回调,则调用CGI模块:解析可能的请求参数 -> 执行回调处理函数 -> 获取动态生成的响应体 -> 设置 Content-Type -> 准备响应报文。
    • 如果请求是 WebSocket 升级请求(Upgrade: websocket),则调用WebSocket模块完成协议升级握手 -> 后续消息通过 WebSocket 接口处理。
  • 生成响应: 构建完整的 HTTP 响应报文(响应行、响应头、响应体)。
  • 发送响应: 将响应报文通过该连接的 Socket 发回给客户端。
  • 处理后续通信: 对于 HTTP Keep-Alive 连接,该线程会等待同一连接上的后续请求(需留意超时处理)。对于 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),如下所示:

    RTThread online packages
    IoT internet of things ->
    [*] WebNet: A HTTP Server for RTThread
    (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 Webbased 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] RTThread 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

    在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » rt-thread webnet软件包详解-打造轻量级WEB服务器
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址