手机端
or

欢迎您加入我爱方案网QQ群

1.智能产品外包服务群(311606115)
2.嵌入式项目开发群(491609563)

基于S3C2410的家庭网关Web服务器的研究与实现

李海芳; 潘志安; 何海鹏| 嵌入式Linux,Boa,嵌入式Web服务器,CGI| 2010-11-29
1493 收藏
分享到: 
每日精选
热门推荐

【中心议题】

  • 阐述了Boa Web服务器的实现原理
  • 实现了浏览器与Web服务器之间的动态交互

【解决方案】

  • 配置Boa服务器
  • 按照CGI标准实现动态Web技术

随着计算机技术的发展和Internet的普及,各种各样的家用电器可进一步智能化,我们甚至可以通过网络来实现对家电的远程控制。要实现家电的远程控制,首先要建立一个家庭网关,其中嵌入式Web服务器是实现家庭网关的核心任务。本文详细阐述了家庭网关中Web服务器的实现方法以及在其实现过程中CGI的工作原理。

1 嵌入式操作系统及硬件平台的选择

在嵌入式系统中,操作系统的性能对整个应用的实时性和稳定性有重要的影响。目前较为流行的嵌入式操作系统有:LinuxVxWorksWindowsCE等。其中嵌入式Linux的最大特点是源代码完全开放并且遵循GPL协议,而且其网络性能和稳定性都比较优良。因此本文选用嵌入式Linux。嵌入式处理器是嵌入式系统的核心部件,它的选择将对整个嵌入式系统的成本和性能产生很大的影响,本文实验部分选用了Samsung公司的S3C2410处理器,它是基于ARM公司的ARM920T处理器核。

2 家庭网关嵌入式Web服务器的实现

2.1 家庭网关简介

家庭网关是互联网进入家庭、家用电器数字化、家庭安全及环境控制的智能化产物。家庭网关作为家庭网络的核心,是处于广域网和家庭网络中间的一个节点,即家庭网络的入口节点。作为入口节点,它应该是一种类似服务器的设备,可以直接连接在互联网的网络接口上使用,起到电器设备同互联网之间的通用接口平台的作用,为用户提供Web服务,使得用户可以通过Internet来远程控制家中的电器,而这就是家庭网关最核心的功能。这里的家庭网关选用嵌入式系统作为家庭网关,而其关键又在于嵌入式家庭网关中Web服务器的建立。

 

2.2 嵌入式Web服务器的选择

嵌入式Web服务器不同于传统的Web服务器。传统Web服务器主要用于处理较大的客户量同时并发访问,在硬件方面有强大的处理器和内存支持,在软件方面有商业数据库支持。而嵌入式设备处理器能力,存储容量有限,传统Web服务器一般不能在嵌入式设备上面运行,因此不会使用Linux下最常用的如Apache等服务器,而需要使用一些专门为嵌入式设备设计的Web服务器。

典型的嵌入式Web服务器有httpdthttpdBoa。其中httpd是最简单的一个Web服务器,它的功能简单,不支持认证,不支持CGI;thttpdBoa都支持认证,都支持CGI,但是Boa的功能更全,应用范围也更广,通常只有几十k字节的大小,另外它是一个单线程Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求,只有当CGI程序运行时才fork出一个新的进程来执行。因此本文选择Boa来实现家庭网关的Web服务器。Boa开放源代码,可以通过互联网免费下载。

2.3 Boa服务器的实现原理

Web服务器监听用户端的服务请求,根据用户请求的类型提供相应的服务。用户端使用Web浏览器和Web服务器进行通信。服务器主进程监听设定的端口,一旦有浏览器的请求到达,则建立连接并返回新的套接口描述符,交由子进程处理。子进程读取请求并分解出URL、请求方法,再由所请求文件扩展名对应的MIME类型判断,如是静态文本则直接读取并发送给浏览器;如是CGI脚本,则新开一个子进程执行该脚本,处理脚本运行结果,并返回浏览器;在一定时延后无后续请求则关闭该连接。其工作流程如图1所示。

 

2.4 Boa服务器在基于S3C2410嵌入式Linux平台上的配置

步骤如下:

下载boa源码(boa-0.94.13.tar.gz):下载地址http://www.boa.org,进行解压:#tar zxvf boa0.94.13.tar.gz

生成Makefile文件

#cd boa-0.94.13/src

#./configure

修改Makefile文件

修改CC=gccCC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc

修改CPP=gcc-ECPP=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc-E并保存退出

运行make进行编译,得到可执行程序boa

# make

#/opt/host/armv4l/bin/armv4l-unknown-

linux-strip boa

/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。在Boa源码目录下已有一个示例boa.conf。复制到boa目录下即可。

修改boa.conf文件:

a.Group nogroup修改成Group 0,/etc/passwd中有nobody用户,所以User nobody不用修改;

 

b.ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/修改成ScriptAlias /cgi-bin//var/www/cgi-bin/;

c.修改#ServerName http://www.your.org.here/ServerName http://www.your.org.he re/

注意:该项默认为未打开,执行Boa会异常退出,提示gethostbynam e::No such file or directory,所以必须打开,其他默认设置即可。

boa的执行

还需要创建日志文件所在目录/var/log/boa,创建HTML文档的主目录/var/www,将静态网页存入该目录下,创建CGI脚本所在目录/var/www/cgi-bin,cgi的脚本存放在该目录下。另外还要将mime.types文件复制到制作的根文件夹的/etc,通常可以从linux主机的/etc目录下直接复制即可。最后将boa-0.94.13下的boa可执行文件拷贝到bin下面。

3 CGI工作原理的解析

CGI(Common Gateway Interface)又称通用网关接口,是一个外部应用与信息服务器(HTTPWeb服务器)之间的标准接口,按照CGI标准编写的外部扩展程序能够处理客户端浏览器输入的数据,从而完成客户端与服务器的交互,实现动态Web技术。其原理图如图2所示。

html表单

开始编写CGI程序前都要为它制作一个界面,即在Web页面上制作一个将用于为相应CGI程序收集数据的表单(Form)HTML(超文本描述语言)表单是WWW从客户端向Web服务器上的CGI程序传送数据的基本方法,关于HTML表单的制作方法我们就不详细阐述了。

 

MIME类型

理解MIME类型对于编写各种类型的CGI应用程序是非常重要的。MIME(Multipurpos e Internet Mail Extensions)实际上是一个技术规范,它定义了七种在国际互联网Internet上传送的基本数据类型:TextMultipartMessageApplicationImageAudioVideo,每种基本类型又可以分成几种子类型。由于MIME实用的方便性和灵活性,它最终被万维网系统采纳用来定义Web服务器传送的信息类型和Web浏览器可以接收的信息类型,目前MIME已成为Web服务器和Web浏览器互相沟通的一种重要机制。在Web浏览器和Web服务器双方互相发送请求信息时,都应该包含对方所能处理的MIME类型。如Web服务器传送的是一Web网页,在服务器向Web浏览器发送的头信息中,必须包含如下的字符串:Content-type:text/html

③向CGI程序传送表单数据的两种方法:GETPOSTGET是缺省的方法。当用GET方法传递数据时,浏览器首先将表单中用户输入的数据URI译码(URIEncoding)成“NAME = VALUE”的形式,各个“NAME=VALUE”对之间用“&”分开,NAMEVALUE就是表单中各个元素的属性,其中VALUE属性存放用户的输入数据。完成URI译码以后,浏览器将这些被译码以后的数据放在由表单的属性ACTION定义的URI后面传给Web服务器,两者之间用“?”分开。服务器最终将被译码以后的客户端输入数据放在环境变量QUERY STRING,CGI程序可以通过存取该环境变量的值获取客户端用户的输入。

对于POST方法,浏览器则是在向服务器传递了所有的HTTP头信息后,再将URI译码以后的表单数据单独作为一个整体传送给服务器,服务器接收以后再将它放在标准输出也就是CGI程序的标准输入中。POSTGET方法都采用相同的译码方法。

URI译码

无论是GET方法还是POST方法传送的数据都要进行URI译码。理解URI译码对于我们进行CGI编程是非常重要的。URI译码的步骤如下:a.浏览器将所传送的数据根据表单所包含的元素分解成“NAME=VALUE”的形式,其中VALUE属性中存储客户端在表单中输入的数据,如果客户端没有输入数据,VALUE存储的是表单定义的缺省值,如果缺省值也没有定义,VALUE值为空。b.表单中各元素的各个“NAME=VALUE”对被浏览器用“&”连接起来。c.VALUE属性中存放的数据若含有空格,则被转换成“+”。d.URI和输入数据中所包含的Web系统的保留字符必须被译码成它们的十六进制数的形式。e.被译码后的字符被表示成一个“%”加上它们的十六进制数形式(%HH)。如将“=”转换成“%3D”等等。

URI解码

CGI程序从环境变量QUERY STRING或标准输入中读入的数据是经过浏览器URI译码的,在使用这些数据之前还必须对它们进行URI解码。解码的目的就是将数据还原成客户在Web页面上输入时的形式。解码步骤如下:a.从浏览器用GETPOST方法所传送过来的数据中找出代表各个表单元素所储存数据“NAME=VALUE”对。b.VALUE属性中存放的数据若含有“+,则被转换成空格。c.VALUE属性中存放的数据中的十六进制数“%HH”转换成相应的字符。

 

⑥利用CGI程序生成HTTP头信息

通常,Web服务器收到一个浏览器发来的某一URI请求后,将根据在服务器上的搜索结果,向浏览器发回一个HTTP响应头。这个HTTP响应头中的信息将告诉浏览器所请求的资源是否存在,当前服务器所用的协议、版本号、所传送信息的MIME类型和服务器所使用的软件等一些信息,最后服务器才将浏览器所请求的资源传送给浏览器。

4 实验测试

实验以电视机的状态查询和修改为例。实验准备工作:编写index.html等页面放置到/var/www,编写C程序tvchange.ctv.c,并交叉编译生成相应的cgi程序,存放到/var/www/cgi-bin中。

我们用ifconfig命令设置目标板的IP地址192.168.0.20,目标板bin目录下启动Boa服务器,在任意一个客户端Web浏览器下输入http://192.168.0.20/index.html后即可进入到家庭网关用户登录界面中,输入用户名密码无误后进入网关主页面。

在此主页面中点击“电视机”链接进入到电视机的状态查询和修改页面,如图3,在此页面中通过链接可进入到电视机的状态修改页面,如图4,然后就可以对电视机的“开关、频道和音量”这三个属性分别进行操作,操作完成后按保存按钮提交操作结果,服务器自动调用已编写好的tvchange.cgi程序执行相应操作。

通过点击“电视机状态查询”链接可登录状态查询页面进行查询,此时调用预先编写好的tv.cgi程序,查询出文件中所保存的刚才修改后的状态,可看出查询的结果正是刚才我们操作后的结果,从而实现了我们对电视机状态的修改与查询功能,查询结果见图5

 

此实验充分地验证了Boa服务器和cgi程序相应的功能。

5 结束语

家庭网关Web服务器从本质上来说就是一段能响应Web浏览器请求的程序,使得用户可以通过Internet访问和控制家用电器,灵活地监控家用电器的运行状态,实现了浏览器和嵌入式服务器之间的动态交互。本文详细阐述了Boa服务器的工作原理和配置方法以及CGI程序的原理,在掌握了这些原理之后,就可以在嵌入式Web服务器环境下编写CGI程序,实现预期的功能。这种嵌入式Web服务器方案经过简单的功能扩展不仅可以广泛应用在智能家电的远程控制,而且还能应用在嵌入式GSM短消息平台、自动化设备远程监控以及远程家庭医疗等领域,具有广泛的应用前景。

深圳市中电网络技术有限公司 Copyright© www.52solution.com 粤ICP备10202284号