热度 1||
基本概念篇
SSI:Server Side Include,是一种类似于ASP的基于服务器的网页制作技术。
原理是将内容发送到浏览器之前,使用“服务器端包含 (SSI)”指令将文本、图形或应用程序信息包含到网页中。例如,可以使用 SSI 包含时间/日期戳、版权声明或供客户填写并返回的表单。对于在多个文件中重复出现的文本或图形,使用包含文件是一种简便的方法。将内容存入一个包含文件中即可,而不必将内容输入所有文件。通过一个非常简单的语句即可调用包含文件,此语句指示 Web 服务器将内容插入适当网页。而且,使用包含文件时,对内容的所有更改只需在一个地方就能完成。因为包含 SSI 指令的文件要求特殊处理,所以必须为所有 SSI 文件赋予 SSI文件扩展名。默认扩展名是 .stm、.shtm 和 .shtml
CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
Common Gateway Interface,简称CGI。在物理上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。这样说大概还不好理解。那么我们看一个实际例子:现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如评论之类的东西。接着用户按一下“发布或提交”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后CGI程序将执行结果返回给服务器(webServer),然后服务器将结果返回给客户端,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样。整个过程结束。
实战篇
在本程序中,adc采样网站刷新采用的是SSI接口;网页提交LED亮灭采用的是CGI接口。
在STM32F4x7ADC.shtml中,用文本方式打开, 有两个关键的语句。
<meta http-equiv="refresh"
content="1">,这边说明1s中刷新一次, 也就是adc一秒采样一次。
<td><!--#t--> <small><span
style="font-family: Verdana;">mv</small>
</td> 这边简单的理解就是网页程序法给浏览器之前, 查找<!--#t-->中关键字为t后, 进行替换, 替换完显示adc采样的电压值。
httpd_cgi_ssi.c为cgi、ssi处理函数。
ssi处理部分:
char const* TAGCHAR="t"; //替换关键字为t
void httpd_ssi_init(void)
{
/* configure SSI
handlers (ADC page SSI) */
http_set_ssi_handler(ADC_Handler, (char const **)TAGS, 1);//替换处理程序为ADC_Handler
}
1s进行网站内容刷新的时候, 执行下面的代码
/**
* @brief ADC_Handler : SSI handler for ADC page
*/
u16_t ADC_Handler(int iIndex, char *pcInsert, int iInsertLen)
{
/* We have only one SSI handler iIndex = 0 */
if (iIndex ==0)
{
char Digit1=0, Digit2=0, Digit3=0, Digit4=0;
uint32_t ADCVal = 0;
/* configure ADC if not yet configured */
if (ADC_not_configured ==1)
{
ADC_Configuration();
ADC_not_configured=0;
}
/* get ADC conversion value */
ADCVal = ADC_GetConversionValue(ADC1);
/* convert to Voltage, step = 0.8 mV */
ADCVal = (uint32_t)(ADCVal*3300/4096);
/* get digits to display */
Digit1= ADCVal/1000;
Digit2= (ADCVal-(Digit1*1000))/100 ;
Digit3= (ADCVal-((Digit1*1000)+(Digit2*100)))/10;
Digit4= ADCVal -((Digit1*1000)+(Digit2*100)+ (Digit3*10));
/* prepare data to be inserted in html */
*pcInsert = (char)(Digit1+0x30);
*(pcInsert + 1) = (char)(Digit2+0x30);
*(pcInsert + 2) = (char)(Digit3+0x30);
*(pcInsert + 3) = (char)(Digit4+0x30);
/* 4 characters need to be inserted in html*/
return 4;
}
return 0;
}
在STM32F4x7LED.html中, 用文本方式打开。关键语句如下:
<form method="get"
action="/leds.cgi"><input value="1"
name="led" type="checkbox">LED1
<input value="2"
name="led" type="checkbox">LED2
<input value="3"
name="led" type="checkbox">LED3
<input value="4"
name="led" type="checkbox">LED4
<input value="Send"
type="submit"> </form>
httpd_cgi_ssi.c中CGI处理部分。
const tCGI LEDS_CGI={"/leds.cgi",
LEDS_CGI_Handler};
void httpd_cgi_init(void)
{
/*
configure CGI handlers (LEDs control CGI) */
CGI_TAB[0] = LEDS_CGI;
http_set_cgi_handlers(CGI_TAB, 1);
}
当在网页界面中点send按钮,执行下面的程序。
/**
* @brief CGI handler for LEDs control
*/
const char * LEDS_CGI_Handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[])
{
uint32_t i=0;
/* We have only one SSI handler iIndex = 0 */
if (iIndex==0)
{
/* Check cgi parameter : example GET /leds.cgi?led=2&led=4 */
for (i=0; i<iNumParams; i++)
{
/* check parameter "led" */
if (strcmp(pcParam[i] , "led")==0)
{
/* switch led1 ON if 1 */
if(strcmp(pcValue[i], "1") ==0)
{
LED1_ON;
}
/* switch led2 ON if 2 */
else if(strcmp(pcValue[i], "2") ==0)
{
LED2_ON;
}
/* switch led3 ON if 3 */
else if(strcmp(pcValue[i], "3") ==0)
{
LED3_ON;
}
/* switch led4 ON if 4 */
else if(strcmp(pcValue[i], "4") ==0)
{
LED1_OFF;
LED2_OFF;
LED3_OFF;
}
}
}
}
/* uri to send after cgi call*/
return "/STM32F4x7LED.html";
}
需要源代码和开发板验证的同学, 请上淘宝店铺https://shop36329318.taobao.com/ 吧!