1.引言
Server一般有两种含义,一种是表示硬件,通常是指那些具有较高计算能力,能够提供给多个用户使用的计算机。另外一种含义是表示软件程序,这种程序主要用来对外提供某些服务,比如邮件服务、数据库服务、域名服务、网页服务等。
本篇介绍的是软件层面的Server,WebServer是指能够供 Web 服务的 Server,它的主要功能是提供网上信息浏览服务。嵌入式WebServer,是在嵌入式系统上运行的,可以通过浏览器去访问,对硬件要求会低一点。我们常用的家用路由器,就是一个典型的应用,通过Web界面直接进行访问和配置设备,非常便利。
嵌入式WebServer有很多中,比如BOA、shttpd、lighttpd、goahead、appweb和apache等。本篇以thttpd()为例,来进行介绍。
2.环境介绍
2.1.硬件
NUC972开发板
2.2.软件
1) Uboot继续使用之前文章用的,无须改动。
2) Kernel在上一篇基础上,无须改动。
3) Rootfs在上一篇用Buildroot生成的基础上,需要做一定的改动,用来生成thttpd。
3.Buildroot配置
Buildroot里需要做一定的配置,用来支持thttpd,只需要把Target packages- Networking applications中的thttpd选中即可
之后保存,编译即可。我们只需要用到下面两个文件
/output/target/usr/sbin/thttpd
/output/build/thttpd-2.25b/contrib/redhat-rpm/thttpd.conf
我们只需要将上述生成的thttpd直接放到板子的/usr/sbin目录里(注意要修改它的可执行权限)即可,将thttpd.conf放到/etc目录中。
4.thttpd基础功能
4.1 显示静态界面
开启thttpd服务器可以使用配置文件的方式,或者直接跟运行选项。我们以配置文件为例。
使用配置文件的方式如下:
使用 vi 打开 thttpd.conf 文件,并进行修改,我们将chroot注释掉,同时将"user=httpd"改为"user=root"
dir=/home/httpd/html
#chroot
user=root# default = nobody
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
# This section _documents_ defaults in effect
# port=80
# nosymlink# default = !chroot
# novhost
# nocgipat
# nothrottles
# host=0.0.0.0
# charset=iso-8859-1
注意上述dir=/home/httpd/html 这个目录是用来存放html文件的,所以我们需要新建这三个目录
# cd /
# mkdir /home /home/httpd /home/httpd/html
切换到 /home/httpd/html 目录下,并新建一个 index.html 文件,为什么名字叫index,我也不清楚,猜测是webserver程序里指定的,因为我试了换成其他的名字是无法正常工作的。
# cd /home/httpd/html
# vi index.html
内容为:
Hello TopSemic Friends!
保存,退出。
之后启动thttpd
# thttpd -D -C /etc/thttpd.conf &
最后就可以在访问了,在浏览器中输入192.168.0.100,显示如下:
index.html 中的内容简单介绍下,
….
,表示标题,定义最大的标题。
定义最小的标题。
Html文件中的
含义可以参考:
参数具体含义可以在这里查询。
4.2 CGI示例
CGI是实现web交互的一个比较早的,支持任何语言。依赖于web服务器使用。整体上的结构如图所示:
CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互,也就是CGI程序接受Web浏览器发送给Web服务器的信息进行处理,将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工作。CGI程序可以用任何程序设计语言编写,如Shell脚本语言、Perl、Fortran、Pascal、C语言等。但是用C语言编写的CGI程序具有执行速度快、安全性高(因为C语言程序是编译执行且不可被修改)等特点。
CGI接口标准包括标准输入、环境变量、标准输出三部分。
CGI文件并不要求是以.cgi或.CGI为后缀的文件,只要生成它的.c文件按照下面的格式来就行了。例如test.c
#include #include int main(int argc, char *argv[]){printf("Content-type:text/html");printf("");printf("An html page from a cgi");printf("");printf("
TopSemic CGI Example
");printf("");printf("");fflush(stdout);return 0;}
它是以printf("Content-type:text/html");开始,这是必须的。然后前后分别以printf("");和printf("");作为开始和结束,中间可嵌入我们自己处理的代码。
然后arm-linux-gcc test.c -o test.cgi就行了,如果编出来的test没有可执行权限,需要执行chmod +x test.cgi,然后将此文件放到服务器的根目录,如前面例子所示的/home/httpd/html/目录。
另外需要在上面的配置文件基础上,加上一句cgipat=test.cgi,重启启动thttpd。
dir=/home/httpd/html
#chroot
user=root# default = nobody
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
cgipat=test.cgi
这样就可以在浏览器中访问了,格式为 IP/test.cgi,如"192.168.0.100/test.cgi"。访问这个文件的效果如下图所示
备注:
如果无法访问,可能需要清除浏览器cookie/缓存
4.3 CGI与按钮结合
前面介绍访问CGI文件可以通过[IP]/[CGI文件名]这种格式来实现,如果我们在主页(index.html)上点击某个按钮,它能从192.168.0.100跳转到192.168.0.100/test.cgi,即可把按钮与用C语言生成的CGI文件贯通起来。实现这一点的关键在于html中form表单中的action。如下例所示,action="test"
Test PageTest Button
在此页面中,有一个名为Query的按键,点击下它,页面就会从192.168.50.10跳转到192.168.50.10/test.cgi,并在thttpd服务器的根目录找名为test的文件,查看它是否为cgi文件,如果是cgi文件,即执行它。
5.控制LED灯
我们要实现的功能是:
点击ON按钮点亮LED,点击OFF按钮关闭LED,具体实现方法如下:
1) 建立index.html文件
Test PageTopSemic LED Example
LED D3:
2)修改配置文件
cgipat=led-on.cgi|led-off.cgi
3) cgi文件
led-on.c,交叉编译生成led-on.cgi
#include #include #include // Operation of LED D2#define EXPORT_GPIO "echo 37 > /sys/class/gpio/export"#define GPIO_OUTPUT "echo out > /sys/class/gpio/gpio37/direction"#define TURNON_LED "echo 0 > /sys/class/gpio/gpio37/value"#define TURNOFF_LED "echo 1 > /sys/class/gpio/gpio37/value"void InitLED(){system(EXPORT_GPIO);system(GPIO_OUTPUT);}void TurnOnLED(){system(TURNON_LED);}void TurnOffLED(){system(TURNOFF_LED);}int main(void){printf("Content-type:text/html");printf("");InitLED();TurnOnLED();printf("");printf("