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十六进制值。
标签将被替换为“%0D%0A”。
信息是按它们在表单里呈现的顺序排列的。数据域的姓名和数据域的值经过等号(=)字符连在一起。各对名/值再经过“&”字符衔接在一起。经过这些编码处理之后,表单信号就整个成为一个接连的字符流,里边包括着将被送往服务器的悉数信息。
由于表单输入信息都是经过编码后传递给脚本程序的,所以CGI扩展程序在运用这些参数之前有必要对它们进行解码。
3.2 CGI外部扩展程序编制
服务器程序能够经过三种途径接纳信息:环境变量、指令行和规范输入。具体运用哪一种办法要由
标签的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文档中界说的表单如下:
Operate P0
Operate P1
Operate P2
NAME=“cancel”TYPE=reset VALUE=“RESET”》
它调用的服务器脚本程序是/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
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表明办法解码为文本字符。
(3)直接URL加参数传递办法
这是一种不运用表单就能够向CGI传送信息的办法。它把信息直接追加在URL地址后边,信息和URL之间用号号(?)来分隔。例如,关于一个cgi_gpio.cgi的脚本,能够从如下的链接发动:
/*cgi-bin/cgi_gpio.cgi?flag=1 Operate P1
.
.
.
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技能将得到更为广泛的运用和开展。
责任编辑:gt