小学生
最后登录1970-1-1
在线时间 小时
注册时间2013-7-10
|
本帖最后由 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); /* 发送登录网页信息的状态
-
这个是整个实验现象,显示不出网页
-
读取TF卡的网页信息,打印正常
-
这个我自己网页,用浏览器打开显示
|