文章分类

当前位置:首页>技术文章>基于44B0平台的uC-Linux Web服务器实现方法研究

基于44B0平台的uC-Linux Web服务器实现方法研究

嵌入式系统已经大量应用于各种场合,网络技术的发展使嵌入式系统的网络功能日益完善。在测控领域里,常常需要远程查询被测控对象的实时状态,或进行某种控制操作,采用服务器-浏览器进行工作的嵌入式系统,可以仅通过浏览器就完成所有的测控任务而不依赖于其他客户端程序,具有简单网络服务器功能的嵌入式系统可以方便地提供这种功能。本文以目前国内外普遍采用的 ARM+uCLinux 嵌入式系统为例,以 uCLinux20031103 版本为基础,以 S3C44B0X 开发板为平台,对 uCLinux 下实现静态、动态 Web 服务器的方法进行了研究,实现了对远程温度传感器的访问。

1. uCLinux 简介 Linux 是一种很受欢迎的操作系统,它与 UNIX 系统兼容,开放源代码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式设备,uCLinux 就是针对微控制领域而设计的 Linux 系统。 uCLinux 内核的功能结构与 Linux 基本相同,只是在对内存管理和进程管理方面进行了改写,以满足无 MMU 处理器的要求。uClinux 由 Linux2.0 内核发展而来,是专为没有 MMU 的微处理器设计的嵌入式 Linux 操作系统。uClinux 的内核比 Linux

2.0 内核小的多,但保留了 Linux 操作系统的主要优点:稳定性,优异的网络能力以及优秀的文件系统支持。 因此,采用 ARM+uCLinux 平台在获得比单片机系统更强的处理能力和相对较低功耗的同时,也为嵌入式系统接入网络提供了更为便利的途径,这一点正是得益于 Linux。

2. uCLinux 下 Web 服务器的选择将嵌入式系统接入网络,一般是为了提供一种系统与外界交互的途径,由于网络的可扩展性,嵌入式系统一旦连接到网络中,其所能提供的信息和获得的信息都将成倍增加。为了更方便地通过网络向外提供信息,必须为系统构建 Web 服务器。 uCLinux 环境下,主要有三个 Web 服务器:httpd、thttpd 和 Boa。httpd 是最简单的一个 Web 服务器,它的功能最弱,不支持认证,不支持 CGI。

如果 Web 服务器仅需提供一些静态页面,例如简单的在线帮助、系统介绍等,完全可以用静态服务器 httpd 来实现。thttpd 和 Boa 都支持认证、CGI 等,功能都比较全。若需提高系统的安全性,或需要与用户进行交互,例如数据查询、实时状态查询等,则必须使用动态 Web 技术,可以选择这两种服务器之一来实现。

3. uCLinux 下静态 Web 服务器的实现 httpd 是最简单的一个 web 服务器,只有几百行代码,功能较弱。它的一些简单配置需要在 Makefile 和 httpd.c 的内部进行,文件位于/bb40/uCLinux-dist/user/httpd/目录下。Makefile 中定义了缺省的 documentDir 为/home/httpd,缺省主页面文件为 index.html。uCLinux20031103 版本的 httpd.c 中的 main 函数有如下两行程序: chroot(HTTPD_DOCUMENT_ROOT); chdir("/"); 其中第二行程序将影响到实际运行结果,建议将该行程序直接指向 index.html 文件所在目录。

将页面文件复制到\\bb40\\uCLinux-dist\ omfs\\home\\httpd 下即可。 对 uCLinux 进行重新配置,并在用户程序中选中 httpd,编译 uCLinux 内核并下载到开发板,在 uclinx 启动后通过 httpd &命令即可启动服务器,如需自动启动,在\\uCLinux-dist\\vendors\\Samsung\\S3C44B0 目录下的 rc 文件中加入同样的命令即可。

4.动态服务器与 CGI 目前实现动态 Web 页面有多种技术可供选择,CGI、ASP、PHP 等技术在高端平台上都能很好地实现用户所需的功能。但在 uCLinux 下实现动态网页,目前只能采用 CGI。 CGI,Common Gate Interface,即通用网关接口,是一个连接外部应用程序到服务器的标准。一个简单的静态 HTML 文档是没有交互后台程序,而 CGI 程序则可以实时执行并输出动态信息。

使用 CGI 需要一个输入界面,一般就是一个包含了表单(FORM)的页面。FORM 在 CGI 中是最常被使用的输入界面,它由一组标签所组成,目前的标准中,FORM 的标签可分为三大类:INPUT、SELECT 以及 TEXTAREA。在设置了一系列有关的标签后,每个 FORM 通常需要一个 SUBMIT 按钮用来发送表单内容。 当用户在客户端按下 FORM 上的 SUBMIT 按钮,浏览器(Browser)将客户端输入的参数传回服务器,服务器启动指定的程序并将封装的参数传入,后台程序依照传入的参数完成指定的工作。

如果此时有需要传回结果的话,则程序会把结果传回给服务器并发送到浏览器。

5.用 boa 实现 uCLinux 下的动态 Web 服务器用 Boa 来实现动态 Web 服务器的方法较为复杂,主要通过 boa.conf 和 mime.types 进行,具体过程如下: Boa 的关键配置由 boa.conf 文件决定,该文件是一个文本文件,内部除了各项设置还包含了详细的注释和说明。Boa.conf 文件的注释中首先指出,为了在用户访问 Web 时服务器能确定根目录的位置,需要指定服务器的根目录路径服务器_ROOT。

\\uCLinux-dist\\user\\boa\\src\\目录下的 define.h 定义了服务器的根目录路径,通过修改 define.h 文件中#define ERVER_ROOT /home 语句来指定服务器_ROOT。在 uCLinux 启动后通过命令行也可以指定该路径,且命令行所指定的路径具有更高的优先级,命令参数为-c 加上欲指向的根目录路径,例如该文件中提供的例子:boa -c /usr/local/boa。

下面来配置一个简单的 boa 服务器。在\\uCLinux-dist\\user\\boa\\src\\boa.conf 里进行如下修改: l 将 user root 改为 User 0; l 将 Group root 改为 Group 0; l 将 DocumentRoot/etc 改为 DocumentRoot/home; l 将 MimeTypes/etc/mime.types 改为 MimeTypes/home/mime.types; l 将#AddType application/x-httpd-cgi cgi 前面的#去掉使系统可以支持 cgi 方式; l 定义 CGI 程序所在目录:ScriptAlias/cgi-bin/ /home/cgi-bin/; 这样配置后的 boa 服务器将/home 目录作为服务器的根目录,cgi 程序位于\\hone\\cgi-bin 目录下,默认页面文件为\\home\\index.html。

Boa.conf 文件的注释中指出,boa.conf 文件和 mime.types 文件必须放到 Web 服务器根目录下,本例中把 mime.types 和修改后的 bao.conf 复制到\\uCLinux-dist\ omfs\\home\\目录下。 在编译 uCLinux 内核前还要通过修改\\uCLinux-dist\\vendors\\Samsung\\S3C44B0\\目录下的 makefile 文件来建立 cgi 二进制文件将要被存放到的目录。

在 ROMFS_DIRS=bin dev etc home lib mnt proc usr var 的后边增加 home/cgi-bin,这样修改后编译内核,编译后生成的根文件系统\\bb40\\uCLinux-dist\ omfs 中将增加一个\\home\\cgi-bin 目录。 对 uCLinux 进行重新配置,并在用户程序中选中 boa 项,编译 uCLinux 内核并下载到开发板,在 uclinx 启动后,通过 boa -c/home/&命令即可启动服务器,如需自动启动,在 rc 文件中加入同样的命令即可。

由于尚未放入 cgi 程序,此时仅能看到放在 home 目录下的页面,不会有任何动态响应。通过下面的例子将了解如何实现页面到 CGI 程序的关联。

6.一个通过动态 Web 页面访问远程温度传感器的例子下面通过一个例子来说明如何实现 uCLinux 下的动态 Web 页面技术。 首先建立一个简单的表单页面: 输入需要访问的温度传感器号码,并单击“确定”查看。 CGI 规定,GET 方式下的表单被发送到服务器后,表单中的数据被保存在 QUERY_STRING 环境变量中。这种表单的处理相对简单,只要读取环境变量就可以了。在 CGI 程序中使用库函数 getenv 来把环境变量的值作为一个字符串来读取,在取得了字符串中的数据后,就可以对数据进行需要的处理。

CGI 程序完成处理后的输出被重定向到客户浏览器,用户通过浏览器就可以看到相关结果。请注意,在 ACTION 后面所指向的 CGI 文件并没有扩展名。 下面就是处理这个表单的 CGI 程序 mycgi.c: #include #include int main(void){ char *data; long m; printf("Content-Type:text/html%c%c",10,10); printf(" "); printf("房间温度"); data = getenv("QUERY_STRING"); if(sscanf(data,"m=%ld",&m)!

=1) printf("错误!输入数据非法。表单中必须输入 1~10 的数字。"); else printf("%ld 号房间的温度是:%ld 度。",m,readtempr(m)); return 0; } 其中的 readtempr()是读取温度传感器输出的函数。在 cygwin 下使用 arm-elf-gcc 对该 cgi 源程序进行编译,获得 mycgi.exe,将该程序复制到\\uCLinux-dist\ omfs\\home\\cgi-bin\\目录下,确保前面的表单页面文件 index.html 位于\\uCLinux-dist\ omfs\\home\\目录里。

编译内核并下载,下面两图是运行结果。 运行结果说明:左图是访问 IP 为 192.168.0.128 的嵌入式服务器的结果,该服务器默认页面为 index.html,浏览器显示为一个简单的表单。右图是在该表单输入传感器号 5 并按下“确定”按钮后,CGI 程序执行后返回的结果。 结论在嵌入式系统应用日益广泛的今天,使用 ARM+ucLinux 作为平台的系统具有多种优点。本文对这种平台上的 Web 服务器构建技术进行了尝试,并获得了良好的效果。

在需要嵌入式系统与用户通过浏览器-服务器这种体系进行交互时,ARM+uCLinux+Web 服务器是完全可以胜任的。 参考文献 1 http://www.uclinux.org/网站文档 2 http://www.boa.org/网站文档 3 光军著,动态网站设计编程技法,北京航天航空大学出版社,2001 4 余苏宁著,互联网实用技术与网页制作,西安电子科技大学出版社,2000


© 星光电子技术工作室 2021 All Rights Reserved.
如有任何问题、建议、业务、合作,请联系手机/微信:13713820066