Boa Porting and Test

基于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 服务器的的主要功能如下图所示:

clip_image002[6]

图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)。系统功能框架图如下:

clip_image004[10]

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库和测试脚本都移植成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值