stm32 web服务器实现

2023-11-07

 

最在做stm32 web服务器的东西,忙了一段时间终于弄完了,把这几天关于stm32服务器的工作记录一下。

刚接到这个任务的时候,不知道怎么下手,网上资料似乎不是很多,于是在下载了一个官方demo测试了一下,看了一下代码,不是很懂,于是继续百度找资料,找到一个比较有用的网页,以下是链接: 最近在做stm32 web服务器的东西,忙了一段时间终于弄完了,把这几天关于stm32服务器的工作记录一下。刚接到这个任务的时候,不知道怎么下手,网上资料似乎不是很多,于是在下载了一个官方demo测试了一下,看了一下代码,不是很懂,于是继续百度找资料,找到一个比较有用的网页,以下是链接:http://wenku.baidu.com/link?url=SfAxsft0bXxvaoeDtSGCLlnB3yQNhofQfLwfO9l-aZmTsVy2haookGZI6VP4WGlnr26Fx_BxakWV3oMQbKl54FQyssKDy2fRxI5JnIXaPgK

其实,stm32 web服务器与pc网页的交互一般是以表单的方式,就两个接口,cgi和ssi。这两个东西我的理解是这样的,cgi 就是pc网页向stm32 web服务下发信息的接口,比如我们有这样的一个网页:


<form method='get' action='config.cgi'>

<p><label for='ip'>ip:</label><input type='text' name='ip' value="<!--#ip-->" maxlength="1" /></p>

<p><label for='port'>port:</label><input type='text' name='port' value="<!--#port-->" maxlength="6" />

</p><p><input type='submit' value='保存' /></p>

</form>


如果看不懂这个网页的话,就百度一下吧,把上面东西复制到Macromedia Dreamweaver 8软件上就能看到是什么页面,上面在form就是表单,在<form></form>里面的内容就是表单的内容,里面有两个输入框,和一个保存按钮,当我们点出保存的时候就会在web服务器里触发,config.cgi的接口,关于web服务器的内容,后面再说,然后会把这个表单里的内容下发到服务器里,比如会把上面ip和port输入框中的数据发到web服务器里,web服务器就能获得想要的数据。接下来说一下ssi,我们可以拿个网络抓包软件观察一下,pc网页的web服务器的通信过程,其实也就是pc发送一个请求,然后web服务器返回一组数据,这组数据就是整个网页的内容。ssi的工作就是在这组返回的数据中嵌入一个要发送加pc端的数据在里面,比如刚才那个表单网页数据,我们要显示一些数据到ip输入框中,怎么办呢?在没有ssi接口的时候可以看到,

<p><labelfor='ip'>ip:</label><input type='text' name='ip' value="<!--#ip-->" maxlength="1" /></p> ,

有ssi接口时候,我们就可以利用ssi接口改变返回的内容,比如:

<p><labelfor='ip'>ip:</label><input type='text' name='ip' value="<!--#ip-->192.168.1.1" maxlength="1" /></p>,

可以看到 "<!--#ip-->192.168.1.1" 这个地方是不相同的,这时返回ip输入框是带着数据的,这个数据将显示在ip输入框内。 

接下来分析一下代码,首先看一下stm32官方http web 包里的文件

fsdata.c,fsdata.h,是网页转换成的数组, 

fs.c, fs.h是操作fsdata.c里面数据的一些读写函数

httpd.c, httpd.h函数是真正实现web服务器的文件

httpd_cgi_ssi.c, httpd_cgi_ssi.h 就是刚才提到的cgi, ssi接口,

一般我们只需要改动httpd_cgi_ssi.c, fsdata.c(这个文件是makefsfile.exe生成的),

makefsfile里面又有一些什么文件呢

fs文件夹是所有的网页,fsdata.c 是用makefsfile.exe转换得到的

下面分析一下代码

1. void httpd_init(void)

{
  LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_init\n"));
#if LWIP_HTTPD_SSI
  httpd_ssi_init(); //ssi接口初始化
#endif
#if LWIP_HTTPD_CGI
  httpd_cgi_init(); //cgi接口初始化
#endif
  httpd_init_addr(IP_ADDR_ANY);  //http web 相关初始化
}

2.ssi接口 要注意的一点就是 有ssi接口的网页要以 shtml为后缀

char const* TAGS[]={  //这里定义了ssi标签,

    "ip",  //ip地址 对应网页里的<!--#ip-->
    "sp",  //服务器端口
};

u16_t DeviceSSI_Handler(int iIndex, char *pcInsert, int iInsertLen)
{
    int len = 0;
    char buff[16];


    memset(buff,0,sizeof(buff));
    switch(iIndex)
    {
        case 0: //这个index是在数组中的位置
            sprintf(buff,"%s",“192.168.1.1”);
            len = strlen(buff);

            memcpy(pcInsert,buff,len);// 这里是拷贝填充在ip标签里的内容

            break;
        case 1:

    。。。。。。

    break;

    }

    return len;

}

3.cgi接口

//cgi接口定义

tCGI CGI_TAB[]={
    {"/login.cgi", LOGIN_CGI_Handler},
    {"/saveNet.cgi", SAVE_NET_Handler} /*这里的cginame要和网页表单里的action相同<form method='get' action='config.cgi'>*/
};

const char * SAVE_NET_Handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[])
{
    uint32_t i=0;

    for (i=0; i<iNumParams/*参数数量*/; i++)
    {
        if(strcmp(pcParam[i]/*参数名字,与网页里控件的name相同name='ip'*/,"ip") == 0) //设备ip
        {

    printf("ip is : %s \r\n",pcValue[i]/*控件的值*/);
        }
        else if(strcmp(pcParam[i],"port") == 0)  
        {

    ...

}

     ......

}

cgi和ssi大概就这些内容要改的,

4.打开网页里是哪一个为首页呢?在httpd.c里有一个数据

//这里设置首页显示的html ,所以首页就是login
const default_filename g_psDefaultFilenames[] = {
  {"/login.shtml", true },
  {"/login.ssi", true },
  {"/login.shtm", true },
  {"/login.html", false },
  {"/login.htm", false }
};

5.我们发送ssi标签时会把标签一起发上去,这样在编辑控件里是会把标签一起显示的,比如value="<!--ip-->192.168.1.1",这不是我们想要的,怎么让它不发送标签呢,

把httpd.c里的定义  #define LWIP_HTTPD_SSI_INCLUDE_TAG           1  //改为0就不发送标签

6.还有一些比较常用的宏定义

#define LWIP_HTTPD_MAX_CGI_PARAMETERS 16    //cgi数量定义

#define LWIP_HTTPD_MAX_TAG_NAME_LEN 8       //定义tag标签长度定义

#define LWIP_HTTPD_MAX_TAG_INSERT_LEN 192   //定义返回tag内容长度
————————————————
版权声明:本文为CSDN博主「hujia414」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hujia414/article/details/53898471

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32 web服务器实现 的相关文章

  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 如何在与脚本相同的目录中找到 Perl 模块

    现在 Perl 的最新版本已经删除了 来自 INC 我对模块文件位置的最佳实践感到好奇 到目前为止 与我们网站上每个应用程序关联的 pm 文件与脚本位于同一目录中 我认为这会造成安全漏洞 我们没有 INC 中其余目录的写权限 我们可以将 p
  • 基于机架的 Web 服务器是否代表 FastCGI 协议?

    我读到 CGI FastCGI 是一种用于将外部应用程序连接到 Web 服务器的协议 因此 Web 服务器 如 Apache 或 NginX 通过套接字将环境信息和页面请求本身发送到 FastCGI 进程 并且 FastCGI 通过同一连接
  • 在 Perl 中,如何在命令行上发送 CGI 参数?

    通常我从网页获取数据 但我想从命令行发送它以方便调试 为了获取数据我做了类似的事情 my query new CGI my username query gt param the username 这似乎不起作用 script pl the
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 如何在 Perl CGI 脚本中生成长时间运行的进程?

    我现在正在编写一个 Perl CGI 脚本 但它正在成为资源消耗者 并且它不断被我的 Web 主机杀死 因为我不断达到进程内存限制 我想知道是否有一种方法可以将我的脚本拆分为多个脚本 然后让第一个脚本调用下一个脚本 然后退出 这样整个脚本就
  • HTTP基本认证,使用python

    我希望我的用户访问我的域上的受保护目录 htaccess 和 htpasswd 均已创建并驻留在受保护的库中 要求输入用户名 密码组合的 html 是
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • CGIHTTPRequestHandler 在 python 中运行 php 或 python 脚本

    我正在 Windows 上编写一个简单的 python Web 服务器 它可以工作 但现在我想运行动态脚本 php 或 py 而不仅仅是 html 页面 这是我的代码 from BaseHTTPServer import HTTPServe
  • Perl 抛出“参考键是实验性的”

    开发环境为OS X 10 10 3 Perl v This is perl 5 version 18 subversion 2 v5 18 2 built for darwin thread multi 2level with 2 regi
  • 当表单 POST 到我的脚本时,如何访问 URL 中传递的参数?

    我遇到了一个问题模组重写 http httpd apache org docs 2 2 mod mod rewrite html当向我们的网站提交表单时 perl 脚本 如果有人在具有如下 url 的页面上执行 GET 请求http www
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 为什么我需要显式输出 IIS 的 HTTP 标头而不是 Apache?

    我正在尝试设置 apache 而不是 IIS 因为IIS 不必要地崩溃 https stackoverflow com questions 188896 why does iis crash when i print to stderr i
  • 如何提高非持久 CGI 进程中的 Moose 性能?

    Moose http search cpan org dist Moose 是一个很棒的对象框架 问题在于 连同它的依赖项一起 它是very大的 我们的分析表明 在我们的平台上 仅加载 Moose 就会在非持久性 CGI 应用程序脚本上产生
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 树莓派上的 /dev/mem 访问被拒绝

    我正在使用我的 Raspberry Pi 并且正在编写一个 cgi python 脚本 该脚本创建一个网页来控制我的 gpio 输出引脚 当我尝试将 RPi GPIO 作为 GPIO 导入时 我的脚本崩溃了 这是我收到的错误 File co
  • 如何使用内容类型:多部分/相关

    我想向用户发送一个二进制文件 并在浏览器上显示一些 HTML 我正在使用 apache2 的 CGI BIN 脚本 我发现此示例位于第 4 页 http www ietf org rfc rfc2387 txt 该链接还显示有关多部分 相关
  • Python Web 编程的不同方法的优缺点

    我想使用 Python 编写一些服务器端脚本 但我对这样做的方法有点迷失了 它从 DIY CGI 方法开始 似乎以一些相当强大的框架结束 这些框架基本上可以自己完成所有工作 中间有很多东西 比如web py http webpy org P
  • 结束 perl 脚本而不等待系统调用返回

    我在 Linux Ubuntu 14 04 上运行一个简单的 apache Web 服务器 并使用 perl CGI 脚本处理一些请求 该脚本使用以下命令启动系统命令system函数 但我希望它立即返回 无论系统调用的结果如何 我一直在传递

随机推荐

  • 数据结构(C语言版 第2版)课后习题答案 严蔚敏 编著

    转自 https blog csdn net Bamboo shui article details 72433523 原文没第八章答案 数据结构 C语言版 第2版 课后习题答案 严蔚敏 等 编著 仅供参考 还是自己认真做了再看 第1章 绪
  • 油猴(Tampermonkey)安装教程

    油猴简介 Tampermonkey 油猴 是一款免费的浏览器扩展和最为流行的用户脚本管理器 它适用于 Chrome Microsoft Edge Safari Opera Next 和 Firefox 虽然有些受支持的浏览器拥有原生的用户脚
  • Informer讲解PPT介绍【超详细】--AAAI 2021最佳论文:比Transformer更有效的长时间序列预测

    文章目录 Abstract 一 informer重温讲解PPT简洁 超详细 1 1 title 1 2 Background 1 3 LSTF 问题的提出 1 4 Transformer in LSTF problem 1 5 问题阐述 1
  • 常见的内存数据库有哪些

    Redis 键值存储数据库 常用于缓存 消息代理和应用程序数据处理 Memcached 分布式内存对象缓存系统 用于缓存Web应用程序数据 VoltDB 高速内存数据库 用于实时数据处理和实时决策 Aerospike 高性能的键值存储和文档
  • 基于Ribbon自定义负载均衡策略

    微服务间通过FeignClient互相调用默认使用的是ribbon的轮询负载均衡策略 而实际场景中我们可能需要自定义一些规则或者约束来实现特定的负载均衡策略 背景 微服务开发 多租户 API接口隔离 这些在现在开发过程中会经常遇到的问题 服
  • 第2章 R语言编程基础(超详细)

    目录 2 1 数据管理 2 1 1 变量重命名 2 1 2 缺失 异常与重复值的清洗 2 1 3 数据转换 排序 抽样与概率统计 2 1 4 案例分析 工程管理 2 1 5 字符串处理 2 2 控制语句与函数编写 2 2 1 控制语句 分值
  • Python3 数据类型转换

    目录 Python3 数据类型转换 隐式类型转换 显式类型转换 Python3 数据类型转换 有时候 我们需要对数据内置的类型进行转换 数据类型的转换 一般情况下你只需要将数据类型作为函数名即可 Python 数据类型转换可以分为两种 隐式
  • js中int与string之间的转换

  • 关系型数据库和非关系型数据库

    数据库总结 关系型数据库和非关系型数据库 NOSQL 关系型数据库和非关系型数据库 NOSQL NoSQL 指的是非关系型的数据库 NoSQL有时也称作Not Only SQL的缩写 是对不同于传统的关系型数据库的数据库管理系统的统称 No
  • 护网HVV(蓝队)小白必知必会

    前言 在HVV期间 蓝队主要就是通过安全设备看告警信息 后续进行分析研判得出结论及处置建议 在此期间要注意以下内容 内网攻击告警需格外谨慎 可能是进行内网渗透 1 攻击IP是内网IP 攻击行为不定 主要包括 扫描探测行为 爆破行为 命令执行
  • 小金的2019年终总结

    文章目录 一 各平台年报 简书 中国移动 微信读书 支付宝 建设银行 二 值得说一说的事 我的舒适区 刷海贼王 致敬特斯拉惊叹达芬奇 小柠檬降世 当舅舅 换mac电脑 总结 一 各平台年报 简书 研究区块链 gt gt 投资简书 gt gt
  • 万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的

    关于作者 英文原版作者 杨靖锋 现任亚马逊科学家 本科毕业于北大 硕士毕业于佐治亚理工学院 师从 Stanford 杨笛一教授 杨昊桐 译 王骁 修订 感谢靳弘业对第一版稿件的建议 感谢陈三星 符尧的讨论和建议 英文原版 https jin
  • 10.Vue简单项目之crud+表单验证

    Vue简单项目之crud 表单验证 1 准备工作 配置action js 2 新增书籍前台页面编写 3 修改和删除 4 表单验证 1 准备工作 配置action js 启动前端项目 启动后端项目 在action js中添加下列接口 BOOK
  • tomcat如何进行优化?

    对于tomcat的调优 可以从两个方面来进行调整 内存和线程 1 首先启动tomcat 实际上就是启动了一个jvm 所以可以jvm调优的方式来进行调整 从而达到tomcat调优的目的 另外tomcat中设计了一些缓存区 比如aappRead
  • npm link用法总结

    npm link用法总结 npm link用来在本地项目和本地npm模块之间建立连接 可以在本地进行模块测试 具体用法 1 项目和模块在同一个目录下 可以使用相对路径 npm link module 2 项目和模块不在同一个目录下 cd到模
  • Android 01:AutoCompleteTextView-简单实现实现自动输入文本效果

    在Android中 可以使用控件AutoCompleteTextView实现自动输入的文本功能 当用户输入一个字符 能够根据其字符提示显示出与之相关的数据 举大家一个熟悉的例子 当我们在百度中输入关键字 android 在列表中会出现相关的
  • C++程序分多文件编写

    为了让一个项目的结构更加清晰 需要学习函数的分文件编写 一般是4个步骤 创建后缀名为 h的头文件 创建后缀名为 cpp的源文件 在头文件中写函数的声明 在源文件中写函数的定义 主函数所在的源文件 要包含必要的头文件和这句using name
  • 测试用例逻辑梳理

    拿到一个页面怎么测 先看页面的整体布局 包括的内容是什么 页面之间的交互逻辑 按照总 分 总的逻辑测试 总 即总体概括页面的整体布局 包含的内容是什么 分 即是分模块对页面进行描述 页面包括的配置项是什么 输入框 搜索框 下拉框 分页 是否
  • 添加TAP虚拟网卡

    方法一 1 如果需要不同的Mac地址 可以添加虚拟网卡TAP 2 先安装uml utilities sudo apt get install uml utilities 3 使用tunctl添加虚拟网卡 sudo tunctl b 4 激活
  • stm32 web服务器实现

    最在做stm32 web服务器的东西 忙了一段时间终于弄完了 把这几天关于stm32服务器的工作记录一下 刚接到这个任务的时候 不知道怎么下手 网上资料似乎不是很多 于是在下载了一个官方demo测试了一下 看了一下代码 不是很懂 于是继续百