基于LINUX系统的嵌入式WEB服务器的设计2_第1页
基于LINUX系统的嵌入式WEB服务器的设计2_第2页
基于LINUX系统的嵌入式WEB服务器的设计2_第3页
基于LINUX系统的嵌入式WEB服务器的设计2_第4页
基于LINUX系统的嵌入式WEB服务器的设计2_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统开发课程设计摘要嵌入式Web服务器主要用于远程监测和控制,它不同于传统的Web服务器,硬件处理器能力和储存能力有限,因此操作系统等相关软件需要进行裁剪以适应嵌入式环境,开源代码的操作系统Linu型具有强大的网络服务功能,支持多种网络接口和网络协议栈,同时具有成本低性能稳定,扩充能力强等特点,成为嵌入式操作系统的首选。关键词:Linux;Web服务器;浏览器;交叉编译

前言嵌入式系统已经成熟并且得到了广泛地使用。在传统的测控系统中,为了实现多个测控点之间的信息交流,一般采用RS-485、CAN、SPI等总线将多个测控节点组织成一个网络,但是这样的网络专用性太强,有效地通信范围太窄,而基于TCP/IP协议的Web技术得到了普及,更重要的是这些协议是可开发的、标准的、独立于平台的。把嵌入式系统和与Web技术结合在一起,将Web技术引入到测量和控制系统中,实现基于嵌入式Web服务器的远程控制系统,必将有良好地应用前景。嵌入式系统离不开嵌入式操作系统。目前商用的操作系统往往价格昂贵,不适应广泛应用。嵌入式Linux操作系统源码可开发。移植性好,支持多种硬件平台并且支持几乎所有的常见网络通信协议支持的文件系统也很丰富,是一个功能完整的嵌入式操作系统并且有大量的优秀开发码源的应用软件和开发工具可以使用。因此,采用Linux作为平台,使用Web技术进行远程在线测控系统的设计。嵌入式系统开发课程设计一、基本原理1.1嵌入式WEB服务器概述1)WEB服务器通常是在远程机器上,负责对浏览器页面请求作出响应,返回HTML编码或类似的数据流。通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑(businesslogic)。随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的B/S结构,即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器,能够生成动态页面,在用户端只需要通过Web浏览器就可以对嵌入式设备进行管理和监控,非常方便实用。2)WEB浏览器WEB浏览器是个显示网页伺服器或档案系统内的HTML文件,并让用户与此些文件互动的一种软件。个人电脑上常见的网页浏览器包括微软的InternetExplorer、Mozilla的Firefox、Opera和Safari。浏览器是最经常使用到的客户端程序。3)嵌入式WEB服务器架构图1嵌入式WEB服务器架构常见的嵌入式WEB服务器有lighttpd、shttpd、thttpd、boa、mathopd、minihttpd、appweb、goahead等上百种。1.2SOCKET编程概述现在大多数的操作系统都提供了已编译好了的网络通讯程序。TCP/IP范围内最普通的例子就是web客户端(浏览器)和web服务器,还有就是FTP和Telnet的客户端和服务器等。Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。SOCKET编程接口#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol);说明:socket()函数创建一个套接字参数:domain:应用程序所在主机使用的通信协议族type:建立的套接字的类型Protocol:使用的特定协议#include<sys/socket.h>intbind(intsockfd,structsockaddr*my_addr,socklen_taddrlen);说明:将套接字地址与所创建的套接字号联系起来参数:sockfd:调用socket返回的文件描述符my_addr:指向数据结构structsockaddr的指针,它保存地址(即端口和IP地址)信息addrlen:设置为sizeof(structsockaddr)#include<sys/socket.h>intconnect(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen);说明:建立套接字连接,成功返回0,失败返回-1参数:sockfd:调用socket返回的文件描述符serv_addr:保存着目的地端口和IP地址的数据结构structsockaddraddrlen:设置为sizeof(structsockaddr)#include<sys/socket.h>intlisten(ints,intbacklog);说明:用于面向连接服务器,表明它愿意接收连接参数:sockfd:调用socket返回的文件描述符backlog:在进入队列中允许的连接数目,在发生错误的时候返回-1#include<sys/socket.h>intaccept(ints,structsockaddr*addr,socklen_t*addrlen);说明:建立套接字连接,成功返回文件描述符,失败-1参数:sockfd:调用socket返回的文件描述符addr:指向局部的数据结构sockaddr_in的指针addrlen:设置为sizeof(structsockaddr_in)#include<sys/types.h>#include<sys/socket.h>ssize_tsend(ints,constvoid*buf,size_tlen,intflags);说明:用于流式套接字或者数据报套接字的通讯,返回实际发送的数据的字节数,它在错误的时候返回-1参数:sockfd:发送数据的套接字描述符(或者是调用socket()或者accept())msg :指向发送数据的指针len :数据长度flags:总是设置为0#include<sys/types.h>#include<sys/socket.h>ssize_trecv(ints,void*buf,size_tlen,intflags);说明:用于流式套接字的通讯,recv()返回实际读入缓冲 的数据的字节数。或者在错误的时候返回-1参数:sockfd:要读的SOCKET描述符buf :要读的信息的缓冲区len :缓冲的最大长度flags:总是设置为0二、系统分析2.1整体结构图主程序:建立TCP类型SOCKET在80端口进行监听连接请求。接收到连接请求,将请求传送给连接处理模块处理。并继续进行监听。如图2所示:图2整体流程2.2连接处理模块图3连接处理模块三、详细设计3.1主程序设计1)功能说明系统的总入口,也是系统的主要控制函数。分别完成如下功能:建立环境设置。设置信号处理方式。建立侦听TCP流方式SOCKET并绑定80端口。建立连接侦听及客户连接处理调用主循环。2)算法流程图算法流程图如图4所示:图4算法流程图3)命令行输入处理用户在命令行输入参数-i,则将客户输入文件描述字设为0,即标准输入。用于在本机进行测试。其他输入全部忽略。3.2客户连接处理模块设计1)功能说明用于初步处理客户的连接请求,并将请求信息传递给客户请求解析函数处理。2)算法具体算法如图5所示:图5算法流程图3.3客户请求解析处理模块设计1)功能说明用于解析客户的请求,并根据请求信息调用相应的函数进行请求处理。2)算法算法流程图如图6所示:图6算法流程图3.4发送HTTP协议数据头模块设计1)功能说明根据参数的不同,发送不同的HTTP协议头信息。2)算法函数定义为:intPrintHeader(FILE*f,intcontent_type)发送请求成功信息:HTTP/1.0200OK。根据文档类型发送相应的信息:fprintf(),函数中的第一个参数f为客户连接文件流句柄。switch(content_type){case't':fprintf(f,"Content-type:text/plain\n");break;case'g':fprintf(f,"Content-type:image/gif\n");break;case'j':fprintf(f,"Content-type:image/jpeg\n");break;case'h':fprintf(f,"Content-type:text/html\n");break;}发送服务器信息:fprintf(f,"Server:AMRLinux-httpd0.2.4\n");发送文件过期为永不过期:fprintf(f,"Expires:0\n");四、运行结果1、进入目录:[root@localhost/]#cd/UP-CUP210-II/SRC/exp/basic/04_webserver/[root@localhost04_webserver]#lsGoogleMakefilecopy.ccopy.odochttpdhttpd.chttpd.oindex.html[root@localhost04_webserver]#2、清除中间代码,重新编译[root@localhost04_webserver]#makecleanrm-f../bin/httpd./httpd*.elf*.gdb*.o[root@localhost04_webserver]#makearm-linux-gcc-DHTTPD_DOCUMENT_ROOT=\"/mnt/yaffs\"-c-ohttpd.ohttpd.carm-linux-gcc-DHTTPD_DOCUMENT_ROOT=\"/mnt/yaffs\"-c-ocopy.ocopy.carm-linux-gcc-static-o../bin/httpdhttpd.ocopy.o-lpthreadarm-linux-gcc-static-ohttpdhttpd.ocopy.o-lpthread[root@localhost04_webserver]#lsGoogleMakefilecopy.ccopy.odochttpdhttpd.chttpd.oindex.html当前目录下生成可执行程序httpd

。4、启动UP-CUP210-II型实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录。[root@UP-TECHyaffs]#mountnfs57:/UP-CUP210-II/mnt/nfs/6、进入串口终端的NFS共享实验目录。[root@UP-TECHyaffs]#cd/mnt/nfs/SRC/exp/basic/04_webserver/[root@UP-TECH04_webserver]#lsGooglecopy.cdochttpd.cindex.htmlMakefilecopy.ohttpdhttpd.o[root@UP-TECH04_webserver]#6、执行程序,启动HTTP服务器。[root@UP-TECH04_webserver]#./httpdstartinghttpd...pressqtoquit.waitforconnection.此时UP-CUP210-II型设备端HTTP服务器启动并等待连接。打开PC机WindowsXP系统上的IE浏览器,在地址栏输入UP-CUP210-II型设备IP地址:99。如图7所示:图7输入IP地址输入正确的IP地址即可访问UP-CUP210-II型设备上HTTP提供的服务。结果如下:ARM端:[root@UP-TECH04_webserver]#./httpdstartinghttpd...pressqtoquit. waitforconnection.buf='GET/HTTP/1.1Gotbuf1'Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,'Gotbuf1'application/msword,*/*'Gotbuf1'Accept-Language:zh-cn'Gotbuf1'Accept-Encoding:gzip,deflate'Gotbuf1'User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;QQPinyinSetup620;CIBA;MAXTHON2.0)'Gotbuf1'Host:99'Gotbuf1'Connection:Keep-Alive'浏览器端:如图8所示:图8浏览器端显示参考文献[1]孙天泽,袁文菊,张海峰.嵌入式设计及Linux驱动开发指南—基于ARM9处理器[M].北京:电子工业出版社,2005[2]于明,范书瑞,曾祥烨.ARM9嵌入式系统设计与开发教程[M].北京:电子工业出版社,2006[3]王田苗.嵌入式系统设计与实例开发[M].北京:清华大学出版社,2003[4]SamsungElectronics.S3C2410X32-BitRISCMicroprocessorUser’sManual,2003[5]周立功等.ARM嵌入式Linux系统构建与驱动开发范例.北京:北京航空航天大学出版社,2006[6]郑慕德.编著《嵌入式微型计算机系统实例教程-ARM与LINUX》.科学出版社2006.7[7]王进德.编著《嵌入式LINUX程序设计与应用案例》.中国电力出版社,2007.5[8]王学龙著.嵌入式LINUX系统设计与应用[M].北京:清华大学出版社,2001[9]林宇,郭凌云.LINUX网络编程[M].北京:人民邮电出版社,2000[10]张斌,高波等.LINUX网络编程[M].北京:清华大学出版社,2000

总结两周的课设在不知不觉中已经结束了,虽说时间不长,但是收获颇丰,不仅学到了一些新知识,巩固了以前学习的内容,增强了我的动手操作调试能力。虽说一些技术我们在课堂上野曾经学习过,但是大都停留在理论学习上,实际开发很少,而这次课程设计给了我们一个很好的边学习边实践的机会,对我们深入学习这些技术有很大的帮助,深刻体会到了这些技术的实用性。本次课程设计利用实验室提供的博创经典UP-CUP210-II型嵌入式实验平台,通过上位机编程控制下位机进行web服务器的设计,使用C语言编程,生成目标文件,并且通过对宿主机下位机的相关上机操作,实现对书本内容的实际操作,巩固加深对嵌入式系统的认知和了解,最终在此基础上进行创新设计,了解了一个实际的网络通讯应用程序整体设计后,我们共同编写C程序实现对服务器的访问。经过这段时间的学习、系统分析、方案论证、硬件和软件设计、调试等的努力,完成了嵌入式web服务器的设计制作。在系统的设计制作过程中,确实遇到了各种各样的问题,如调试思路正确但是没有能够进行找到合适的方法进行进一步的实验,设计中对于程序的编写以及目录结构的认知上存在偏差,其主要原因还是基础功不扎实,把握系统的能力不足,这为我们以后的学习和工作提了一个醒。在问题的解决过程中,也提高了我的动手动脑能力,学到了许多在书本上学不到的知识。在具体的设计当中解决了诸如httpd服务器的搭建和C程序的修改,程序的调试和系统的整体认识等问题,收获很大。做课程设计是一次再系统的学习,课程设计的完成,让我在其中学到了许多,尤其是学会了合作,懂得了合作早就的效益和成果。在这里再次感谢和我一起搭档的同学,还有对我们精心指导的老师!致谢通过近两周的努力,我们的课程设计终于完成了,这意味着这一阶段艰苦的热烈的付出即将告一段落。在整个课程设计中,我在学习上和思想上都受益匪浅,这除了自身的努力外,与指导的老师、同学的关心、支持和鼓励是分不开的。做课程设计是一次再系统的学习,课程设计的完成,让我在其中学到了许多,尤其是学会了合作,懂得了合作早就的效益和成果。在这里再次感谢和我一起搭档的同学,还有对我们精心指导的老师!

附录Httpd.c#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<errno.h>#include<sys/stat.h>#include<dirent.h>#include<signal.h>#include<unistd.h>#include<ctype.h>#include"pthread.h"#defineDEBUGintKEY_QUIT=0;intTIMEOUT=30;#ifndefO_BINARY#defineO_BINARY0#endifcharreferrer[128];intcontent_length;#defineSERVER_PORT80intPrintHeader(FILE*f,intcontent_type){alarm(TIMEOUT);fprintf(f,"HTTP/1.0200OK\n");switch(content_type){case't':fprintf(f,"Content-type:text/plain\n");break;case'g':fprintf(f,"Content-type:image/gif\n");break;case'j':fprintf(f,"Content-type:image/jpeg\n");break;case'h':fprintf(f,"Content-type:text/html\n");break;}fprintf(f,"Server:uClinux-httpd0.2.2\n");fprintf(f,"Expires:0\n");fprintf(f,"\n");alarm(0);return(0);}intDoJpeg(FILE*f,char*name){char*buf;FILE*infile;intcount;if(!(infile=fopen(name,"r"))){alarm(TIMEOUT);fprintf(stderr,"UnabletoopenJPEGfile%s,%d\n",name,errno);fflush(f);alarm(0);return-1;}PrintHeader(f,'j'); copy(infile,f);/*printsthepage*/alarm(TIMEOUT);fclose(infile);alarm(0);return0;}intDoGif(FILE*f,char*name){char*buf;FILE*infile;intcount;if(!(infile=fopen(name,"r"))){alarm(TIMEOUT);fprintf(stderr,"UnabletoopenGIFfile%s,%d\n",name,errno);fflush(f);alarm(0);return-1;}PrintHeader(f,'g');copy(infile,f);/*printsthepage*/alarm(TIMEOUT);fclose(infile);alarm(0);return0;}intDoDir(FILE*f,char*name){char*buf;DIR*dir;structdirent*dirent;if((dir=opendir(name))==0){fprintf(stderr,"Unabletoopendirectory%s,%d\n",name,errno);fflush(f);return-1;}PrintHeader(f,'h');alarm(TIMEOUT);fprintf(f,"<H1>Indexof%s</H1>\n\n",name);alarm(0);if(name[strlen(name)-1]!='/'){ strcat(name,"/");}while(dirent=readdir(dir)){ alarm(TIMEOUT);fprintf(f,"<p><ahref=\"/%s%s\">%s</a></p>\n",name,dirent->d_name,dirent->d_name); alarm(0);}closedir(dir);return0;}intDoHTML(FILE*f,char*name){char*buf;FILE*infile;intcount;char*dir=0;if(!(infile=fopen(name,"r"))){alarm(TIMEOUT);fprintf(stderr,"UnabletoopenHTMLfile%s,%d\n",name,errno);fflush(f);alarm(0);return-1;}PrintHeader(f,'h');copy(infile,f);/*printsthepage*/alarm(TIMEOUT);fclose(infile);alarm(0);return0;}intDoText(FILE*f,char*name){char*buf;FILE*infile;intcount;if(!(infile=fopen(name,"r"))){alarm(TIMEOUT);fprintf(stderr,"Unabletoopentextfile%s,%d\n",name,errno);fflush(f);alarm(0);return-1;}PrintHeader(f,'t');copy(infile,f);/*printsthepage*/alarm(TIMEOUT);fclose(infile);alarm(0);return0;}intParseReq(FILE*f,char*r){char*bp; structstatstbuf; char*arg; char*c; inte; intraw;#ifdefDEBUG printf("reqis'%s'\n",r);#endifwhile(*(++r)!='');/*skipnon-whitespace*/while(isspace(*r)) r++;while(*r=='/') r++; bp=r;while(*r&&(*(r)!='')&&(*(r)!='?')) r++;#ifdefDEBUG printf("bp='%s'%x,r='%s'\n",bp,*bp,r);#endif if(*r=='?') {char*e; *r=0; arg=r+1; if(e=strchr(arg,'')) {*e='\0';} }else{arg=0; *r=0;} c=bp;/*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if(c[0]==0x20){ c[0]='.'; c[1]='\0'; }/*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if(c[0]=='\0')strcat(c,"."); if(c&&!stat(c,&stbuf)) { if(S_ISDIR(stbuf.st_mode)) {char*end=c+strlen(c); strcat(c,"/index.html"); if(!stat(c,&stbuf)) {DoHTML(f,c); } else {*end='\0'; DoDir(f,c); } } elseif(!strcmp(r-4,".gif")) DoGif(f,c);elseif(!strcmp(r-4,".jpg")||!strcmp(r-5,".jpeg")) DoJpeg(f,c);elseif(!strcmp(r-4,".htm")||!strcmp(r-5,".html"))DoHTML(f,c);elseDoText(f,c); } else{ PrintHeader(f,'h'); alarm(TIMEOUT); fprintf(f,"<html><head><title>404FileNotFound</title></head>\n"); fprintf(f,"<body>TherequestedURLwasnotfoundonthisserver</body></html>\n"); alarm(0);} return0;}voidsigalrm(intsigno){/*gotanalarm,exit&recycle*/ exit(0);}intHandleConnect(intfd){FILE*f;charbuf[160];charbuf1[160];f=fdopen(fd,"a+");if(!f){fprintf(stderr,"httpd:Unabletoopenhttpdinputfd,error%d\n",errno);alarm(TIMEOUT);close(fd);alarm(0);return0;}setbuf(f,0);alarm(TIMEOUT);if(!fgets(buf,150,f)){fprintf(stderr,"httpd:Errorreadingconnection,error%d\n",errno);fclose(f);alarm(0);return0;}#ifdefDEBUG printf("buf='%s'\n",buf);#endifalarm(0);referrer[0]='\0'; content_length=-1;alarm(TIMEOUT); //readotherlinetoparseRrferrerandcontent_lengthinfomation while(fgets(buf1,150,f)&&(strlen(buf1)>2)){ alarm(TIMEOUT); #ifdefDEBUG printf("Gotbuf1'%s'\n",buf1); #endif if(!strncasecmp(buf1,"Referer:",8)){ char*c=buf1+8; while(isspace(*c)) c++; strcpy(referrer,c); } elseif(!strncasecmp(buf1,"Referrer:",9)){ char*c=buf1+9; while(isspace(*c)) c++; strcpy(referrer,c); } elseif(!strncasecmp(buf1,"Content-length:",15)){ content_length=atoi(buf1+15); } } alarm(0);if(ferror(f)){ fprintf(stderr,"http:Errorcontinuingreadingconnection,error%d\n",errno); fclose(f); return0; } ParseReq(f,buf);alarm(TIMEOUT); fflush(f); fclose(f); alarm(0); return1;}void*key(void*data){intc; for(;;){ c=getchar(); if(c=='q'||c=='Q'){ KEY_QUIT=1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论