zoukankan      html  css  js  c++  java
  • 基于boa服务器的web控制mini2440的GPIO口

    win7 系统  虚拟机:ubuntu12.04

    开发板:mini2440

    上一篇已经详细的讲解了如何配置boa服务器,在这里我们就要利用boa服务器带来的便利,利用web控制开发板上的GIPO口,这里控制led为例。

    首先了解下cgi编程

    CGI通用网关接口是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。 
    组成CGI通信系统的是两部分:

    一部分是html页面,就是在用户端浏览器上显示的页面。

    另一部分则是运行在服务器上的Cgi程序。 
    它们之间的通讯方式如下图: 


     
     服务器和客户端之间的通信,是客户端的浏览器和服务器端的http服务器之间的HTTP
    通信,我们只需要知道浏览器请求执行服务器上哪个CGI程序就可以了,其他不必深究细节,因为这些过程不需要程序员去操作。 
     服务器和CGI程序之间的通讯才是我们关注的。一般情况下,服务器和CGI程序之间是通过标准输入输出来进行数据传递的,而这个过程需要环境变量的协作方可实现。  
    1. 服务器将URL指向一个应用程序

    2. 服务器为应用程序执行做准备 

    3. 应用程序执行,读取标准输入和有关环境变量 

    4. 应用程序进行标准输出

    更详细的资料可以参考这篇文章:http://wenku.baidu.com/view/11eb19f90242a8956bece4c2.html

    在这里,我主要是熟悉下web控制led的开发步骤。

    首先建立index.html文件

    代码如下所示:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
    <title>web控制mini2440开发板led</title>
    </head>
    <body>
    <h1 align="center">基于mini2440的web控制GPIO口</h1>
    <form action="/cgi-bin/cgi_led.cgi" method="get">   //新建一个表单,动作链接到开发板的/cgi-bin/cgi_led.cgi,采用的方法为GET
    <p align="center">led的测试工作</p>
    <p align="center">请输入需要控制的led <input type="text" name="led_control"/></p>
    <p align="center">请输入控制led的动作 <input type="text" name="led_state"/></p>
    <p align="center"><input type="submit" value="sure"/>        
    <input type="reset" value="back"/>
    </p>
    </form>
    </body>
    </html>

    在地址栏输入192.168.1.230:8088后页面显示的内容为:

    在上面的程序中,我采用submit的方式将表单提交。

    采用GET方式传输信息,环境变量值为:QUERY_STRING,当我将表单的数据提交时,客户机会将这些数据添加到action标记命名的URL结尾,并用?将cgi的程序与表单提交的信息分隔开,例如:http://192.168.1.230:8088/cgi-bin/cgi_led.cgi?led_control=1&led_state=0 在这里,表单总共提交连个数据led_control和led_state,将这两个变量值附在URL的后面。QUERY_STRING的值为:led_control=1&led_state=0

    下面来编写cgi程序:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
    #include <sys/stat.h>
    #include <sys/mman.h>
    
    int main()
    {
    int fd,led_control,led_state;
    char *data;   //定义一个指针用于指向QUERY_STRING存放的内容
    fd = open("/dev/leds0",0);  //打开led设备
    if(fd < 0)
    {
    fd = open("/dev/leds",0);
    }
    if(fd < 0)
    {
    perror("open led device");
    exit(1);
    } 
    printf("Content-type: text/html;charset=gb2312
    
    ");
    printf("<html>
    ");
    printf("<head><title>cgi led demo</title></head>
    ");
    printf("<body>
    ");
    printf("<p>led is setted successful! you can watch the led's change</p>
    ");
    printf("<p><a herf=index.html><button>get back</button></a</p>
    ");
    printf("</body>
    ");
    
    data = getenv("QUERY_STRING");   //getenv()读取环境变量的当前值的函数 
    if(sscanf(data,"led_control=%d&led_state=%d",&led_control,&led_state)!=2) //利用sscnaf()函数的特点将环境变量分别提取出led_control和led_state这两个值
    printf("<p>please input right"); printf("</p>"); } 

    if(led_control>3)
    { printf(
    "<p>Please input 0<=led_control<=3!"); printf("</p>"); }

    if(led_state>1) { printf("<p>Please input 0<=led_state<=1!"); printf("</p>"); }
    ioctl(fd,led_state,led_control);
    close(fd);
    printf(
    "</html> ");
    exit(
    0);

    CGI程序从客户端获取环境变量后,需要进行解码,这里我们采用sscanf()函数来进行URL解码,即分离变量的值。

    CGI标准规定了CGI程序可以使用的三个HTTP标题。标题必须占据第一行输出!而且必须随后带有一个空行。即cgi程序输出语句:

    printf("Content-type: text/html;charset=gb2312
    
    ");

    三个标题分别为:Content-type 内容类型,Location地址,status状态

    text/html表示输出为html格式的数据

    利用交叉编译环境生成cgi_led.cgi可执行文件,将文件下载到开发版的/var/www/cgi-bin/的目录下

    接下来我们就可以在主机上运行程序了。

    在主页上输入控制信息,然后点击sure按钮,接着页面会跳转到如下所示:

    观察开发板的led,可以发现相应的led被点亮。

  • 相关阅读:
    【HDOJ】2267 How Many People Can Survive
    【HDOJ】2268 How To Use The Car
    【HDOJ】2266 How Many Equations Can You Find
    【POJ】2278 DNA Sequence
    【ZOJ】3430 Detect the Virus
    【HDOJ】2896 病毒侵袭
    求奇数的乘积
    平方和与立方和
    求数列的和
    水仙花数
  • 原文地址:https://www.cnblogs.com/rwzhou/p/3649475.html
Copyright © 2011-2022 走看看