野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26982|回复: 6

关于 LWIP WEB实验中 显示web网页的问题(请野火关注一下)

[复制链接]
发表于 2013-7-10 11:52:15 | 显示全部楼层 |阅读模式
本帖最后由 widibi 于 2013-7-10 11:57 编辑

1. 这里是野火自带的数据接收回调函数

static err_t http_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
{  
   char * data = NULL;
char *UserName =NULL;
char *PassWord =NULL;
char *LED_CMD  =NULL;
char *ch =NULL;
err_t et;
data = p->payload; //把接收到的数据指针交给data
  if (err == ERR_OK && p != NULL) //判断是否非空
  {        //strncmp()此函数功能,即比较字符串str1和str2的前maxlen个字符,如果前maxlen字节完全相等,返回值就=0;在前maxlen字节比较过程中,如果出现str1[n]与str2[n]不等,则返回(str1[n]-str2[n])。
  if(strncmp(data,"GET",3)==0)    //GET请求
   {
   
    Sd_Read_Html("login.html"); //从 TF卡读出名字为login.html的网页文件
     
    /*第一次与服务器连接,打开登录页面,未输入登录信息*/ //web访问响应的的头消息,告诉你服务器成功响应了你的请求,返回信息为缓存文本或者超文本格式
    tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),1);      /* 发送http协议头部信息 */   
//    tcp_write(pcb,login,sizeof(login),0);                 /* 发送登录网页信息 */
    et=tcp_write(pcb,buffer,sizeof(buffer),0);               /* 发送登录网页信息 */
    printf ( "\r\n et=%d  \r\n",et ); //此处打印为了指示是否发送成功

   }               //POST请求
  else if(strncmp(data,"POST",4)==0)      //strncmp,此函数功能即比较字符串str1和str2的前maxlen=4个字符。如果前maxlen字节完全相等,返回值就=0;在前maxlen字节比较过程中,如果出现str1[n]与str2[n]不等,则返回(str1[n]-str2[n])。
    {
    LED_CMD = strstr(data,"LED_CTRL=");   //strstr查找完全匹配的的字符串,返回该位置的指针  
    UserName = strstr(data,"UserName=");   //截取UserName=
    PassWord = strstr(UserName,"PassWord="); //截取PassWord=      
     if(UserName!=NULL && PassWord!=NULL)  /*输入了用户名和密码*/
     {
      ch = strchr(UserName,'&');     //把&替换为‘\0’ //strchr查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针,如果s中不存在c则返回NULL。
      *ch = '\0';
  
      UserName +=sizeof("UserName=")-1;   //提取用户名。sizeof字符串包括终止符‘\0’
      PassWord += sizeof("PassWord=")-1;  //提取密码
      
      if(strcmp(UserName,"wildfire")==0 && strncmp(PassWord,"123456",6)==0) /*输入的用户名和密码正确*/
      {
       LED1(ON);
       printf("\r\n提取出的用户名 =%s\r\n提取出的密码 =%s",UserName,PassWord);     
        tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),1);      /* 发送http协议头部信息 */
       tcp_write(pcb,led_ctrl_on,sizeof(led_ctrl_on),1);          /* 发送led控制网页信息 */
        
       }
       else /*输入的用户名和密码错误*/
       {
          tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),1);      /* 发送http协议头部信息 */
//         tcp_write(pcb,login,sizeof(login),0);                 /* 发送登录网页信息 */
       Sd_Read_Html("login.html");
       tcp_write(pcb,buffer,sizeof(buffer),1);                 /* 发送登录网页信息 */
       }
     }
     else if(LED_CMD !=NULL)   /*接收到LED控制命令*/
     {
      if(strstr(LED_CMD,"LED_CTRL=ON"))  /*检测是哪个命令:开\关*/
      {
       LED1(ON);
       tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),0);      /* 发送http协议头部信息 */
       tcp_write(pcb,led_ctrl_on,sizeof(led_ctrl_on),0);         /* 发送led控制网页信息 */
      }
      else if(strstr(LED_CMD,"LED_CTRL=OFF"))
      {
       LED1(OFF);
          tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),0);      /* 发送http协议头部信息 */
       tcp_write(pcb,led_ctrl_off,sizeof(led_ctrl_off),0);        /* 发送led控制网页信息 */
      }
    pbuf_free(p);  //我调整的
     }   
       }
  
   //  pbuf_free(p);  /* 释放该pbuf段 */ 野火自己的
  }   
  tcp_close(pcb);                                                 /* 关闭这个连接 */
  err = ERR_OK;
  
  return err;
}

我做的修改是,红色字体的部分。其中Sd_Read_Html("login.html"); 函数原型如下:
void  Sd_Read_Html(TCHAR *path)  //参数:文件名字
{
int res;  
int a;
UINT br;            // File R/W count

while(f_open(&fdst, path, FA_OPEN_EXISTING | FA_READ)!=FR_OK) //如果打开失败,则从新打开文件
{
     printf( "\r\n 文件打开失败!!!\n" );  
}

printf( "\r\n 文件读取如下: \n" );     

for (;;)   //读取一个文件的过程
{
  for ( a=0; a<512; a++ )                            /* 清缓冲区 */
   buffer[a]=0;
   
  res = f_read( &fdst, buffer, sizeof(buffer), &br ); /* 将文件里面的内容读到缓冲区 */
  printf("\r\n %s ", buffer);      
  if (res || br == 0) break;                          /* 错误或者到了文件尾 */              
}

f_close(&fdst);                                     /* 关闭打开的文件 */
}
现在实验现象时,当我输入:192.168.1.18 。显示不出  TF卡里面的login.html这个页面,而是空白的,但是打印信息显示,通过
Sd_Read_Html("login.html"); ,读取的网页信息是正确的,而且下面也显示,tcp_writ(pcb,buffer,sizeof(buffer),0); 发送也成功了,从打印的et=0;可以看得出来。

              
    /*第一次与服务器连接,打开登录页面,未输入登录信息*/ //web访问响应的的头消息,告诉你服务器成功响应了你的请求,返回信息为缓存文本或者超文本格式
    tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),1);      /* 发送http协议头部信息 */   
//    tcp_write(pcb,login,sizeof(login),0);                 /* 发送登录网页信息 */
    et=tcp_write(pcb,buffer,sizeof(buffer),0);               /* 发送登录网页信息 */

    printf ( "\r\n et=%d  \r\n",et ); //发送成功



我想问下,这里怎么读不出我的网页,login.html的代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml
">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>杭州电子科技大学</title>
</head>

</body>
<center><img src="杭电logo.jpg"><h2>杭州电子科技大学</h2>
<br><center><b>***********基于STM32的Web服务器测试平台**********</b>
<form action="login" method="post">
<p>  用户名:
<input type="text" name="UserName">
<p>    密码:  
<input type="password" name="PassWord">
<p><input type="submit" value="确定">
</form>

</body>
</html>

浏览器正常显示如下:

请野火关注下: 另外还有个小问题:为什么野火的网页用数组存储,但是html格式的网页文件属性的=后面都加了\,


//野火登录网页
/*********************************************************************************************************************************************/
/*网页,以数组形式存储。登录页面*/
#define LOGIN "\
<html>\
<head>\
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\
<title>LWIP移植实验 </title>\
</head>\
<body>\
<br><center><img src=\"http:/\/my.csdn.net/uploads/201208/05/1344174874_1299.jpg\">\
<br><center><h2>野火STM32开发平台</h2>\
<br><center><b>***********野火STM32开发板STM32F103-ENC28J60-移植LWIP,web服务器测试***********</b>\
<form action=\"login\" method=\"post\">\
<p>  用户名:\
<input type=\"text\" name=\"UserName\">\
<p>  密码:  \
<input type=\"password\" name=\"PassWord\">\
<p><input type=\"submit\" value=\"登录\"> \
</form>\
<br><br><center><a href=\"http:/\/firestm32.taobao.com/\">野火官方旗舰店</a>\
      <a href=\"http:/\/www.amobbs.com/forum-1008-1.html\">amoBBS论坛野火专区</a>\
<br><br><center><img src=\"http:/\/my.csdn.net/uploads/201208/05/1344174982_8577.jpg\">\
</body>\
</html>\
"
每行的最后都加反斜杠,我知道是c语言语法,但是上面红色标注出来的几个地方,我不是很理解,而且,我把浏览器上可以正常显示的网页代码,用数组存储起来,好像不加这些标注地方的
“\”,都会显示出错,不知道这个是什么原因,怎么加这个\???      <p>  密码:  \  这一行没有 尾标签</P>,感觉很纳闷。

新手第一个次发帖,请野火指导一下,谢谢!!!


打印tcp_write(pcb,buffer,sizeof(buffer),0); /* 发送登录网页信息的状态

打印tcp_write(pcb,buffer,sizeof(buffer),0);              	/* 发送登录网页信息的状态

这个是整个实验现象,显示不出网页

这个是整个实验现象,显示不出网页

读取TF卡的网页信息,打印正常

读取TF卡的网页信息,打印正常

这个我自己网页,用浏览器打开显示

这个我自己网页,用浏览器打开显示
回复

使用道具 举报

 楼主| 发表于 2013-7-10 11:57:51 | 显示全部楼层
自己先占个沙发,请关注啊,亲们!!!!!哈哈!太好笑了.
回复 支持 反对

使用道具 举报

发表于 2013-7-10 13:24:16 | 显示全部楼层
\ 是换行符,因为太长了,而C语言Define语法的作用域为 define所在的行,所以就用\表示换行,说明都是define的内容
回复 支持 反对

使用道具 举报

发表于 2013-7-10 13:33:08 | 显示全部楼层
有一部分 \ 是加在 // 之间,变成/\/ ,是因为//在C语言里是注释,所以我们在中间加一个 / 表示转义字符
回复 支持 反对

使用道具 举报

发表于 2013-7-10 15:26:26 | 显示全部楼层
等楼主加上温度显示的功能的源码,哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-10 19:35:39 | 显示全部楼层
flyleaf 发表于 2013-7-10 13:24
\ 是换行符,因为太长了,而C语言Define语法的作用域为 define所在的行,所以就用\表示换行,说明都是defin ...

谢谢火哥回复,就是我用TF卡读取网页,怎么就不行,有点想不明白!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-10 22:48:40 | 显示全部楼层
flyleaf 发表于 2013-7-10 13:33
有一部分 \ 是加在 // 之间,变成/\/ ,是因为//在C语言里是注释,所以我们在中间加一个 / 表示转义字符

#define LOGIN "\
<html>\
<head>\
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" />\
<title>DMX512控制平台</title> \
</head> \
<body>\
<table width=\"48%\" border=\"0\" align=\"center\"> \
<form action=\"login\"  method=\"post\">\
<tr>\
<td width=\"10%\" height=\"135\"> </td>\
<td width=\"14%\"> <img  align=\"right\" <img src=\"http:/\/img0.ph.126.net/pPaRKnDQMpCxt1mdZuqtGg==/3285375928266955707.jpg\" width=\"119\" height=\"97\" /></td>\
<td width=\"76%\" align=\"left\" valign=\"bottom\"><h1>   杭州电子科技大学</h1></td>\
</tr>\
<tr>\
<td height=\"49\" colspan=\"3\" align=\"center\"><h4>****************基于STM32的Web服务器测试平台**************</h4></td> \
</tr> \
<tr> \
<td height=\"40\" colspan=\"3\" align=\"center\"> 用户名:    \
<input style=\"border-color:#000\" name=\"textfield\" type=\"text\" id=\"textfield\" size=\"12\"   /></td> \
</tr>\
<tr> \
<td height=\"50\" colspan=\"3\" align=\"center\"> 密    码:   \
<input   style=\"border-color:#000\" name=\"textfield2\" type=\"password\" id=\"textfield2\" size=\"13\" /></td> \
</tr> \
<tr> \
<td colspan=\"3\" align=\"center\"><table width=\"100%\" border=\"0\">\
<tr> \
<td align=\"right\"><input style=\"width:80px;text-align:center;\" type=\"submit\" name=\"button\" id=\"button\" value=\"提交\" /></td> \
<td align=\"left\"><input style=\"width:80px;text-align:center;\" type=\"reset\" name=\"button2\" id=\"button2\" value=\"重置\" /></td>\
</tr>  \
</table></td> \
</tr>  \
</table> \
</form>\
</body>   \
</html>\
"


问题是:现在我加上<form action=\"login\"  method=\"post\">\ 中的login 就不会再显示下面的网页了,不知道哪里出错了,请指教???

不添加红色字符时候,显示的页面

不添加红色字符时候,显示的页面
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 06:24 , Processed in 0.030823 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表