硬件:野火stm32f407开发板(带网络功能)

lan芯片:lan8720A

系统:rt-thread

http服务的功能:野火stm32f407开发板作为服务器,PC机作为客户端,在浏览器中访问STM32中的网页,具有登录功能。

网页截图如下:

STM32F407 LAN8720A 嵌入式WebServer:一个简单的登录页面插图

登录成功

STM32F407 LAN8720A 嵌入式WebServer:一个简单的登录页面插图(1)

前端页面代码如下:

index.shtml



  
    
    
    
    用户登录
    
      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;
      }
    
  
  
    
      

用户登录

helloa.html

—————–

   
   Title

Hello World

将index.shtml,helloa.html拷贝到具有fsdata.h文件的fs文件夹内。然后点击makefsdata.exe,生成网页数据文件fsdata.c

STM32F407 LAN8720A 嵌入式WebServer:一个简单的登录页面插图(2)

httpd_cgi_ssi.c

/**
  ******************************************************************************
  * @file    httpd_cg_ssi.c
  * @author  MCD Application Team
  * @version V1.1.0
  * @date    31-July-2013
  * @brief   Webserver SSI and CGI handlers
  ******************************************************************************
  * @attention
  *
  * 

© COPYRIGHT 2013 STMicroelectronics

* * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.st.com/software_license_agreement_liberty_v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "lwip/debug.h" #include "httpd.h" #include "lwip/tcp.h" #include "fs.h" #include "netconf.h" #include "LAN8742A.h" #include #include #include "./Bsp/led/bsp_led.h" char myLocalIp[15],myNetMask[15],myGW[15]; char myRemoteIp[15],myLocalPort[4],myRemotePort[4]; #define NUM_CONFIG_CGI_URIS 1 //CGI的URI数量 发送的个数 #define NUM_CONFIG_SSI_TAGS 7 //SSI的TAG数量 发送的个数 //#define Device_Setting_CGI_Handler 16 /*SSI的Tag 长度由LWIP_HTTPD_MAX_TAG_NAME_LEN宏定义确定*/ static const char *ppcTAGs[]= { "IPad",//IP地址 //长度4字节 "coIP",//计算机IP地址 "ponu",//端口号 "eqnu",//设备编号 "sosi",//软件版本 "upti",//更新时间间隔 "late",//车道检测方式 }; tSSIHandler SSIHandler; //uint32_t ADC_not_configured=1; //tCGIHandler Device_Setting_CGI_Handler; /* we will use character "t" as tag for CGI */ //char const** TAGS=&TAGCHAR; const char * Register_CGI_Handler (int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const tCGI ppcURLs[]= { {"/register.cgi", Register_CGI_Handler}, }; /* Cgi call table, only one CGI used */ tCGI CGI_TAB[1]; /** * @brief Configures the ADC. * @param None * @retval None */ /** * @brief ADC_Handler : SSI handler for ADC page */ /** * @brief CGI handler for LEDs control */ static int FindCGIParameter(const char *pcToFind, char *pcParam[], int iNumParams) { int iLoop; for(iLoop = 0; iLoop < iNumParams; iLoop++) { if(strcmp(pcToFind, pcParam[iLoop]) == 0) { return(iLoop); } } return(-1); } const char* Register_CGI_Handler(int iIndex,int iNumParams,char *pcParam[],char *pcValue[]){ u16 i=0,passchack=0; iIndex = FindCGIParameter("username",pcParam,iNumParams); //找到登录页面 索引号 /* 打印接受的数据 printf("index:\r "); for(i =0 ;i < iNumParams; i++){ printf("pcParam[%d]:%s\r ",i,pcParam[i]); printf("pcValue[%d]:%s\r ",i,pcValue[i]); } printf("\r ");*/ 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 "/helloa.html";//输入正确 跳转到其他页面 } } return "/index.shtml";//账号和密码输入错误,返回登录界面 } /** * Initialize SSI handlers */ /*void httpd_init(void) { LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_init ")); #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); } /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

main.c文件内容如下:

/**
  ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   HTTP 网页服务器
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火  STM32 F407 开发板 
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :http://fire-stm32.taobao.com
  *
  ******************************************************************************
  */
#include "stm32f4xx.h"
#include "./Bsp/led/bsp_led.h" 
#include "./Bsp/usart/bsp_debug_usart.h"
#include "./Bsp/systick/bsp_SysTick.h"
#include "lwip/tcp.h"
#include "netconf.h"
#include "LAN8742A.h"
#include "httpd.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
extern __IO uint8_t EthLinkStatus;
__IO uint32_t LocalTime = 0; /* this variable is used to create a time reference incremented by 10ms */
/* Private function prototypes -----------------------------------------------*/
static void TIM3_Config(uint16_t period,uint16_t prescaler);
/* Private functions ---------------------------------------------------------*/
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
	/* 初始化LED */
	LED_GPIO_Config();
	
	/* 初始化调试串口,一般为串口1 */
	Debug_USART_Config();
	
	/* 初始化系统滴答定时器 */	
	SysTick_Init();
	
	TIM3_Config(999,899);//10ms定时器
	printf("LAN8720A Ethernet Demo
");
	
  printf("在电脑端浏览器直接输入地址:%d.%d.%d.%d,既可访问
",IP_ADDR0,IP_ADDR1,IP_ADDR2,IP_ADDR3);

	/* Configure ethernet (GPIOs, clocks, MAC, DMA) */
  ETH_BSP_Config();	
  printf("LAN8720A BSP INIT AND COMFIGURE SUCCESS
");
	
  /* Initilaize the LwIP stack */
  LwIP_Init();	
	
	/* Http webserver Init */
  httpd_init();
	
	while(1)
	{
		/* check if any packet received */
    if (ETH_CheckFrameReceived())
    { 
      /* process received ethernet packet */
      LwIP_Pkt_Handle();
    }
    /* handle periodic timers for LwIP */
    LwIP_Periodic_Handle(LocalTime);
	}
}

/**
  * @brief  通用定时器3中断初始化
  * @param  period : 自动重装值。
  * @param  prescaler : 时钟预分频数
  * @retval 无
  * @note   定时器溢出时间计算方法:Tout=((period+1)*(prescaler+1))/Ft us.
  *          Ft=定时器工作频率,为SystemCoreClock/2=90,单位:Mhz
  */
static void TIM3_Config(uint16_t period,uint16_t prescaler)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
	
	TIM_TimeBaseInitStructure.TIM_Prescaler=prescaler;  //定时器分频
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseInitStructure.TIM_Period=period;   //自动重装载值
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
	TIM_Cmd(TIM3,ENABLE); //使能定时器3
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  定时器3中断服务函数
  * @param  无
  * @retval 无
  */
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
	{
		LocalTime+=10;//10ms增量
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

烧录程序测试:

STM32F407 LAN8720A 嵌入式WebServer:一个简单的登录页面插图(3)

在浏览器中输入192.168.1.122就可以访问页面。

CSDN:STM32F407 LAN8720A 嵌入式WebServer实现简单的登录注册功能

本站无任何商业行为
个人在线分享-虚灵IT资料分享 » STM32F407 LAN8720A 嵌入式WebServer:一个简单的登录页面
E-->