阶段2-新手上路\项目-移动物体监控系统\Sprint4-嵌入式web服务器开发\第2课-CGI快速入门-网页控制LED
CGI快速入门
用户通过浏览器把请求传递到web服务器,当web服务器收到请求,如果处理不了该请求,则它会去找帮手(CGI程序)来完成该请求任务。
CGI程序就是在服务器外部的供服务器调用的程序,当二者配合使用,使服务器的功能更加强大。
我们要编写CGI程序首先需要去移植CGI的库
修改Makefile
然后编译
然后把库libcgic.a拷贝到开发板里面/rootfs/lib/里面去
下面去修改boa的配置文件
ScriptAlias这个配置项是用来指明CGI文件是放在哪儿的,
led.html
下面是如何来编写CGI程序了,其实它就是通用的c程序,首先可以按照c程序的编写思路来编写它
touch led.c
#include<stdio.h>
#include<stdlib.h>
int main()
{
int fd;
char *data;
int led_control,led_state;
data = getenv("QUERY_STRING");
sscanf(data,"led_control=%d&led_state=%d",&led_control,&led_state);
fd = open("/dev/leds0",0);//假设我的led设备文件对应的驱动是/dev/leds0
ioctl(fd,led_state,led_control);
close(fd);
}
led_state和led_control这两个参数怎么来,是通过网页传递过来的,那么怎么传递过来的呢
这两个参数信息是保存在环境变量当中的,这个 环境变量叫做QUERY_STRING
那么就要从这个环境变量中去提取出我们要的那两个参数
首先要去获取到字符串,所以要先定义一个字符串,
char *data;
然后获取环境变量的值使用
data = getenv("QUERY_STRING");
那么环境变量的值就到data里面来了
其实data里面有很多信息,我们需要的只有两个,那么怎么具体把这两个给弄出来呢
使用格式化的输入sscanf
sscanf(data,"led_control=%d&led_state=%d",&led_control,&led_state);
目的是从data字符串里面找到引号里面的子串,然后把子串里面的参数提取到led_control以及led_state
那么这两个参数就拿到了。
当CGI运行完了之后,构造显示执行结果的信息
下面去输出主体body部分
最后是输出html的结束
当编写好led.c程序之后,要编译该程序
使用arm-linux-gcc来编译,因为要用到cgi的库,所以要去指明CGI库的地址(-L是指明CGI地址,-lcgic(指明具体的cgi库(libcgic.a)),-I指明头文件地址)
编译
把这个led.cgi放到开发板的web/cam/目录下,根据
放到相应下面去!!