最近在学习嵌入式WEB服务器的移植,对于BOA服务器的移植,网上的文章很多,大家可以直接搜索嵌入式BOA服务器的移植;
对于一个移植好的WEB服务器,例如BOA服务器,如何通过网页实现对板子的控制功能呢,这就需要CGI了,具体来说,CGI(common getway interface)就是运行在WEB服务器之外的供服务器调用的程序。它与服务器配合使用,可以让服务器具有更强大的功能。
下面学习如何使用CGI?(利用网页控制LED)
1.移植CGI库:cgi205.tar.gz(注意修改MAKEFILE文件) 工具链使用arm-linux-
2.执行make 生成libcgic.a.将该库放置在开发板根文件系统中lib目录下
3.修改BOA的配置文件,打开/etc/boa/boa.conf 文件。找到:ScritAlias /cgi-bin/ /usr/lib/cgi-bin/ 这行配置程序为了指明我们的CGI程序放在哪个位置;我们将其修改为:ScriptAlias /cam /web/cma/ 我们将编译好的CGI程序都放到开发板的/web/cma目录
4.修改网页文件:加入相应的目录:<a class = "menu" hvef = "/led.html">
LED控制
5.打开led.html
需要注意两点:1.当我们填写参数之后提交之后,调用相应的CGI程序:<form action-“/cam/lcd.cgi”method-“get”>,我们待会编译好的CGI程序将要放在/cam/目录下,并取名为lcd.cgi.
2.参数问题,这里有两个参数“led_control”“led_status”(跳转页面)
??思考,这两个变量如何传过去的?
这两个参数变量通过跳转地址传过去,这样CGI程序就可以将这两个参数从这个地址处取出来
6.程序编写
Touch led.c 修改权限
打开文件led.c,编写控制程序。
控制LED
#include <stdio.h>
#include <stdlib.h>
int main()
{
intfd;
intled_control, led_state;
fd= open("/dev/leds0", 0);
ioctl(fd,led_state, led_control);
closefd;
}
编写好led.c程序之后,面临的问题:如何获取两个参数:led_control,led_state;
从地址信息可以拿到这两个参数:
环境变量保存在QUERY_STRING(字符串)
获取参数:
#include <stdio.h>
#include <stdlib.h>
int main()
{
intfd;
intled_control, led_state;
char*data;
/*获取环境变量 */
data= getenv("QUERY_STRING");
/*将有用的信息剥离出来 使用格式化输入函数sscanf */
sscanf(data,"led_coontrol=%d&led_state=%d",&led_control,&led_state);
fd= open("/dev/leds0", 0);
ioctl(fd,led_state, led_control);
closefd;
return0;
}
在页面中显示控制LED结果的信息:(在网上搜索CGI简明教程,学习如何编写CGI程序)。
#include <stdio.h>
#include <stdlib.h>
int main()
{
intfd;
intled_control, led_state;
char*data;
/*构造一个反馈页面给用户看*/
cgiHeaderContentType("text/html");
fprintf(cgiOut,"<HTML><HEAD>\n");
fprintf(cgiOut,"<TITLE>LED CGI</TITLE></HEAD>\n");
fprintf(cgiOut,"<BODY>");
fprintf(cgiOut,"<H1>LED_CONTROL OK </H1>");
fprintf(cgiOut,"</BODY>\n");
fprintf(cgiOut,"</HTML>\n");
/*获取环境变量 */
data= getenv("QUERY_STRING");
/*将有用的信息剥离出来 使用格式化输入函数sscanf */
sscanf(data,"led_coontrol=%d&led_state=%d",&led_control,&led_state);
fd= open("/dev/leds0", 0);
ioctl(fd,led_state, led_control);
closefd;
return0;
}
7.编译:
#arm-linux-gcc –L ./cgi205/ -lcgic –I ./cgic205/ led.c –o led.cgi
-L:指明cgi库的地址; -lcgic:指明cgic这个库 -I:指明头文件
编译过程遇到的问题:将main->cgiMain
产生led.cgi
将led.cgi放入/web/cma/目录
8.打开开发板运行WEB服务器