当前位置:文档之家› 基于嵌入式web服务器的网站及应用开发

基于嵌入式web服务器的网站及应用开发

基于嵌入式web服务器的网站及应用开发CGI 的工作原理:CGI 是一种通用的接口标准。

CGI 程序就是符合这种接口标准的,运行在Web 服务器上的程序。

它的工作就是控制信息要求,产生并传回所需的文件。

CGI 由浏览器的输入发这个程序。

先看看浏览器浏览网页是怎样实现的。

作为一个用户首先在浏览器的地址栏中添加上要访问的主页地址并回车触发这个申请。

浏览器将申请发送到服务器上。

We服务器接收这些申请并根据.htm 或.html 的后缀并认识到这是HTML 文件。

Web 服务器从当前硬盘或内存中读取正确的HTML 文件,然后将它送回浏览器。

HTML 文件将被用户的浏览器解释并将结果显示在用户浏览器上。

CGI 程序可以用来在web 内加入动态的内容。

通过接口,浏览器能够发送一个可执行应用程序的HTTP 请求,而不仅仅只是静态的HTML 文件。

服务器运行指定的应用程序,这个应用程序读取与请求相关的信息,获得请求传过来的数值。

例如使用者填写HTML 表单提交了数据,浏览器将这些数据发送到Web 服务器上。

Web 服务器接收这些数据并根据客户机指定的CGI 程序把这些数据递交给指定的CGI 程序,并使CGI 在服务器上运行。

CGI程序运行结束,生成HTML 页面,Web 服务器把CGI 程序运行的结果送回用户浏览器。

HTML 文件将会被用户的浏览器解释并将结果显示在用户浏览器上。

CGI 的基本工作情况如下图所示:CGI的输入与输出:Web 服务器与CGI程序之间通过四种途径进行通信:环境变量、命令行、标准输入和标准输出。

其中负责输入的有环境变量、命令行和标准输入。

命令行只用于ISINDEX查询, 较少使用。

环境变量存放服务器向CGI程序传递的一些运行参数, 比如REQUEST_METHOD表示用户提出请求或提交数据的方法是GET还是POST。

方法(METHOD)是HTTP 中对命令的称呼。

GET 方法通过环境变量QUERY- STRING传递用户提交的数据。

经过编码的数据以问号打头追加在标识CGI 脚本地址的URL 后一起传给Web 服务器。

服务器将其存于QUERY-STRING 中,CGI程序可以通过getenv() 函数来读取。

编码数据除了表单数据,还可以是直接调用CGI 脚本时追加在URL 地址后面的参数。

POST 方法则通过标准输入( stdin)传递提交数据。

编码了的表单数据独立地传送给Web 服务器,CGI程序从标准输入中获得,可以用getchar( ) ,sscanf( ) ,fread( )等函数。

要注意的是数据的长度是通过读取环境变量CONTENT_LENGTH 获得的,而不是通过文件尾标识符来判断。

嵌入式WEB 服务器的硬件结构嵌入式WEB服务器的硬件结构如图2所示。

其主要由CPU芯片、MPEG-4音视频编码芯片、Flash芯片、SDRAM内存、以太网络接口、大容量硬盘组成。

其中CPU采用M OTOROLA公司的PowerPC系列嵌入式通信处理器MPC8250。

MPEG-4音视频编码芯片完成对从摄像头传送过来的视频数据的压缩和编码。

根据网络带宽、拓扑结构以及对图像质量的要求,本系统选用基于MPEG-4标准的分层可扩展性编码方案。

压缩后的视频数据根据需要,可以存储在大容量硬盘中,或者通过以太网进行网络传输。

为了实现视频存储功能,需要采用大容量的硬盘。

WEB服务器与CGI程序WEB服务器通过HTTP协议与监控端浏览器软件进行信息交互,提供其他应用程序模块的接口以及视频数据浏览界面和摄像机控制界面。

此外,它还要对监控端的访问权限进行控制,过滤监控端的请求和控制信息,处理多个监控端的请求和控制的同步和优先级问题。

本系统选择适合于嵌入式系统的Boa WEB服务器。

Boa是一个单任务的HTTP服务器,支持能够实现动态WEB技术的CGI技术,源代码开放、性能高。

同时服务器程序本身所占空间很小,因而十分适用于嵌入式系统。

同时,本系统采用了CGI(公用网关接口) 来实现动态WEB技术,CGI规定了WEB服务器调用其他可执行程序(CGI程序)的接口协议标准。

WEB服务器通过调用CGI程序实现和浏览器的交互,也就是CGI程序接受浏览器发送给WEB服务器的信息,进行处理,将响应结果再回送给WEB服务器及浏览器。

原则C GI程序可以用任何程序设计语言编写,但是用C语言编写的CGI程序具有执行速度快、安全性高等特点。

点击相关按钮所调用的CGI函数及函数的实现int main(){char *button;int fd_fifo1,fd_fifo2,fd_fifo3,fd_fifo4;char cmd[5];int i;printf("Content-Type:text/html\n\n");此行通过标准输出将字符串″Contenttype:text/plain\n\n″传送给Web服务器。

它是一个MIME 头信息,它告诉Web服务器随后的输出是以纯ASCII文本的形式。

请注意在这个头信息中有两个换行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。

button=getenv("QUERY_STRING");CGI定义:当GET方法提交的表单被发送到服务器断后,表单中的数据被保存在服务器上一个叫做QUERY_STRING的环境变量中。

这种表单的处理相对简单,只要读取环境变量就可以了。

for(i=0;i<4;i++){cmd[i]=*(button+i);}cmd[4]='\0';if(!strcmp("cmd1",cmd)){fd_fifo1 = open("FIFO_1",O_RDWR);fd_fifo2 = open("FIFO_2",O_RDWR);fd_fifo3 = open("FIFO_3",O_RDWR);write(fd_fifo1,"open_camera",strlen("open_camera"));write(fd_fifo2,"open_infreared",strlen("open_infreared"));write(fd_fifo3,"open_tempreature",strlen("open_tempreature"));close(fd_fifo1);close(fd_fifo2);close(fd_fifo3);}else if(!strcmp("cmd2",cmd)){fd_fifo1 = open("FIFO_1",O_RDWR);fd_fifo2 = open("FIFO_2",O_RDWR);fd_fifo3 = open("FIFO_3",O_RDWR);write(fd_fifo1,"close_camera",strlen("close_camera"));write(fd_fifo2,"close_infreared",strlen("close_infreared"));write(fd_fifo3,"close_tempreature",strlen("close_tempreature"));close(fd_fifo1);close(fd_fifo2);close(fd_fifo3);}else if(!strcmp("cmd3",cmd)){fd_fifo1 = open("FIFO_1",O_RDWR);write(fd_fifo1,"open_camera",strlen("open_camera"));close(fd_fifo1);}else if(!strcmp("cmd4",cmd)){fd_fifo1 = open("FIFO_1",O_RDWR);write(fd_fifo1,"close_camera",strlen("close_camera"));close(fd_fifo1);}else if(!strcmp("cmd5",cmd)){fd_fifo2 = open("FIFO_2",O_RDWR);write(fd_fifo2,"open_infreared",strlen("open_infreared"));close(fd_fifo2);}else if(!strcmp("cmd6",cmd)){fd_fifo2 = open("FIFO_2",O_RDWR);write(fd_fifo2,"close_infreared",strlen("close_infreared")); close(fd_fifo2);}else if(!strcmp("cmd7",cmd)){fd_fifo1 = open("FIFO_1",O_RDWR);write(fd_fifo1,"get_camera",strlen("get_camera"));close(fd_fifo1);}else if(!strcmp("cmd8",cmd)){fd_fifo4 = open("FIFO_4",O_RDWR);write(fd_fifo4,"send_info",strlen("send_info"));close(fd_fifo4);}return 0;}登陆界面及调用的相关CGI函数的实现int main(){char *info;FILE *fp;char usr_pwd[]="textfield=name&textarea=12345";用户自己设定的名字和密码char pri_pwd[50];int i=0,j=0;printf("Content-type:text/html\n\n");注意上一行不能省略printf("<html><title>get name & pwd</title>\n");if (getenv("QUERY_STRING")){info = getenv("QUERY_STRING");while(j!=2){pri_pwd[i]=*(info+i);if(pri_pwd[i]=='&'){j++;}i++;}While语句用于实现把第二个&符之前的参数存到字符数组中去pri_pwd[i-1]='\0';if(!strcmp(usr_pwd,pri_pwd)){printf("<metahttp-equiv=\"refresh\"content=\"1;url=../index.html\">"); }如果名字和密码输入正确进入index页面else{printf("用户名或密码错误,请重新输入!\n");printf("<metahttp-equiv=\"refresh\"content=\"2;url=../land.html\">");}出错则返回登陆界面}printf("</html>");return 0;}。

相关主题