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

news2024/11/26 12:35:56

介绍

最近由于项目功能需要,开始研究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_SSI
      httpd_ssi_init();
    #endif
  
    #if LWIP_HTTPD_CGI
      httpd_cgi_init();
    #endif

	httpd_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>
          <input
            type="text"
            name="username"
            class="form-control"
            id="username"
            placeholder="请输入用户名"
            autocomplete="off"
          />
        </div>

        <div class="form-group">
          <label for="password">密码:</label>
          <input
            type="password"
            name="password"
            class="form-control"
            id="password"
            placeholder="请输入密码"
            autocomplete="off"
          />
        </div>

        <div class="form-group" style="text-align: center">
          <button
            class="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.coloradmin.cn/o/724562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu配置pppoe的详细过程

虽然我的是22&#xff0c;其实这跟ubuntu的具体版本没什么关系 1 为什么要装pppoe联网&#xff1f; 联想主机装上ubuntu后发现wifi网络在启动后一段时间找不到&#xff0c;突然搜索不了&#xff0c;后来问导师才知道师妹之前就是用这个电脑&#xff0c;然后也碰到过。 所以不…

开发抖音短视频账号矩阵系统技术实现能解决一机一号实名认证问题?

一、短视频账号矩阵系统解决一机一号实名认证问题&#xff1f; 目前站在开发者角度来看问的比较多&#xff0c;做开发技术类矩阵saas工具&#xff0c;需要的多账号怎么解决&#xff0c;这需要从两个方面来做开发解决。 第一、从开发角度来看技术开发首先解决代理ip分发问题&a…

SPSS读取纯文本文件

纯文本文件是通用的一种格式文件&#xff0c;根据纯文本文件中数据的排序方式&#xff0c;可以将其分为自由格式和固定格式。自由格式文本文件的数据项之间必须有分隔符&#xff0c;固定格式数据项之间不需要分隔符。 1.以自由格式读取数据 &#xff08;1&#xff09;选择“文…

【嵌入式Qt开发入门】如何使用Qt进行绘制实时图表——QChart 图表

要想使用 Qt Charts&#xff0c;我们的 Qt 版本得使用 Qt 5.7 之后的版本。其实 Qt Charts 并不是 Qt 5.7 才有的&#xff0c;是在 Qt 5.7 以前只有商业版本的 Qt 才有 Qt Charts。我们能免费下载的 Qt 版本都是社区&#xff08;开源&#xff09;版本。 Qt Charts 很方便的绘制…

LTD233次升级|官网商城全球卖货•上传文章SEO关键字•创建下载中心

1、支持第三方支付平台Billing System&#xff0c;支持人民币结算外币商品 2、中文商城支持海外收货地址 3、文章批量上传支持传入 SEO关键字 4、拍卖应用支持查看竞价中的报价记录 5、新增下载文件模块 商城应用 1) 支持第三方支付平台 Billing System 在本次升级中&…

IM即时通讯+智能审批,助力企业效能提升

在企业运行中&#xff0c;大都会使用即时通讯去进行沟通交流&#xff0c;即传递文字信息、各类文档文件甚至是实时的语音和视频通话。而随着技术的不断深入&#xff0c;即时通讯软件越发成熟&#xff0c;它已经不再仅仅只是一个简单的聊天工具&#xff0c;而是包涵办公、协作、…

2023年测试之路,从功能测试进阶测试开发工程师,突破内卷...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试开发工程师到…

LiangGaRy-学习笔记-Day28

1、回顾知识 1.1、docker启动MySQL 安装docker #准备好二进制的包 [rootNode2 ~]# ls docker-20.10.9.tgz docker-20.10.9.tgz [rootNode2 ~]# #解压docker的二进制包 [rootNode2 ~]# tar -xf docker-20.10.9.tgz #把它移动到/usr/local/下 [rootNode2 ~]# mv docker /usr/…

《MySQL技术内幕》读书总结(一):MySQL体系结构和存储引擎

文章目录 前言&#xff1a;1、定义数据库和实例2、MySQL体系结构3、MySQL存储引擎InnoDBMyISAM 4、连接MySQL 前言&#xff1a; 该技术文章是我阅读《MySQL技术内幕 InnoDB存储引擎》第2版的总结梳理 我写这里文章的目的&#xff1a;书中的内容过于系统和繁琐&#xff0c;并不是…

小白也能轻松上手的6个流程图工具

随着信息时代的到来&#xff0c;流程图已经成为各行各业展示业务流程、工作流程、数据流程等必不可少的形式之一。但是对于初学者来说&#xff0c;学习和使用传统的流程图软件有一定的门槛&#xff0c;因此&#xff0c;本文将推荐6款适合初学者的在线流程图软件&#xff0c;让您…

Framework UI机制之Choreographer编舞者

Choreographer&#xff08;编舞者&#xff09; Choreographer&#xff08;编舞者&#xff09;是 Android 系统中的一个重要组件&#xff0c;用于协调和管理界面的动画和渲染操作的时机。它负责在界面上正确地处理和同步动画、布局和绘制操作&#xff0c;以保证流畅的用户体验。…

Java基础---常见的语法糖

目录 典型回答 如何解语法糖 糖块一、switch 支持 String 与枚举 糖块二、泛型 糖块三、自动装箱与拆箱 糖块四、方法变长参数 糖块五、枚举 糖块六、内部类 糖块七、条件编译 糖块八、断言 糖块九、数值字面量 糖块十、for-each 糖块十一、try-with-resource 糖…

TigerBot和ChatGLM-6B大语言模型

目录 1 TigerBot大语言模型 1.1 环境安装 1.2 模型下载 1.2.1 hugging face 网站下载 1.2.2 百度网盘下载 1.3 推理 2 ChatGLM大语言模型 2.1环境搭建 2.2 模型下载 2.3 推理 1 TigerBot大语言模型 虎博科技”发布自研多模态大模型TigerBot&#xff0c;开源模型、代码…

Focal Loss损失函数

目录 前言 交叉熵损失函数 平衡交叉熵 Focal Loss 代码实现 前言 Focal loss是一个常用的解决类别不平衡问题的损失函数&#xff0c;由何恺明提出的&#xff08;论文名称&#xff1a;Focal Loss for Dense Object Detection&#xff09;&#xff0c;用于图像领域解决one-…

学习系统编程No.29【线程执行过程之页表详解】

引言&#xff1a; 北京时间&#xff1a;2023/7/3/14:09&#xff0c;刚睡醒&#xff0c;放假在家起床时间确实不怎么好调整&#xff0c;根本固定不了一点&#xff0c;当然通俗点说也就是根本起不来&#xff0c;哈哈哈&#xff0c;已经很少见到那种7点起来码字的情形了&#xff…

NanopcT4 系统 人脸检测实验 超详细教程 代码及操作步骤

文章目录 1.NanopcT4 系统烧写详细操作步骤2.vim 使用与 gcc 使用3.makefile 使用4.GPIO 引脚查看与连接5.使用vim 编写 LED 灯闪烁c 语言程序test1.c6.使用vim 编写 LED 灯闪烁shell 脚本程序test2.sh7.在ARM 上实现人脸检测 1.NanopcT4 系统烧写详细操作步骤 1)准备一张 8G …

口语理解任务源码详解系列(二)利用seq2seq-attention模型实现

利用seq2seq-attention模型实现 写在前面 在前文介绍了项目的数据集构建&#xff1a;传送门 本文利用seq2seq-attention实现&#xff1a;实现细节请参考论文&#xff1a;《Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling》 1.意…

喜羊羊贴吧顶帖软件实战教学

喜羊羊贴吧顶帖软件实战教学#贴吧顶帖#贴吧推广 大家好&#xff0c;欢迎来到百收网SEO这期视频&#xff0c;给大家更新一下百度贴最新的一个顶帖视频教程。首先我们今天用的顶帖软件是我们的喜羊羊173 的一个版本&#xff0c;软件的话在我们的群文件去下载&#xff0c;就是我们…

如何查看货物的物流状态

想不想有一个一键批量查询快递号的软件&#xff1f;今天&#xff0c;小编向您介绍一款软件&#xff1a;“固乔快递查询助手”&#xff0c;该软件是固乔工作室正式推出的专业快递和物流单号出货信息批量查询软件。这款软件功能实用&#xff0c;操作简单&#xff0c;页面简单&…

使用 Jackson 库对日期时间的动态序列化反序列化操作

0.背景 因某项目中的数据报表功能在创建年报 和月报时需要生成不同的日期格式&#xff0c;但数据结构未变&#xff0c;为避免类的冗余定义&#xff0c;故使用如下方式来动态设置日期格式&#xff0c;在不同报表是使用不同格式的时间格式来保存数据。 1.代码介绍 PS:此介绍有Cha…