快速搭建嵌入式Web服务器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

主题:快速搭建嵌入式Web服务器利尔达嵌入式研发中心C2000/M3小组2010年10月主要内容•所需的软硬件平台介绍•WEB基础知识•开始编写第一个程序–静态网页:主要介绍软件的架构及其代码分析–动态网页:主要介绍网页交互式的几种实现方法•使用表单实现(CGI?,SSI?)•Javascript脚本实现开发所需软硬件平台Cortex-M3:LM3S6432CODE:96K单周期RAM:32KSRAM串口调试1152008N1RJ45接口JTAG调试底板USB:供电及其JTAG调试接口硬件平台软件平台编译器:网页编辑软件:Dreamweaver8网页转换成二进制文件:Makefsfile(dos命令)可执行的二进制文件Keil4.12底层协议分析时可以使用数据抓包软件WEB基础知识TCP/IP分层结构物理层物理层数据链路层网络层传输层应用层数据链路层网络层传输层应用层EthernetPHYEthernetMACIP.IGMP.ICMPTCP.UDPHTTP硬件软件WEB应用程序的实现WEB通信本身是TCP通信的一种,使用TCP协议进行数据的收发,与其他也采用TCP通信协议不同的是,它在TCP通信的基础上再使用了HTTP协议。使得两个不同的WEB应用程序能正常的通信。典型的C/S结构我们接下来的工作重点1.如何建立一个服务器?2.如何对接收到的数据进行处理?这里已规定客户端和服务器的IP地址HTTP超文本传输协议!DOCTYPEhtmlPUBLIC-//W3C//DTDXHTML1.0Transitional//EN==Content-Typecontent=text/html;charset=gb2312/titlehello/title/headbodyhelloworld/body/htmlhttp格式:argcon../arg初始化部分主体部分先知道这个过程即可,其他知识具体用到时再作介绍开始编写第一个程序准备工作在开始编写第一个程序之前,我们来看看WEB客户端发送的第一个数据包到底是什么?在浏览器中输入192.168.14.20,回车后,到底发送了什么数据,格式怎么样?这里的第10个数据包即使我们需要知道的数据包继续分析该数据包内容1TCP首部+TCP数据HTTP协议部分命令部分,从这里我们就知道是HTTPGET命令客户端告诉服务器不要断开我,我还要接收数据实际传输的数据流继续分析该数据包内容2请求发送根目录文件GET命令HTTP版本号接下来分析程序的时候会用到WEB软件架构简单介绍详细介绍讲解与演示模板代码打开“[模板]web-server-demo”工程编写我们的第一个静态网页,并观察效果明白整个网页交互的过程初始化重要函数httpd_init();lwIPInit();SSICGIInit();http_set_ssi_handler(SSIHandler,g_pu8_ssi_tags_config,NUM_SSI_TAGS_CONFIG);http_set_cgi_handlers(g_px_cgi_uris_config,NUM_CGI_URIS_CONFIG);intSSIHandler(intiIndex,char*pcInsert,intiInsertLen);typedefchar*(*tCGIHandler)(intiIndex,intiNumParams,char*pcParam[],char*pcValue[]);此为CGI函数原型此为SSI函数原型实际为建立一个端口为80的TCP服务器总结:数据交互的流程什么是CGI、SSI?在搜索文件的过程中,还涉及到了对文件的读写structfs_file*fs_open(char*name)voidfs_close(structfs_file*file)intfs_read(structfs_file*file,char*buffer,intcount)具体内容可参考:\third_party\lwip-1.3.2\apps\httpserver_raw\fs.c\src\lmi_fs.cCGI?实在很难说明白到底什么是CGI。而如果你先知道CGI有什么作用,将会很好的理解CGI是什么这个概念。CGI可以为我们提供许多HTML无法做到的功能。比如a.一个记数器b.顾客信息表格的提交以及统计c.搜索程序d.WEB数据库CGI(CommonGateIntergace),在物理上,CGI是一段程序,它运行在Server上,提供同客户端Html页面的接口。这样说大概还不好理解。那么我们看一个实际例子:现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户段输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的cgi目录下特定的cgi程序中,于是cgi程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后cgi程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样。整个过程结束。此文部分内容摘至“E书时空”SSI?SSI与CGI相同,也可以理解为一段程序,帮助CGI程序更好的完成网页数据的交互过程。使得CGI返回给客户端消息时,处理更容易和轻松。在物理上,SSI只是一些标识符,但是有它自己的格式如下所示:SSItags格式:!--#tag--其中tag可以用户自定义,系统默认支持最大8个字节长度的标识符,用户可以修改定义宏来支持更长的标识,但建议越短越好。工作原理:服务器在接收到一个请求后,会在网页数据中搜索以上格式的字符,并记录这些tag标识,在服务器处理完任务后需要返回给客户机数据时,会找系统已经注册了的tag,并在相应的tag--后添加所需要的数据,最后把数据再发送给客户机。实现了整个网页动态交互的功能。小贴士:在一些计算机操作系统上,cgi或者是ssi是一个脚本程序或者是一个C等其他语言实现的程序。在计算机上SSI的标签可能都是标准的字符集,但是在嵌入式系统中我们可以更灵活的使用这些。甚至是对部分功能进行精简,使得代码量能减小。现在开始动态网页的实现—表单方式formid=loginname=loginmethod=getaction=login.cgitablewidth=200border=1align=centertrtdusername/tdtdlabelinputname=usernametype=textid=usernameaccesskey=uvalue=rootsize=10maxlength=10//label/td/trtrtdpasswd/tdtdlabel“value”?inputname=passwdtype=passwordid=passwdaccesskey=psize=10maxlength=10//label/td/trtrtdcolspan=2labeldivalign=centerinputtype=submitname=Submitvalue=提交/inputname=resettype=resetid=resetvalue=重置//div/label/td/tr/table/form提交一个表单点击“提交”后,数据发送格式如何?数据分析与前面不同的是URI部分:这次客户机想要找/login.cgi?username=root&passwd=root….文件?服务器会对这个URI进行解析,并提取出usernamepasswd关键字及其他们的值然后服务器会搜索login.cgi函数进行处理,处理程序应该会判断用户名和密码是否正确,如果正确该怎么样,不正确该怎么样,完全取决于我们自己的程序。动手编写一个CGI处理程序第一步:编写相应的网页,该网页当中应该包含一个表单,表单中还应该包含一些关键字(见例程)。最后该应该包含一个提交按钮。第二步:使用makefsfile工具把该网页目录转换成“网络文件系统”这里有别于NFS第三步:在程序中添加cgi程序,如下代码:可参考/src/ssi_cgi_handle.c文件中的相关代码#defineCGI_INDEX_LOGIN0consttCGIg_px_cgi_uris_config[]={{/login.cgi,LoginCGIHandler},//CGI_INDEX_LOGIN};staticchar*LoginCGIHandler(intiIndex,intiNumParams,char*pcParam[],char*pcValue[])目标:实现一个用户登入界面动手编写一个CGI处理程序(续)第四步:编写“LoginCGIHandler()”函数实体:s32_param=FindCGIParameter(passwd,pcParam,iNumParams);if(s32_param!=-1){DecodeFormString(pcValue[s32_param],(char*)u8_passwd,10+1);}需要找的关键字找到的参数索引号把找到的参数值存入缓存中注意这里的+1?第五步:编译,下载程序。观察效果,如有问题马上调试。表单提交的另一种方式--POST在前面的表单代码中,method=“”定义了该表单提交的方式。getorpost?在一般的嵌入式WEB开发中,用的最多的是get方式,get我们可以理解成客户端需要向服务器获取什么文件。这种方式的好处就是一问一答,对服务器来会说可以很容易的处理这些问题。--这里的关键是使用get方式,客户机的需求一般只需要发送一个数据包就可以把自己需要的信息说明白。的确是一个数据包,lwip默认的配置只把缓冲区开了256个字节,去掉协议部分,数据部分只有200字节左右,这对于大的数据包来说是很危险的。因为多余的数据部分会被无情的截掉。但从另外一个角度来说,对于一个确定的嵌入式WEB服务器应用,它只做自己份内的事,200个字节己足够实现功能,何乐而不为呢?多余的ram空间完全可以给应用程序使用。但想实现POST,那这200个字节就太少了。POST方式主要是用于客户机有大量数据想传送给服务器,传输完毕之后会自动再发送一个GET方法向服务器获取,这么大的数据是否没有传错?这个问题的答案必须由服务器回答,应为也只有服务器才知道数据接收有没有错误!问题出现了:POST方法可能需要多个数据包连续的发送,而现有的Lwip不支持有时间讲表单提交的另一种方式–POST(续)此POST方式,怎么办?只有分析POST方法协议,修改Lwip中HTTP底层协议,使得支持POST方法Lwip中对POST方法的支持具体请查看源程序。这里提供一个对于不明协议,如何对数据进行分析的一般处理方法!!!1.网上搜索一些资料,最好能查看协议的原始版本rfc。2.结合网上的信息,自己做实验测试。3.把抓到的数据包进行分析。请看下面对POST数据包的分析。先从小文件开始,0个字节或一个字节表单提交的另一种方式–POST(续)formid=uploadfilename=uploadfilemethod=postaction=upload.cgienctype=multipart/form-datadivalign=center选择要上传的文件inputtype=filename=filename/br/inputtype=submitvalue=上传//div/form先在网页中嵌入PO

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功