您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

嵌入式Linux体系CGI步调筹划技能

发布日期:2011-05-10


    择要:
在过细先容一种嵌入式Web办事器BOA的实现与配置要领的底子上,以一个Web在线长途监控GPIO(通用输入/输出)的步调为实例,先容嵌入式Linux体系下CPU步调筹划技能。
    关键词:嵌入式体系Linux BOA CGI GPIO

    1 概述

    随着互联网应用的广泛,越来越多的信息化产品须要接入互联网通过Web页面举行长途访问。嵌入式Web体系提供了一种经济、实用的互联网嵌入式接入方案。这里连合一种嵌入式Web Server BOA来先容嵌入式Linux体系下的CGI步调筹划技能。

    2 Web Server BOA的实现与配置

   
2.1 uClinux下,紧张有三个Web Server:HTTPD、THTTPD和BOA。HTTPD是最大抵的一个Web Server,它的结果最弱,不支持认证,不支持CGI。THTTPD和BOA都支持认证、CGI等,结果都比较全。BOA是一个单任务的小型HTTP办事器,源代码开放、性能精良,分外得当应用在嵌入式体系中。如今的uClinux的代码中已经包括BOA的源代码。在uClinux下实现BOA,只须要对BOA做一些配置和修改。以下是配置的进程。

    (1)编译BOA到内核

起首,须要把BOA编译到内核,即实行make menuconfig,在应用步调菜单中network application项下面选择boa。该利用须要重新编译内核。

(2)方法配置文件boa.conf

在Linux利用体系下,应用步调的配置都因此配置文件的情势提供的,一样通常都是放在目标板/etc/目次下大概/etc/config目次下。但boa的配置文件boa.cont一样通常都旋转在目标板/home/httpd/目次下。

比喻,一个典范的boa.conf文件格局如下:

ServerName Samsung-ARM

DocumentRoot/home/httpd

ScriptAlias/cgi-bin/home/httpd/cgi-bin/

ScriptAlias/index.html/home/httpd/index.html

它指定了HTML页面必须放到/home/httpd目次下,cgi外部扩展步调必须放到/home/httpd/cgi-bin目次下。

(3)编译烧写内核

重新编译内核后,通过烧写东西烧写内核,就可以在PC上通过IE欣赏器访问开辟板上的Web Server。比喻,输入开辟板的IP地点http://192.168.0.101,即可访问到本身做的网页index.html了。并且,通过编写CGI外部扩展步调,可以实现动态Web技能,下面将过细先容。

2.2 具有MMU平台的Linux下B0A的实现与配置

敷衍有MMU(内存办理单位)的平台,如armlinux和ppclinux,可以到网上下载一个主流版本的boa发行包。由于是运行在目标体系,以是要用交错编译东西编译,即须要修改boa/src/Makefile内里的编译器。比喻:

CC=/LinuxPPC/CDK/bin/powerpc-linux-gcc

CPP=/LinuxPPC/CDK/bin/powerpc-linux-g++

然后直接在boa/src目次下实行make,即可天生BOA可实行文件;将其编译入内核,并烧写到存储配置,就可以实现访问BOA办事器。

    3 CGI步调筹划技能

CGI(Common Gateway Interface)是外部应用扩展应用步调与WWW办事器交互的一个标准接口。根据CGI标准编写的外部扩展应用步调可以处理惩罚处罚客户端欣赏器输入的数据,从而完成客户端与办事器的交互利用。而CGI典范就定义了Web办事器怎样向扩展应用步调发送消息,在收到扩展应用步调的信息后又怎样举行处理惩罚处罚等内容。通过CGI可以提供很多静态的HTML网页无法实现的结果,比如搜刮引擎、基于Web的数据库访问等等。

3.1 变乱原理

(1)WWW和CGI的变乱原理

HTTP协议是WWW的底子,它基于客户/办事器模型,一个办事器可以为散布在网络中处的客户提供办事;它是创建在TCP/IP协议之上的“无连接”协议,每次连接只处理惩罚处罚一个恳求。在办事器上,运行产着一个保卫进程对端口举行监听,等待来自客户的恳求。当一个恳求到来时,将创建一个子进程为用户的连接办事。根据恳求的差别,办事器返回HTML文件大概通过CGI调用外部应用步调,返回处理惩罚处罚结果。办事器通过CGI与外部步调和脚本之间举行交互,根据客户端在举行恳求时所采取的要领,办事器会网络客户所提供的信息,并将该部分信息发送给指定的CGI扩展步调。CGI扩展步调举行信息处理惩罚处罚并将结果返回办事器,然后办事器对信息举行阐发,并将结果发送回客户端。

外部CGI步调与WWW办事器举行通讯、转达有关参数和处理惩罚处罚结果是通过环境变量、下令行参数和标准输入来举行的。办事器提供了客户端(欣赏器)与CGI扩展步调之间的信息互换的通道。CGI的标准输入是办事器的标准输出,而CGI的标准输出是办事器的标准输入。客户的恳求通过办事器的标准输出发送给CGI的标准输入,CGI对信息举行处理惩罚处罚后,将结果发送到它的标准输入,然后由办事器将处理惩罚处罚结果发送给客户端。

(2)URL编码

客户端欣赏器向办事器发送数据采取编码的情势举行。该编码便是CRL编码。编码的紧张变乱是表单域的名字和值的转义,细致的做法为:每一对域和值里的空格都市被调换为一个加号(+)字符,不是字母或数字的字符将被调换为它们的十六进制数字情势,格局为%HH。HH是该字符的ASCII十六进制值。<BR>标记将被调换为“%0D%0A”。

信息是按它们在表单里出现的序次分列的。数据域的名字和数据域的值通过等号(=)字符连在一起。各对名/值再通过“&”字符连接在一起。颠末这些编码处理惩罚处罚之后,表单信号就整个成为一个连续的字符流,内里包括着将被送往办事器的全部信息。

由于表单输入信息都是颠末编码后转达给脚本步调的,以是CGI扩展步调在利用这些参数之前必须对它们举行解码。

3.2 CGI外部扩展步调方法

办事器步调可以通过三种途径汲取信息:环境变量、下令行和标准输入。细致利用哪一种要领要由<FORM>标记的METHOD属性来决定。

在“METHOD=GET”时,向CGI步调转达表单编码信息的正常做法是通过下令来举行的。大多数表单编码信息都是通过QUERY_STRING的环境变量来转达的。要是“METHOD=POST”,表单信息将通过标准输入来读取。另有一种倒霉用表单就可以向CGI发送信息的要领,那便是把信息直接追回在URL地点反面,信息和URL之间用问号(?)来退出。

下面连合Web长途监控ARM芯片的GPIO(通用输入/输出)的应用实例过细先容。

(1)GET要领

GET要领是对数据的一个恳求,被用于得到静态文档。当利用GET要领时,CGI步调将会从环境变量QUERY_STRING获取数据。为了处理惩罚处罚客户真个恳求,CGI必须对QUERY_STRING中的字符串举行阐发。当须要从办事器获取数据并且稳固革办事器上的数据时,应该选用GET要领;但是要是恳求中包括的字符串超过跨过了肯定长度,一样通常是1024字节,那么就只能选用POST要领。GET要领通过附加在URL反面的参数发送恳求信息。这些参数将被放在环境变量QUERY_STRING中传给CGI步调。GET要领的表单格局和CGI解码步调可以参考POST要领的实现。

(2)POST要领

当欣赏器将数据从一个填写的表单传给办事器时一样通常采取POST要领,并且在发送的数据超过跨过1024字节时也必须采取POST要领。当利用POST要领时,Web办事器向CGI步调的标准输入STDIN发送数据。发送的数据长度存在环境变量CONTENT_LENGTH中,并且,POST要领的数据格局为:

variable1=value1&variable2=value2&etc

CGI步调必须查抄REQUEST_METHOD环境变量以确定是否采取了POST要领,并决定是否要读取STDIN。POST要领在HTML文档中定义的表单如下:

<FORM METHOD=POST ACTION="/cgi-bin/cgi_gpio.cgi">

<INPUT TYPE="RADIO"NAME=rb VALUE="0">Operate P0<BR>

<INPUT TYPE="RADIO"NAME=rb VALUE="1">Operate P1<BR>

<INPUT TYPE="RADIO"NAME=rb VALUE="2">Operate P2<BR>

<INPUT NAME="ok"TYPE=submit VALUE="OK"><INPUT>

NAME="cancel"TYPE=reset VALUE="RESET"></FORM>

它调用的办事器脚本步调是/cgi/bin/cgi_gpio.cgi。CGI扩展步调中FORM表单的解码可参考如下步调:

/*function getPOSTvars*/

char **getPOSTvars(){

int i;

int content_length;

char **postvars;

char *postinput;

char **pairlist;

int paircount=0;

chr *nvpair;

char *eqpos;

postinput=getenv("CONTENT_LENGTH");//获取发送给步调数据的字节数

if(!postinput)

exit();

if(!content_length=atoi(postinput))) //获取信息长度

exit(1);

if(!(postinput=(char*)malloc(content_length+1)))

exit(1);

if(!fread(postinput,content_length,1,stadin))

exit(1);

postinput[content_length]='0';

for(i=0;postinput[i];i++)

if(postinput[i]=='+')

postinput[i]=''; //对加易举行处理惩罚处罚

pairlist=(char **)malloc(256*sizeof(char **));

paircount=0;

nvpair=strtok(postinput,"&");//从出现“&”字符的位置把信息分段,然后对结果依次处理惩罚处罚

while (nvpair){

pairlist[paircount++]=strdup(nvpair);

if(!(paircount%256))

pairlist=(char**)realloc(pairlist,(paircount+256)*sizeof(char**));

nvpair=strtok(NULL,"&");

}

pairlist[paircount]=0;

postvars=(char**)malloc((paircount*2+1)*sizeof(char **));

for(i=0;i<paircount;i++){

if(eqpos=strchr(pairlist[i],'=')){

*eqpos='0';

unescape_url(postvars[i*2+1]=strdup(eqpos+1));//调用unescape_url函数连续解码

}else{

unescape_url(postvars[i*2+1])=strdup(""));

}

postvars[paircount*2]=0;

for(i=0;pairlist[i];i++)

free(pairlist[i]);

free(pairlist);

free(postinput);

return postvars;

}

此中,unescape_url函数再调用x2c函数,把(不是字节或数字的)分外字符从其%HH表现要领解码为文本字符。

/*unescape_url function*/

static void unescape_url(char *url){

int x,y;

for(x=0,y=0;url[y];++x,++y){

if((url[x]=url[y])=='%'){

url[x]=x2c(&url[y+1]);

y+=2;

}

}

url[x]='0';

}

(3)直接URL加参数转达要领

这是一种倒霉用表单就可以向CGI发送信息的要领。它把信息直接追加在URL地点反面,信息和URL之间用号号(?)来退出。比喻,敷衍一个cgi_gpio.cgi的脚本,可以从如下的链接启动:

<A HREF=/cgi-gpio.cgi!?flag=0 Operate P0</A>

<A HREF>/*cgi-bin/cgi_gpio.cgi?flag=1 Operate P1</A>

<A HREF=/cgi-bin_gpio.cgi?flag=2 Operate P2</A>

.CGI扩展步调中可利用如下代码汲取信息:char *get_input;//用于汲取环境变量

.get_input=getenv(“QUERY_STRING”);

if(get_input){

get_input=strdup(get_input);

printf("QUERY_STRING if %s",get_input);

}

/*刚强flag=x信息*/

if(!strcmp(get_input,"flag=0")

...//Operate p0

else if(!strcmp(get_input,"flag=1")

...//Operate P1

else

...//Operate P2

敷衍上述三种要领,可以根据差别的应用场合和应用恳求举行选取。

    结语

嵌入式Web Server体系方案可以广泛应用在很多范畴,如主动化配置的长途监控、嵌入式GSM短消息 平台以及长途家庭医疗等。并且,随着互联网应用范畴的不绝深入,嵌入式Internet技能将得到更为广泛的应用和生长。