RT-Thread 软件包-软件包分类-IoT-WebNet①

这篇具有很好参考价值的文章主要介绍了RT-Thread 软件包-软件包分类-IoT-WebNet①。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RT-Thread 软件包-软件包分类-IoT-WebNet①

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

WebNet

中文页 | English

1、介绍

WebNet 软件包是 RT-Thread 自主研发的,基于 HTTP 协议的 Web 服务器实现,它不仅提供设备与 HTTP Client 通讯的基本功能,而且支持多种模块功能扩展,且资源占用少、可裁剪性强,充分满足开发者对嵌入式设备服务器的功能需求。

WebNet 软件包功能特点如下:

  • 支持 HTTP 1.0/1.1
  • 支持 AUTH 基本认证功能
  • 支持 CGI 功能
  • 支持 ASP 变量替换功能
  • 支持 SSI 文件嵌入功能
  • 支持 INDEX 目录文件显示功能
  • 支持 ALIAS 别名访问功能
  • 支持文件上传功能
  • 支持预压缩功能
  • 支持缓存功能
  • 支持断点续传功能

更多软件包功能特点介绍请查看 详细介绍。

1.1 目录结构

名称 说明
docs 文档目录
inc 头文件目录
src 源文件目录
module 功能模块文件目录
samples 示例文件目录
LICENSE 许可证文件
README.md 软件包使用说明
SConscript RT-Thread 默认的构建脚本

1.2 许可证

WebNet 软件包遵循 GPL2+ 商业双许可。该软件包可以根据 GNU 标准使用通用公共许可证,详见 LICENSE 文件。如果用于商业应用,可以通过电子邮箱 <business@rt-thread.com > 与我们联系获取商业许可。

1.3 依赖

  • RT_Thread 3.0+
  • DFS 文件系统

2、 获取软件包

使用 WebNet软件包需要在 RT-Thread 的包管理中选中它,具体路径如下:

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)  --->

Server listen port:配置服务器监听端口号;

Maximum number of server connections:配置服务器最大连接数量;

Server root directory:配置服务器根目录路径;

Select supported modules:选择服务器支持的功能模块;

Enable webnet samples :配置添加服务器示例文件;

Version:配置软件包版本。

配置完成后让 RT-Thread 的包管理器自动更新,或者使用 pkgs --update 命令更新包到 BSP 中。

3、使用 WebNet 软件包

  • 软件包详细介绍,请参考 软件包介绍
  • 详细的示例介绍,请参考 示例文档
  • 如何从零开始使用,请参考 用户指南
  • 完整的 API 文档,请参考 API 手册
  • 软件包工作原理,请参考 工作原理
  • 更多详细介绍文档位于 /docs 文件夹下,使用软件包进行开发前请务必查看

4、注意事项

  • WebNet 软件包使用需要文件系统支持,需要确保运行设备上能使用文件系统。
  • WebNet 软件包默认未开启任何模块功能支持,使用的需要根据软件包介绍在 Env 中开启需要的功能。

示例程序

WebNet 软件包提供了一个综合的示例页面用于展示软件包的多项功能,包括:AUTH、CGI、ASP、SSI、INDEX、ALIAS、Upload 等功能。本章节主要介绍 WebNet 软件包中各个功能模块示例的使用方式。

示例文件

示例程序路径 说明
samples/wn_sample.c 综合示例代码
samples/wn_sample_upload.c 上传文件示例代码
samples/index.html 综合示例页面
samples/index.shtml SSI 功能示例页面
samples/version.asp ASP 功能示例页面

准备工作

软件包获取

  • 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 命令下载软件包

  • 编译下载

页面文件准备

WebNet 软件包示例中需要获取本地静态页面,需要文件系统的支持(FAT 文件系统,ROMFS 文件系统等,只需要支持 RT-Thread 的设备虚拟文件系统)。

静态页面需要上传到文件系统中服务器根目录下(示例中使用根目录为 /webnet)。设备挂载文件系统成功,需要依次执行下面操作:

  1. 使用 mkdir webnet 命令创建 WebNet 软件包根目录 /webnet,并使用 cd webnet 命令进入该目录;

  2. 使用 mkdir adminmkdir upload 命令创建 /webnet/admin/webnet/upload ,用于 AUTH 功能和 Upload 功能测试;

  3. 将 WebNet 软件包 /sample 目录下的:index.htmlindex.shtmlversion.asp 三个文件依次上传到设备 /webnet 目录(WebNet 根目录)中。(可以使用 TFTP 工具上传文件,具体操作方式参考 TFTP 使用说明)

创建目录和上传文件成功之后,就可以启动例程,测试 WebNet 软件功能。

启动例程

本例程参数和环境配置如下:

  • 监听端口号: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 文件,如下图所示,页面文件正常显示:

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

该页面上显示了 WebNet 软件包的基本功能介绍,并根据不同的功能给出相应的演示示例,下面将按顺序介绍如下几个例程:

  • AUTH 基本认证例程
  • CGI 事件处理例程
  • ASP 变量替换例程
  • SSI 文件嵌套例程
  • INDEX 目录显示例程
  • ALIAS 别名访问例程
  • Upload 文件上传例程

AUTH 基本认证例程

在例程主页( /index.html)AUTH Test 模块下点击 基本认证功能测试:用户名及密码为 admin:admin 按键,弹出基本认证对话框,输入用户名 admin,密码 admin。成功输入用户名和密码后,会进入根目录下 /admin 目录,如下图所示流程:

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

CGI 事件处理例程

本例程提供两个 CGI 示例:hello world 例程calc 例程 ,用于演示 CGI 事件处理的基本功能。

  • hello world 例程

hello world 例程演示了在页面演示文本内容功能,在例程主页 CGI Test 模块下点击 > hello world 按键,会跳转到新页面显示日志信息,新页面显示了 hello world 说明 CGI 事件处理成功,然后在新页面点击 Go back to root 按键回到例程主页面,如下图所示:

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

  • calc 例程

calc 例程中使用 CGI 功能在页面上展示了简单的加法计算器功能,在例程主页 CGI Test 模块下点击 > calc 按键,会跳转到新的页面,输入两个数字点击 计算 按键,页面会显示两数字相加的结果。在新页面点击 Go back to root 按键可以回到例程主页面,如下图所示:

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

ASP 变量替换例程

ASP 例程演示了页面变量替换的功能。在例程主页 ASP Test 模块下点击 ASP 功能测试:访问 version.asp 文件 按键,会跳转到根目录下 version.asp 页面,该页面显示当前使用 RT-Thread 系统的版本号。在新页面点击 Go back to root 按键回到例程主页面,如下图所示:

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

SSI 文件嵌套例程

SSI 例程演示在一个页面中嵌套另一个页面的功能。在例程主页 SSI Test 模块下点击 SSI 功能测试:访问 /version.shtml 页面 按键,会跳转到根目录下 index.shtml 页面,该页面中嵌套显示了主页面 index.html 内容。在新页面点击 Go back to root 按键回到例程主页面。

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

INDEX 目录显示例程

INDEX 例程演示页面文件列表功能。

首先需要任意上传一个文件到根目录的 /admin 目录中,例程中已上传了 admin.txt 文件到该目录中。

然后在例程主页 INDEX Test 模块下点击 INDEX 功能测试:访问/admin 目录 按键,会跳转到根目录下 /admin 目录,并且列出该目录下所有文件名和文件长度,如下图所示:

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

ALIAS 别名访问例程

ALIAS 例程演示了使用目录别名访问该目录的功能。该例程代码中已经将 /test 目录设置别名为 /admin, 在例程主页 ALIAS Test 模块下点击 ALIAS 功能测试:访问 /test 目录会跳转到 /admin 目录 按键,实际我们访问的是 /test 目录,但会跳转访问 /admin 目录,并列出该目录下所有文件信息,如下图所示:

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

Upload 文件上传例程

Upload 例程实现上传文件到 WebNet 服务器固定目录功能。在例程主页上 Upload File Test 模块下点击 选择文件 按键,选取需要上传的文件(本例程是用 upload.txt 文件),点击 上传,可以将文件上传到根目录下的 /upload 目录,如下图所示:

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

文件上传成功之后,返回例程主页,点击 浏览上传文件的目录 按键,可以访问 /upload 文件,查看刚才上传的文件信息。

rt-thread webnet,Linux,Python,ARM MCU,linux,stm32,java,arm开发,运维

示例代码

…\src\webnet.c文章来源地址https://www.toymoban.com/news/detail-796472.html

/*
 * File      : webnet.c
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
 *
 * This software is dual-licensed: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation. For the terms of this
 * license, see <http://www.gnu.org/licenses/>.
 *
 * You are free to use this software under the terms of the GNU General
 * Public License, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * Alternatively for commercial application, you can contact us
 * by email <business@rt-thread.com> for commercial license.
 *
 * Change Logs:
 * Date           Author       Notes
 * 2011-08-02     Bernard      the first version
 * 2012-07-03     Bernard      Add webnet port and webroot setting interface.
 */

#include <stdint.h>
#include <string.h>
#include <sys/errno.h>

#include <webnet.h>
#include <wn_module.h>

#ifdef SAL_USING_POSIX
#include <sys/select.h>
#else
#include <lwip/select.h>
#endif

#if defined(RT_USING_LWIP) && (RT_LWIP_TCPTHREAD_STACKSIZE < 1408)
#error The lwIP tcpip thread stack size(RT_LWIP_TCPTHREAD_STACKSIZE) must more than 1408
#endif

#define DBG_ENABLE
#define DBG_COLOR
#define DBG_SECTION_NAME    "wn"
#ifdef WEBNET_USING_LOG
#define DBG_LEVEL           DBG_LOG
#else
#define DBG_LEVEL           DBG_INFO
#endif /* WEBNET_USING_LOG */
#include <rtdbg.h>

static rt_uint16_t webnet_port = WEBNET_PORT;
static char webnet_root[64] = WEBNET_ROOT;
static rt_bool_t init_ok = RT_FALSE;

void webnet_set_port(int port)
{
    RT_ASSERT(init_ok == RT_FALSE);
    webnet_port = port;
}

int webnet_get_port(void)
{
    return webnet_port;
}

void webnet_set_root(const char* webroot_path)
{
    rt_strncpy(webnet_root, webroot_path, sizeof(webnet_root) - 1);
    webnet_root[sizeof(webnet_root) - 1] = '\0';
}

const char* webnet_get_root(void)
{
    return webnet_root;
}

/**
 * webnet thread entry
 */
static void webnet_thread(void *parameter)
{
    int listenfd = -1;
    fd_set readset, tempfds;
    fd_set writeset, tempwrtfds;
    int sock_fd, maxfdp1;
    struct sockaddr_in webnet_saddr;
    struct timeval rcv_to = {0, 50000};

    /* First acquire our socket for listening for connections */
    listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (listenfd < 0)
    {
        LOG_E("Create socket failed.");
        goto __exit;
    }

    rt_memset(&webnet_saddr, 0, sizeof(webnet_saddr));
    webnet_saddr.sin_family = AF_INET;
    webnet_saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    webnet_saddr.sin_port = htons(webnet_port); /* webnet server port */

    /* Set receive timeout for accept() */
    if(setsockopt(listenfd, SOL_SOCKET, SO_RCVTIMEO, (void*)&rcv_to, sizeof(rcv_to)) == -1)
    {
        LOG_E("Set SO_RCVTIMEO failed, errno=%d\n", errno);
        goto __exit;
    }

    if (bind(listenfd, (struct sockaddr *) &webnet_saddr, sizeof(webnet_saddr)) == -1)
    {
        LOG_E("Bind socket failed, errno=%d\n", errno);
        goto __exit;
    }

    /* Put socket into listening mode */
    if (listen(listenfd, WEBNET_CONN_MAX) == -1)
    {
        LOG_E("Socket listen(%d) failed.", WEBNET_CONN_MAX);
        goto __exit;
    }

    /* initialize module (no session at present) */
    webnet_module_handle_event(RT_NULL, WEBNET_EVENT_INIT);

    /* Wait forever for network input: This could be connections or data */
    for (;;)
    {
        /* Determine what sockets need to be in readset */
        FD_ZERO(&readset);
        FD_ZERO(&writeset);
        FD_SET(listenfd, &readset);

        /* set fds in each sessions */
        maxfdp1 = webnet_sessions_set_fds(&readset, &writeset);
        if (maxfdp1 < listenfd + 1)
        {
            maxfdp1 = listenfd + 1;
        }

        /* use temporary fd set in select */
        tempfds = readset;
        tempwrtfds = writeset;
        /* Wait for data or a new connection */
        sock_fd = select(maxfdp1, &tempfds, &tempwrtfds, 0, 0);
        if (sock_fd == 0)
        {
            continue;
        }

        /* At least one descriptor is ready */
        if (FD_ISSET(listenfd, &tempfds))
        {
            struct webnet_session* accept_session;
            /* We have a new connection request */
            accept_session = webnet_session_create(listenfd);
            if (accept_session == RT_NULL)
            {
                /* create session failed, just accept and then close */
                int sock;
                struct sockaddr cliaddr;
                socklen_t clilen;

                clilen = sizeof(struct sockaddr_in);
                sock = accept(listenfd, &cliaddr, &clilen);
                if (sock >= 0)
                {
                    closesocket(sock);
                }
            }
            else
            {
                /* add read fdset */
                FD_SET(accept_session->socket, &readset);
            }
        }

        webnet_sessions_handle_fds(&tempfds, &writeset);
    }

__exit:
    if (listenfd >= 0)
    {
        closesocket(listenfd);
    }
}

int webnet_init(void)
{
    rt_thread_t tid;

    if (init_ok == RT_TRUE)
    {
        LOG_I("RT-Thread webnet package is already initialized.");
        return 0;
    }

    tid = rt_thread_create(WEBNET_THREAD_NAME,
                           webnet_thread, RT_NULL,
                           WEBNET_THREAD_STACKSIZE, WEBNET_PRIORITY, 5);

    if (tid != RT_NULL)
    {
        rt_thread_startup(tid);
        init_ok = RT_TRUE;
        LOG_I("RT-Thread webnet package (V%s) initialize success.", WEBNET_VERSION);
    }
    else
    {
        LOG_E("RT-Thread webnet package (V%s) initialize failed.", WEBNET_VERSION);
        return -1;
    }

    return 0;
}


维护人:

  • 华为奋斗者精神, 邮箱:1992152446@qq.com

到了这里,关于RT-Thread 软件包-软件包分类-IoT-WebNet①的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RT-Thread 软件包-物联网-网络工具集NetUtils使用指南①

    本文介绍 RT-Thread NetUtils 的使用方法,帮助开发者更好地使用 RT-Thread NetUtils 组件来解决网络开发过程中遇到的问题。 简介 在进行网络相关的产品开发和调试时,一些好用的小工具往往能取到事半功倍的效果。 RT-Thread NetUtils 组件基于此应用场景,开发和封装了一系列简洁好

    2024年02月20日
    浏览(59)
  • RT-Thread 软件包-PikaScript用户手册-STM32模块API文档①

    RT-Thread软件包中的PikaScript用户手册针对STM32模块提供了API文档。STM32模块是一个为基于STM32微控制器的RT-Thread系统提供支持的功能模块,它提供了对STM32硬件资源的访问和控制。 在PikaScript用户手册中,针对STM32模块的API文档主要包括以下几个部分: GPIO控制:STM32模块提供了一

    2024年02月02日
    浏览(47)
  • RT-Thread 1. GD32移植RT-Thread Nano

    1. RT-Thread Nano 下载 RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实

    2024年02月05日
    浏览(48)
  • RT-Thread 9. VS2012下仿真RT-Thread 和LVGL

    1. 在ENV中添加组件 2. 下载组件 3. 生成代码 4. 打开代码 双击project.vcxproj 编译 5. 运行

    2024年02月06日
    浏览(60)
  • RT-Thread 7. RT-Thread Studio ENV修改MCU型号

    1. 修改MCU型号 2.在ENV界面输入 3. dist下为更新后完整源代码 4.导入RT-Thread Studio 发现GD32F330已经生效了。 5. 自己编写startup_gd32f3x0.S,准确性待验证

    2024年02月06日
    浏览(48)
  • 【STM32&RT-Thread零基础入门】 2. 新建RT-Thread项目

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具 RT-Thread的全称是Real Time Thread,顾名思义,它是一个嵌入式实时多线程操作系统。相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此之外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(

    2024年02月13日
    浏览(50)
  • 使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread项目

    STM32CubeMX下载 RT-Thread Studio下载 安装好RT-Thread Studio后,先打开RT-Thread SDK管理器确认有没有自己MCU需要的SDK包,直接安装好之后里面是有STM32F1系列的SDK包,其他的需要自己安装。 之后点击文件→新建→RT-Thread项目,根据自己需要配置好后点击完成就会生成RT-Thread项目。 新建项

    2024年02月11日
    浏览(52)
  • 【RT-Thread】使用RT-Thread Studio 配置BootLoader及App实现OTA功能

    由于项目需要实现OTA功能学习了一下具体实现方法,以备后期查看,有问题的地方随时指正修改 1.什么是OTA OTA是“over-the-air”的缩写,是一种无线技术,用于在不需要接触设备的情况下向移动设备或物联网设备提供更新、补丁或新版本的软件。OTA更新通常通过无线网络(如

    2024年02月09日
    浏览(40)
  • 【STM32&RT-Thread零基础入门】8. 基于 CubeMX 移植 RT-Thread Nano

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 利用RT_Thread操作系统实现三种不同的LED等闪烁 提示:以下是本篇文章正文内容,下面案例可供参考 cubemx配置参考教程: 基于 CubeMX 移植 RT-Thread Nano 后面程序所需的引脚 RT

    2024年02月09日
    浏览(48)
  • NUCLEO-F411RE RT-Thread 体验 (1) - GCC环境 RT-Thread 的移植

    a、用stm32cubemx新建一个工程。 时钟配置 st-link提供8M的mco输出,所以配置hse 8m,sysclk最高100M,设置如下: 配置LED 连接pa5,设置pa5为输出模式。 配置串口 st-link可以做虚拟串口用,这样可以省下一个usb转串口的模块。st-link连接f411的PA2 PA3,也就是uasrt2。 配置SWD 生成Makefile工程

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包