CGI应用(1)

来源:互联网 发布:mac 中文乱码 编辑:程序博客网 时间:2024/05/16 02:43

最近在学习嵌入式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服务器




0 0
原创粉丝点击