嵌入式Linux webserver: Boa+CGI程序设计技术[转]
摘要:在详细介绍一种嵌入式Web服务器BOA的实现与配置方法的基础上,以一个Web在线远程监控GPIO(通用输入/输出)的程序为实例,介绍嵌入式Linux系统下CPU程序设计技术。
首先,需要把BOA编译到内核,即执行make menuconfig,在应用程序选单中network application项下面选择boa。该操作需要重新编译内核。
ScriptAlias/cgi-bin/home/httpd/cgi-bin/
ScriptAlias/index.html/home/httpd/index.html
它指定了HTML页面必须放到/home/httpd目录下,cgi外部扩展程序必须放到/home/httpd/cgi-bin目录下。
CC=/LinuxPPC/CDK/bin/powerpc-linux-gcc
CPP=/LinuxPPC/CDK/bin/powerpc-linux-g++
然后直接在boa/src目录下执行make,即可生成BOA可执行文件;将其编译入内核,并烧写到存储设备,就可以实现访问BOA服务器。
标签将被替换为“%0D%0A”。
因为表单输入信息都是经过编码后传递给脚本程序的,所以CGI扩展程序在使用这些参数之前必须对它们进行解码。
服务器程序可以通过三种途径接收信息:环境变量、命令行和标准输入。具体使用哪一种方法要由<form>标签的METHOD属性来决定。
下面结合Web远程监控ARM芯片的GPIO(通用输入/输出)的应用实例详细介绍。
variable1=value1&variable2=value2&etc
CGI程序必须检查REQUEST_METHOD环境变量以确定是否采用了POST方法,并决定是否要读取STDIN。POST方法在HTML文档中定义的表单如下:
<form METHOD=POST ACTION="/cgi-bin/cgi_gpio.cgi">
NAME="cancel"TYPE=reset value="RESET">
它调用的服务器脚本程序是/cgi/bin/cgi_gpio.cgi。CGI扩展程序中form表单的解码可参考如下程序:
postinput=getenv("CONTENT_LENGTH");//获取传送给程序数据的字节数
if(!content_length=atoi(postinput))) //获取信息长度
if(!(postinput=(char*)malloc(content_length+1)))
if(!fread(postinput,content_length,1,stadin))
postinput[content_length]='0';
pairlist=(char **)malloc(256*sizeof(char **));
nvpair=strtok(postinput,"&");//从出现“&”字符的位置把信息分段,然后对结果依次处理
pairlist[paircount++]=strdup(nvpair);
pairlist=(char**)realloc(pairlist,(paircount+256)*sizeof(char**));
postvars=(char**)malloc((paircount*2+1)*sizeof(char **));
if(eqpos=strchr(pairlist[i],'=')){
unescape_url(postvars[i*2+1]=strdup(eqpos+1));//调用unescape_url函数继续解码
unescape_url(postvars[i*2+1])=strdup(""));
其中,unescape_url函数再调用x2c函数,把(不是字节或数字的)特殊字符从其%HH表示方式解码为文本字符。
static void unescape_url(char *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技术将得到更为广泛的应用和发展。