snowflyin的个人空间 https://bbs.21ic.com/?456050 [收藏] [复制] [RSS]

日志

Stm32F407 LWIP http server分享

热度 1已有 1713 次阅读2018-12-26 21:48 |个人分类:STM32F407实战|系统分类:单片机


基本概念篇

       SSIServer 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浏览器,CGIWeb的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。  
Common Gateway Interface,简称CGI。在物理上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。这样说大概还不好理解。那么我们看一个实际例子:现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如评论之类的东西。接着用户按一下发布或提交(到目前为止工作都在客户端),浏览器把这些信息传送到服务器CGI目录下特定的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后CGI程序将执行结果返回给服务器(webServer),然后服务器将结果返回给客户端,表示请求的任务已经结束。此时用户在浏览器里将看到留言结束的字样。整个过程结束。

实战篇

在本程序中,adc采样网站刷新采用的是SSI接口;网页提交LED亮灭采用的是CGI接口。

STM32F4x7ADC.shtml中,用文本方式打开, 有两个关键的语句。

  1. <meta http-equiv="refresh"
    content="1">
    ,这边说明1s中刷新一次, 也就是adc一秒采样一次。

  2. <td><!--#t--> <small><span
    style="font-family: Verdana;">mv
    </small>
    </td>
    这边简单的理解就是网页程序法给浏览器之前, 查找<!--#t-->中关键字为t后, 进行替换, 替换完显示adc采样的电压值。

httpd_cgi_ssi.ccgissi处理函数。

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.cCGI处理部分。

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"; 
}

网页的制作和makefsdata工具的使用
网页的制作需要用的frontpage或者dreamwave等专业工具, 或者也可以直接写html程序实现。
stm32f407运行web server程序,需要先把网页文件转换成二进制文件, 本文中提供makefsdata工具进行转换。
具体使用方法:
在makefsdata同级目录下,建立fs目录, 将网页文件放进fs目录, 注意, 主页文件必须为index.html。在这种情况下, 直接点击运行makefsdata或者命令行运行makefsdata -i,就会在软件同级目录下产生fsdata.c
替换原程序中的fsdata.c web server中就为新的网页。

需要源代码和开发板验证的同学, 请上淘宝店铺https://shop36329318.taobao.com/ 吧!


路过

鸡蛋
1

鲜花

握手

雷人

刚表态过的朋友 (1 人)

评论 (0 个评论)