STM32网络通信Web Server中SSI和CGI的应用

介绍

最近由于项目功能需要,开始研究STM32 WebServer通信以及SSI和CGI应用方法。项目结束后,主要总结浏览器与STM32之间进行通行,STM32作为服务器而浏览器做为客户端进行通行。

文件介绍

此部分的代码是根据ST官方的Web Server例程的基础上完成修改和实现,在webserver文件夹下:
在这里插入图片描述

文件说明
makefsdata文件夹中包含有原始网页文件和将原始的网页文件转化成网页数据的工具makefsdata.exe
fs.c这两个文件用来管理生成的网页数组
fs.h
fsdata.c生成的网页数组
fsdata.h
httpd.cHttp Server的源代码,本实验的核心文件,这两个文件完成了将开发板配置成Web Serve的工作
httpd.h
httpd_cgi_ssi.cCGI和SSI源文件,我们通过网页和开发板交互主要是这个文件中的函数完成的

网页源码

在makefsdata文件下的fs文件为网页源文件,如图所示,其中index.shtml文件时主页面,其他页面都是辅助和跳转页面。
在这里插入图片描述
在这里插入图片描述

CGI技术简介

公共网关接口 CGI(Common Gateway Interface) 是 WWW 技术中最重要的技术之一,有着不可替代的重要地位。CGI 是外部应用程序与 Web 服务器之间的接口标准,是在 CGI 程序和Web 服务器之间传递信息的规程。CGI 规范允许 Web 服务器执行外部程序,并将它们的输出发送给 Web 浏览器,CGI 在物理上是一段程序,运行在服务器上,提供同客户端 HTML 页面的接口。

绝大多数的 CGI 程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器,CGI 程序使网页具有交互功能。在我们本章实验中我们通过浏览器控制开发板上的 LED 和蜂鸣器就是使用的 CGI 技术。

SSI技术简介

服务器端嵌入:Server Side Include,是一种类似于 ASP 的基于服务器的网页制作技术。大多数的 WEB 服务器等均支持 SSI 命令。将内容发送到浏览器之前,可以使用“服务器端包含(SSI)”指令将文本、图形或应用程序信息包含到网页中。例如,可以使用 SSI 包含时间/日期戳、版权声明或供客户填写并返回的表单。对于在多个文件中重复出现的文本或图形,使用包含文件是一种简便的方法。将内容存入一个包含文件中即可,而不必将内容输入所有文件。通过一个非常简单的语句即可调用包含文件,此语句指示 Web 服务器将内容插入适当网页。而且,使用包含文件时,对内容的所有更改只需在一个地方就能完成。因为包含 SSI 指令的文件要求特殊处理,所以必须为所有 SSI 文件赋予 SSI 文件扩展名。默认扩展名是 .stm、.shtm 和 .shtml。

SSI 是为 WEB 服务器提供的一套命令,这些命令只要直接嵌入到 HTML 文档的注释内容之中即可。如: 就是一条 SSI 指令,其作用是将"info.htm"的内容拷贝到当前的页面中,当访问者来浏览时,会看到其它 HTML 文档一样显示 info.htm 其中的内容。其它的 SSI 指令使用形式基本同刚才的举例差不多,可见 SSI 使用只是插入一点代码而已,使用形式非常简单。 是 HTML 语法中表示注释,当 WEB 服务器不支持 SSI 时,会忽略这些信息。

应用详细介绍

1)在httpd.h文件中有如下宏定义需要注意修改

/*CGI的handler可以发送的最大参数数量 The maximum number of parameters that the CGI handler can be sent. */
#define LWIP_HTTPD_MAX_CGI_PARAMETERS 16/* SSI的Tag 最长字节 单位字节*/
#define LWIP_HTTPD_MAX_TAG_NAME_LEN 5

2)在httpd_cgi_ssi.c文件中有如下宏定义需要注意

#define NUM_CONFIG_CGI_URIS	1  //CGI的URI数量 发送的个数
#define NUM_CONFIG_SSI_TAGS	7  //SSI的TAG数量 发送的个数/*SSI的Tag 长度由LWIP_HTTPD_MAX_TAG_NAME_LEN宏定义确定*/
static const char *ppcTAGs[]=  
{"IPad",//IP地址  //长度4字节"coIP",//计算机IP地址"ponu",//端口号"eqnu",//设备编号"sosi",//软件版本"upti",//更新时间间隔"late",//车道检测方式
};
/*CGI的Tag*/
static const tCGI ppcURLs[]= 
{{"/config.cgi",Device_Setting_CGI_Handler},
};/*初始化httpd,建立一个监听PCB并且绑定到指定的端口上*/
void httpd_init(void)
{LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_init\n"));#if LWIP_HTTPD_SSIhttpd_ssi_init();#endif#if LWIP_HTTPD_CGIhttpd_cgi_init();#endifhttpd_init_addr(IP_ADDR_ANY);
}
/*SSI句柄初始化*/
void httpd_ssi_init(void)
{  //配置SSI句柄http_set_ssi_handler(SSIHandler,ppcTAGs,NUM_CONFIG_SSI_TAGS);
}
/*CGI句柄初始化*/
void httpd_cgi_init(void)
{ //配置CGI句柄http_set_cgi_handlers(ppcURLs, NUM_CONFIG_CGI_URIS);
}

代码示例

webserver源码

此处源码是index.shtml文件的源码主要是登录界面源码

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>用户登录</title><style>body {display: flex;justify-content: center;align-items: center;}.form-group {margin-bottom: 20px;}.form-group label {display: inline-block;min-width: 70px;}.form-group input {height: 32px;line-height: 32px;}</style></head><body><div class="container" style="width: 330px; padding-top: 130px"><h2 style="text-align: center">用户登录</h2><form id="loginForm" method="get" action="/register.cgi"><div class="form-group"><label for="username">用户名:</label><inputtype="text"name="username"class="form-control"id="username"placeholder="请输入用户名"autocomplete="off"/></div><div class="form-group"><label for="password">密码:</label><inputtype="password"name="password"class="form-control"id="password"placeholder="请输入密码"autocomplete="off"/></div><div class="form-group" style="text-align: center"><buttonclass="btn btn-lg btn-primary btn-block"type="submit"value="登录">用户登录</button></div></form></div></body>
</html>

stm32源码

登录CGI控制句柄源码,主要用于判断接受的数据是否正确

//登录界面CGI控制句柄
const char* Register_CGI_Handler(int iIndex,int iNumParams,char *pcParam[],char *pcValue[]){INT8U i=0,passchack=0;iIndex = FindCGIParameter("username",pcParam,iNumParams);  //找到登录页面 索引号/*	打印接受的数据printf("index:\r\n");for(i =0 ;i < iNumParams; i++){printf("pcParam[%d]:%s\r\n",i,pcParam[i]);printf("pcValue[%d]:%s\r\n",i,pcValue[i]);}printf("\r\n");*/if(iIndex != -1){for (i=0; i<iNumParams; i++){ if(strcmp(pcParam[i],"username") == 0){ //检查用户CGI参数if(strcmp(pcValue[i],"admin") == 0){ //用户名正确passchack++;}}else if(strcmp(pcParam[i],"password") == 0){ //检查密码CGI参数if(strcmp(pcValue[i],"admin123456") == 0){ //密码正确passchack++;}}}if(passchack == 2){//用户名和密码正确进入数据显示界面return "/baseData.shtml";//输入正确 跳转到其他页面}}return "/index.shtml";//账号和密码输入错误,返回登录界面}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15244.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务的划分姿势分享

微服务是一种理念&#xff0c;没有确切的定义和边界&#xff0c;好比设计原则&#xff0c;是属于抽象的概念。在定义不明确的情况下谈划分也是一种各说各话&#xff0c;具体问题需要具体分析。 微服务的划分矛盾在于粒度&#xff0c;如果粒度太大了&#xff0c;分和不分似乎都差…

ActiveMQ消息中间件应用场景

一、ActiveMQ简介 ActiveMQ是Apache出品&#xff0c;最流行的&#xff0c;能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provide实现。尽管JMS规范出台已经是很久的事情了&#xff0c;但是JMS在当今的J2EE应用中仍然扮演这特殊的地位。 二、Active…

Sublime Text,灵感犹如星辰,点亮创作之路

目录 引言Sublime Text的优点Sublime Text的缺点总结 Sublime Text 官方网站 引言 在这个快速发展的数字时代&#xff0c;创作者们面临着越来越多的选择&#xff0c;以提高他们的生产力和工作效率。而在众多的编辑软件中&#xff0c; Sublime Text 独树一帜&#xff0c;被誉为创…

Leetcode-每日一题【21.合并两个有序链表】

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4]输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 []输出&#xff1a;…

Golang指针

最近在学习底层知识&#xff0c;一直在说&#xff0c;值类型&#xff0c;引用类型&#xff0c;指针类型&#xff0c;指针&#xff0c;指针变量&#xff0c;搞的迷迷糊糊的&#xff0c;感觉也是似懂非懂&#xff0c;现在系统的学习归纳整理一下。 a : 10 a是一个值类型的变量&a…

【MySQL】内置函数详解

【MySQL】内置函数详解 日期函数字符串函数数学函数加密函数与其它 日期函数 --获取当前日期 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-07-09 | ---------------- --获取当前时间 mysql> select current_time();…

github搜索技巧笔记

一、了解 GitHub Watch按钮 Watch可以理解为关注的意思&#xff0c;默认情况下是Not watching&#xff0c;当选择Watch后&#xff0c;你会收到这个GitHub项目的所有动态。比如&#xff1a;有人发起pull request或者issue等。接收动态方式包括个人通知中心或者邮箱。 如果某个…

wincc项目中VBS脚本密码的研究

文章目录 前言一、分析二、验证及使用 前言 很多时候我们在wincc中写全局脚本时会为自己的脚本添加密码&#xff0c;但很久很久以后再想修改密码忘记了怎么办呢。 一、分析 经过分析v7.0,v7.3,v7.5密码稍有不同&#xff0c;但同样最多可以设置21位的密码。 二、验证及使用

Nginx+Tomcat负载均衡(反向代理)、动静分离集群

NginxTomcat负载均衡、动静分离 一、正向代理与反向代理二、负载均衡--with-stream #启用 stream模块&#xff0c;提供4层调度 一、正向代理与反向代理 Nginx:正向代理&#xff08;知道目标服务器&#xff09; 反向代理&#xff08;不知道目标服务器&#xff09; Nginx配置反…

基于SSM的在线医疗服务系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

数据库的备份与恢复

文章目录 前言备份恢复概述故障的种类数据库备份数据库的恢复日志文件 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 备份与恢复是为了防止数据库运行出现故障时造成数据丢失、损坏的一个重要手段 提示&#xff1a;以下是本篇文章正文内容&#xff0…

USB协议总结

1、简介 在了解USB协议之前&#xff0c;先了解下该总线协议出现的背景。在USB总线出现之前&#xff0c;计算机与键盘、鼠标、扫描仪、打印机都使用专用的接口连接&#xff0c;不同设备的接口不能互用&#xff0c;扩展性很差。每次插拔设备都要关闭计算机&#xff0c;不支持热插…