关键词:uClinux 动态Web技术 CGI(通用网关接口) Web Server
随着计算机技术发展,嵌入式系统已成为计算机领域的一个重要组成部分。所谓嵌入式系统,是以应用中为心,以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。它具有计算机的功能,但又不称为计算机,包括机顶盒、微波炉、电梯、数控系统、医疗仪器等。
当今的信息时代,是一个构筑在网络基础之睥时代,互联网已经渗透到了人们工作和生活的各个角落。嵌入式Internet是近几年发展起来一项新兴概念和技术,不仅通过PC机能上网,通过各种各样的嵌入式设备也能上网,使用浏览Web已经成为现代人的习惯。21世纪的电子信息产品,如果不能适应这个发展的方向和要求,将很难有强劲的竞争力。而目前正在开发的嵌入式系统中,49%的项目选择Linux作为嵌入式操作系统,因此对uClinux操作系统下嵌入式Web技术的研究具有较高的现实意义,本文就此作些讨论。
1 uClinux嵌入式操作系统
Linux是一种优秀的自由软件。由于源代码公开,功能强大,具有良好的网络支持,又易于睛,近几年成为了最有潜力的嵌入式操作系统。UClinux是一个完全符合GNU/GPL(通用公共许可证)公约的项目和完全开发代码。它是标准Linux的一个分支,现在由Lineo公司支持维护。它专门针对没有MMU的CPU,并且为嵌放式系统做了许多小型化的工作。现在已经成为使用uClinux的安例包括:基于ColdFire的CISCO 2500/3000/4000路由器;基于ARM7TDMI的Aplio公司的voice-over-IP电话;Axis公司的AXIS2001网络数码相机;Adomo公司的机顶盒以及各种开发板。
UClinux经过对标准Linux内核的改动,形成了一个高度优化的、代码紧凑的嵌入式Linux,虽然它的体积很小,但uClinux仍然保留了Linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、对各种文件系统完备的支持,以及标准丰富的API。它的主要特征如下:①通用Linux API;②内核体积小于512KB,内核加上文件系统小于900KB;③完整体积小于512KB,内核加上文件系统小于900KB;④支持其它大量网络协议;⑤支持各种文件系统,包括NFS、ext2、romfs and JFFS、MS-DOS和FAT16;⑥支持各种典型的处理器构架,包括ARM、PowerPC、X86等。
2 基于uClinux的动态Web实现技术
2.1 uClinux下Web Server的实现
uClinux下,主要有三个Web Server:httpd、thttpd和Boa。Httpd是最简单的一个Web Server,它的功能最弱,不支持认证,不支持CGI。Thttpd和Boa都支持认证、CGI等,功能都比较全。为了实现动态Web技术,这里我们选择实现一个支持CGI的、非常适合于嵌入式系统的Boa Web Server。
Boa是一个单任务的http服务器,源代码开放、性能高。目前,uClinux的代码中已经包含boa的源代码,在uClinux下实现Boa,需要对Boa做一些配置和修改。这主要通过对boa.conf和mime.types文件进行修改来实现,需要改动的配置有以下几项。
(1)建目录
由于uClinux默认的根文件系统romfs是只读的,不能用mkdir等命令来新建目录,故应在编译内核前先建好要用到的目录,这通过修改/uclinux-samsung/vendors/Samsung/4510b/makefile文件来实现。在ROMFS_DIRS=bin dev etc home lib mnt proc usr var的后边增加home/web home/web/cgi-bin,这样修改后编译内核,编译好的根文件系统romfs中就包含这些目录了。
(2)指定Web服务器的根目录路径(SERVER_ROOT)
进入/uclinux-samsung/user/boa/src/目录,通过修改define.h文件中#define ERVER_ROOT“/home”语句 来指定SERVER_ROOT。另外,还可以通过命令行来指定,例如:boa-c/home/&。而且命令行 指定的SERVER_ROOT可以覆盖define.h文件所指定的。
(3)修改boa.conf文件
在./uclinux-samsung/user/boa/src/boa.conf里修改:
*将user obody
Group ogroup
改为User 0
Group 0;
*将DocumentRoot/var/www
改为DocumentRoot/home/web,这样web服务器的文档根目录为/home/web;
*将MimeTypes/etc/mime.types
改为MimeTypes/home/web/mime.types;
定义默认首页和CGI程序所在目录,即
DirectoryIndex index.html
ScriptAlias/cgi-bin//home/web/cgi-bin/
这样指定后,.index.htm为远程浏览客户访问Web Server所看到的首页默认值,用C编写的CGI程序编译成二进制文件,放到/cgi-bin/目录下,CGI程序能被正确地执行。
Boa.conf文件和mime.types文件必须放到Web服务器根目录下,所以把修改后的bao.conf和mime.types拷贝到“./uclinux-samsung/romfs/home/”目录下。然后在/uclinux-samsung/Vendors/Samsung/4510b/inittab里修改,在:inet:unknown:/bin/inetd后加入:boa:unknown:/bin/boac/home。
配置过程后,重新编译内核,编译时选中Boa选项。把编译好的内核下载到开发 板,启动uClinux,完成IP配置,启动Boa Web Server,然后就可以通过IE访问你的网页了。如果想启动uClinux时自动启动Boa Web Server,可以修改rc文件,进入uclinux-samsung/vendors/Samsung/4510B目录,在运行脚本rc中增加两行:
ifconfig eth202.196.9.197up
boa-c /home/&
修改后重新编译内核,再下载到开发板运行。运行uClinux后,不需要配置就可以直接通过IE来访问你的网页了。
2.2 uClinux下实现动态Web页面的CGI技术
到目前为止,实现动态Web页面有4种技术可供选择:CGI(Common Gateway Interface)、ASP(Active X ServerPage)、ASP(Active XServerPage)、PHP(Personal Home Page)和JSP(Java Server Page)。在uClinux下如果要实现动态网页,只能采用CGI,因此目前uClinux还不支持ASP、PHP等动态Web页面技术。
CGI(通用网关接口)提供Web服务器一个执行外部程序的通道,这种服务端技术使得浏览器和服务器之间具有交互性。CGI程序属于一个外部程序,需要编译成可执行文件,以便在服务端运行,其应用程序结构如图1所示。浏览器将用户输入的数据送到Web服务器,Web服务器将数据使用STDIN送给CGI程序,在执行CGI程序后,可能会访问存储数据的一些文档,最后使用STDOUT输出HTML形式的结构文件,经Web服务器送回浏览器显示给用户。
CGI程序可以用任何程序设计语言编写,如Shell脚本语言、Perl、Fortran、Pascal、C语言等。但目前uClinux不支持Perl、Fortran等语言,而且C语言在平台无关性上表示不错,所以我们选择用C来编写CGI程序。另外,uClinux也不支持数据库,所以需要保存的数据只能保存到文件中,CGI查询数据时也是查询这些文件,而不是访问数据库。
2.3 uClinux下动态Web页面的实现
下面通过一个例子来说明如何实现uClinux下的动态Web页面技术。此例子的目的是使用户能够通过Web页面内嵌表单提交数据,并能把用户提交的数据通过Web浏览器正确地返回给用户。实现动态Web页面的第一步是用HTML语言编写Web页及内建表单。编写Web页面时,要由ACTION属性来指定相关的CGI程序,如ACTION=cgi-bin/demo;由MOTHOD属性来指明所用的提交数据的方法,即MOTHOD=POST(GET)。本人编写的Web页面在浏览器中的显示如图2所示。
实现动态Web页面的第二步是用C编写CGI程序,CGI程序分为以下几部分:①根据POST方法或GET方法从提交的表单中接收数据;②URL编码的解码;③用printf()函数来产生HTML源代码,并将经过解码后的数据正确地返回给浏览器。包括demo.c、cgivars.h和cgivars.c三个文件。将编写好的CGI程序编译成二进制文件放在cgi-bin/目录下,CGI程序能被正确地执行,最终CGI程序对上述表单数据的处理结果如图3所示。
图3 CGI程序处理结果
下面对程序稍加说明。若以GET方法提交数据,表单中的数据被保存在QUERY_STRING环境变量中,通过调用函数getenv("QUERY_STRING")来读取数据;若以POST方法提交数据,则程序先从CONTENT_LENGTH环境量得到数据的字长,然后从标准输入中读取相应长度的字符串即可得到提交的数据。数组postinput[i]中保存的就是从表单中提取的数据。
URL编码的解码过程较为复杂,URL编码的规则下:①变量之间用“&”分开;②变量与其对应值之间用"="连接;③空格符用"+"代替;④特殊意义的字符用%接相应的十六进制ASCII码代替。解码即为编码的逆过程。在程序中,对于从表单中提取过来的postinput[i]中的数据,当发现字符为“+”时,将它转换成空格;当发现字符为“&”时,意味着个名字/值对的结束,在此处将字符中切成几个字符串;当再现字符为“=”时,意味着一个名字/值对的名字部分的结束,在此再将名字/值对分开。最后通过调用unescape_url(char *url)子函数将十六进制ASCII码值表示的特殊字符转换成相应的ASCII字符。
结语
用本文所提供的方法实现的动态Web Server通用性强,能够在嵌入式平台上高效率地运行,有着广泛的应用前景。