基于BOA的嵌入式WEB SERVER的设计
随着网络技术的不断发展,网络现在已无处不在。Linux最大的好处在于其良好的网络功能,因此在该系统中,我们通过设计WEB 服务器,使用户能通过浏览器访问设备上的Web服务器来远程控制现场设备。嵌入式Linux下,系统资源是非常有限的,因此我们选择Web服务器时,要考虑到其资源有限的特点;Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行,Boa的设计目标是速度和安全。
现在,多数嵌入式Linux的代码中已经包含boa的源代码,在嵌入式Linux下实现Boa只需要对Boa做一些简单的配置和修改。这主要通过对boa.conf、boa.c、mime.types等文件进行修改来实现。服务器中主要包括Boa和CGI两部分,其中Boa管理着返回客户端的WEB页面,而CGI控制着客户端和服务器端的信息交换,所以我们可以通过编写相应的CGI程序来实现所需要的功能。Boa服务器的实现主要分为两步,boa服务器的移植和CGI程序的设计。
1 、boa 服务器移植
Boa服务器的移植主要分为以下步骤进行:
(1)首先下载boa源代码,网上有很多关于boa的源码下载网站,官方网址为:http://www.boa.org/;
(2)根据目标平台修改boa的配置文件boa.conf,以及相关的源代码文件boa.c,log.c。
(3)执行configure生成Makefile,并修改Makefile中CC和CPP等项,改成与目标平台对应的编译工具;
(4)交叉编译源代码,生成可执行文件boa;
(5)拷贝配置文件boa.conf和可执行程序boa到文件系统中。此时就可以在目标板中运行boa程序了。
下面具体介绍一下如何在ARM平台上移植boa服务器:
本系统中采用的boa源码是boa-0.94.13.tar.gz, 将下载的源码拷贝到工作目录解压。
# tar xzf boa-0.94.13.tar.gz(步骤1)
这里注意下系统中需要安装bison,flex等工具,如果在U-BOOT移植中已经在开发主机中安装过这些工具,则可以跳过这一步骤。如果没有,在UBUNTU系统中使用如下命令就可以自动安装:
#sudo apt-get install bison flex(步骤2)
如果不安装这些工具,在执行make生成可执行文件时会出现如下错误
make: yacc:comman not found
make: *** [y.tab.c] error 127
make: lex:comman not found
make: *** [lex.yy.c] error 127
解压完源代码后,我们进入boa目录,boa的所有源代码及编译文件都放在都放在/src下面,进入该目录
#cd /source/boa-0.94.13/src(步骤3)
相关文件的修改:
我们要做的是对该目录下一些源代码做相应的修改。
修改compat.h(步骤4)
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
将其修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
否则会出现错误:
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o]
修改log.c(步骤5)
将以下语句注释掉:
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
否则会出现错误:
log.c:73 unable to dup2 the error log:bad file deor
修改boa.c(步骤6)
注释掉下面两句话:
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
否则会出现错误:boa.c:211 - getpwuid: No such file or directory
注释掉下面语句:
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
否则会出现问题:boa.c:228 - icky Linux kernel bug!: No such file or directory
生成可执行文件BOA:
首先进入src目录,并执行configure文件,生成Makefile文件
#cd /source/boa-0.94.13/src
#./configure(步骤7)
生成完Makefile后,接下来要做的就是对其做相应的修改,因为我们对应的目标平台是ARM,所以我们要查看我们用到的交叉编译器设置是否正确,本实验中所要修改的具体参数为:
修改Makefile(步骤8)
修改CC = gcc 为 CC = arm-softfloat-linux-gnu-gcc
修改CPP = gcc -E 为 CC = arm-softfloat-linux-gnu-gcc -E
在确认以上修改正确后,我们在/src目录下就可以使用make命令来生成我们所需要的可执行文件boa了。
# make(步骤9)
对生成文件进程瘦身
#arm-softfloat-linux-gnu-strip boa(步骤10)
Boa的配置
在生成好boa以后,还要对boa的配置文件boa.conf做修改,在boa-0.94.13目录下已有一个示例boa.conf,可以在其基础上进行修改。修改boa.conf(步骤11)
#vi boa.conf
(1)Group的修改
修改 Group nogroup 为 Group 0
(2)user的修改
修改 User nobody为 User 0
(3) ScriptAlias的修改
修改ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 为ScriptAlias /cgi-bin/ /www/cgi-bin/
(5)DoucmentRoot的修改
修改DoucmentRoot /var/www 为DoucmentRoot /www
(6)ServerName的设置
修改#ServerName www.your.org.here
为 ServerName www.your.org.here
否则会出现错误“gethostbyname::No such file or directory”
(7)AccessLog修改
修改AccessLog /var/log/boa/access_log
为#AccessLog /var/log/boa/access_log
否则会出现错误提示:“unable to dup2 the error log: Bad file deor”
配置好boa.conf以后,我们将生成的boa以及修改好的boa.conf文件拷贝到文件系统中相应的目录中:
首先在目标板上创建目录/etc/boa并且把boa 和 boa.conf拷贝到这个目录下
mkdir /etc/boa(步骤12)
创建HTML文档的主目录/www
mkdir /www (步骤13)
创建CGI脚本所在录 /www/cgi-bin
mkdir /www/cgi-bin(步骤14)
以下步骤在ubuntu下进行:
将boa.conf拷贝到开发板根文件系统的/etc/boa下
#cp boa.conf /source/rootfs/etc/boa(步骤15)
将boa拷贝到开发板根文件系统的/etc/boa下
#cp src/boa /source/rootfs/etc/boa(步骤16)
将ubuntu下/etc/mime.types拷贝到开发板根文件系统的/etc下,mime.types的主要功能是控制从网络上发给宿主机端的媒体文件的类型,并且告诉宿主机怎么去处理这些数据。
#cp /etc/mime.types /source/rootfs/etc(步骤17)
这时,我们可以将一个测试网页拷贝到/www目录下,并在开发板上启动boa服务器
#cat index.html
Hello Boa!
# /etc/boa/boa (步骤18)
然后在宿主机下,打开浏览器输入开发板的IP地址,就可以看到存放在开发板中的测试主页了(显示 Hello Boa!),但此时我们点击页面上的按钮时不会执行任何相应,因为现在只是实现了简单的连接,网页并没有相应的CGI程序。在boa 服务器的设计中,最为关键的就是CGI程序的设计,通过CGI程序,就可以实现我们点击页面时所需要的功能。
2 、CGI程序设计
该系统所要实现的功能是让客户端使用浏览器向服务器发送HTTP请求,服务器响应客户端的请求后,并引导到指定的脚本程序,对命令进行解析,将信息交给后台——CGI去处理。CGI解析信息后,向远程设备发出控制信息。设备响应后,返回给CGI控制信息,CGI再将信息解析成变量输出到Web Server上,最后客户端得到WebServer发回的页面消息(HTML),就能得到现场设备的运行状态,实现对现场设备的远程监控。
该系统中设计的BOA 服务器的的主要功能如下图所示:
图1 系统功能实现流程图
CGI的程序编写包括两个部分: HTML代码和C代码; CGI程序与Boa Web服务器之间通过环境变量、命令行参数和标准输入等方式进行通信。本设计中采用的表单编码信息通过环境变量QUERY_STRING传递。在编写CGI程序时,需要注意:
◆REQUEST_METHOD
前面介绍过,请求方法有两种:GET和POST。在实验中,选择GET方法。
如在showsetip()中的代码:
<meta http-equiv=pragma content=no-cache>
<meta http-equiv=expire content=now>
<form method=get action=/cgi-bin/config.cgi>
◆环境变量
在选用不同的方法时,所对应的环境变量也不同。选择GET时,所对应的环境变量是QUERY_STRING,通过调用库函数getenv()来得到环境变量的具体值,即querystring=getenv(QUERY_STRING)。系统功能框架图如下:
3、Boa服务器测试
出自:http://wenku.baidu.com/view/005cc4232f60ddccda38a00b.html
补充:(CGIC) 1.从CGIC的主站点http://www.boutell.com/cgic/下载源码,将其解压并进入源码目录 # tar -zxvf cgic205.tar.gz # cd cgic205 2.修改Makefile文件 a.找到CC=gcc,将其改成CC=arm-linux-gcc b.找到AR=ar,将其改成AR=arm-linux-ar c.找到RANLIB=ranlib,将其改成RANLIB=arm-linux-ranlib e.找到gcc cgictest.o -o cgictest.cgi ${LIBS} 将其改成$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS} f.找到gcc capture.o -o capture ${LIBS} 其改成$(CC) $(CFLAGS) capture.o -o capture ${LIBS} 保存退出 3.然后运行make进行编译,得到的CGIC库libcgic.a,我们通过调试 辅助程序capture和测试程序cgictest.cgi,来验证生成CGIC库的正确性。 将capture和cgictest.cgi拷贝到主机的/var/www/cgi-bin目录下。 在工作站的浏览器地址栏输入http://192.168.0.12/cgi-bin/cgictest.cgi,可以看到页面,CGIC库和测试脚本都移植成功。 |