|
---Web Server实现
本篇主要讲uclinux下实现web-server方法,以及boa服务器和CGI程序相关知识.
本方案利用web-server实现局域网内设备的控制,通过浏览器控制LED,七段数码管等来作为演示.
实验环境:
硬件:
红色飓风 Red2-2c70
Flash:8M*16bit SDRAM:16M*32bit
软件:
Quartus8.0+Nios8.0+Vmware5.0/6.0+CentOS5.3+uClinux
相关概念:
1>.Web-server:
网页服务器,又称WWW服务器,提供网上信息浏览服务,可被不同终端的浏览器访问,提供相应服务.即Server作为一个数据载体,可以将本地的信息和数据通过网络传递给发出请求的客户,实现的基础是HTTP.
利用web-server可以屏蔽不同终端的影响,也可以通过网络实现远程数据传输,或是局域网内进行设备控制等.
2>.boa
uClinux下主要有三个Web-server: httpd, thttpd,boa.
其中httpd是最简单的,不支持认证,不支持CGI.
Boa和Thttpd都支持,而且功能都比较全.
这里我们选择源代码开放,性能可靠,稳定性好的boa作服务器,
缺点是,只支持单任务.
3>.CGI程序
CGI(Common Gateway Interface) 通用网关接口的简称.
主要用来处理用户请求,实现用户与服务器之间的交互.
实际上就是一段程序,运行在Server上,提供同客户端 Html页面的接口.
服务器提供了客户端(浏览器)和CGI扩展程式之问的信息交换的通道。客户通过浏览器发出请求,经过服务器的解释发出标准输出传送给CGI,或是说调用CGI程序,CGI对信息进行处理后,会将结果以标准输出的形式发回,服务器将处理结果以HTML的形式发送给客户端。
CGI程序可以用多种语言去写,比如Shell Script, C ,VB ,Perl,Fortran等,
但在uClinux下只能用C语言完成.
通常在Web网页中调用CGI程序有三种方法,表单,超链接或是SSI调用.
我们这里主要采用表单的调用方法 .
4>.表单
表单,即FORM,一种HTML语言格式,在网页主要负责数据采集的功能,比如采集访问者的名字和email地址、调查表、留言簿或是用户的选项等等.
详细语法格式,查阅HTML语言.
这里主要介绍表单里比较重要的几项属性:
ACTION="URL",指定一个方式来处理表单提交的数据,URL指向CGI程序的位置.
METHOD="GET|POST",指定HTTP提交数据的方法,GET或POST
表单域包含了文本框、多行文本框、密码框、隐藏域、复选框、单选框和下拉选择框等,用于采集用户的输入或选择的数据.
主要定义TYPE,NAME,VALUE等.
1. 硬件设计
硬件原理图如专题[2]中所示,
SOPC中加入要控制的LED,7-seg等.
2. 软件设计
2.1驱动
在网卡驱动已经OK的情况下,
确认<选择应用程序或库文件>下
<Network Applications>
<*>Boa
<*>dhcpcd-new
<*>inetd
Enable即可.
配置Boa服务器,使其支持CGI程序,打开boa.conf文件,确认下面信息是否正确:
port 80 //指明了访问的端口
MimeType /etc/mime.types //所支持的多媒体文件类型
DocumentRoot /home/httpd //CGI脚本的存放位置,
DirectoryIndex index.html //首页的位置名称
2.2建立静态网页
根据自己的需要,制作一个首页,本实验设计
Index.html就是首面,当浏览器访问服务器时,首先显示的页面.
新建一个首页,主要加入可搜集信息的FORM,则可以根据FORM所得到的数据,调用CGI程序,实现动态网页的功能.
参考FORM表单格式,这个是Test2的参考表单:
<P><strong><font color=blue>Test 2:Led seven seg run</strong>
<br>
<FORM. ACTION="/cgi-bin/cgi_demo" METHOD=GET>
<p><font color=black>Input the number:
<INPUT NAME="num" SIZE="7">
<INPUT TYPE="SUBMIT" VALUE="sent">
<INPUT TYPE="reset" VALUE="clear">
</FORM>
其中,
FORM. ACTION:定义脚本位置.
Method:定义数据获取方式
Input name: FORM变量名
之后的控制,无非就是对这些变量进行查询.
2.3 CGI程序
由于CGI程序是一个外部程序,所以系统要想运行它,
首先是CGI程序进行编译链接,生成一个可执行文件,存放于ROMFS文件夹中,最后与内核一起生成镜像.
修改位于 /uClinux-dist/user/cgi_generic下的CGI相关程序,
主要修改cgi.c和template.c
下面主要解释其中重要的C语句:
//获取提交表单的方法
Request_method = getenv(“REQUEST_METHOD”);//方法存于R_M字符串中
//发送MIME信息
Printf(“Content-type:text/html\n\n”);//必须两个回车,格式要求
//生成网页
void htmlHeader(char *title) {
printf("<HTML><HEAD><TITLE>%s</TITLE></HEAD>",title);
printf("<BODY>");
template_page(postvars, form_method); //主体内容
printf("</BODY></HTML>");
//template.c中控制7段数码管例子
const unsigned char ledval[10] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
option1 = getenv("QUERY_STRING"); //提交的内容存入缓冲区*option1
sscanf(option1,"num=%ld",&num); //num赋值
if(num>=0||num<=9)
{
printf("<p><font size=5>Display number is: %d \n<br><br></P>",num);
//WriteNios(LED_BASE,0x0000);
WriteNios(CS_SEG_BASE,0xff); //LED片选
WriteNios(LED_SEG_BASE,ledval[num]); //LED段选
}
利用cgi_generic文件夹中的makefile,直接make,
Make后会在romfs文件夹里自动生成CGI可执行文件,或是直接在uClinux-dist下make整个内核.
2.4 修改romfs下文件
当编译完后,在/romfs/home/httpd/cgi-bin下会生成新的CGI可执行文件,
再把刚新建好的index.html文件替换/httpd/index.html.