使用Web页面远程控制LED
CGI(通用网关接口)是Web服务器运行时外部程序的规范,按CGI编写的程序可以拓展服务器功能。CGI程序可以与浏览器进行交互,还可以通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以从浏览器中获取数据存放到数据库中。几乎所有的服务器都支持CGI,可以使用任何语言编写CGI。CGI分为直接CGI和间接CGI两种,标准CGI使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。间接CGI又称缓冲CGI,在CGI程序和CGI接口之间插入一个缓冲程序,缓冲程序与CGI接口间用标准输入输出进行通信
实验步骤:
-
替换/www目录下的index.html文件
-
确认boa.conf(/etc/boa/)配置文件中CGI的存放路径,打开boa.conf,确定内容为ScriptAlias /cgi-bin/ /www/cgi-bin
-
进入/www/cgi-bin,将交叉编译myled.c生成的可执行文件(文件后缀必须是.cgi)拷贝到该目录
arm-none-linux-gnueabi-gcc -o myled.cgi myled.c -static
-
修改可执行文件myled.cgi的权限为777
-
网络设备输入http://192.168.3.20(开发板IP地址)
程序执行结果
相关代码如下:
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>led远程控制</title>
<style type="text/css">
body {
background-color: #999900;
text-align: center;
}
.ziti {
font-size: 24px;
}
.juzhong {
text-align: center;
}
.hsz {
text-align: center;
}
.hsz td {
color: #00F;
font-size: 18px;
}
.hsz {
background-color: #FCC;
}
.juzhong table {
text-align: center;
}
.juzhong table tr {
}
#h1 {
background-color: #0FC;
}
#h2 {
background-color: #FF9;
}
.h3 {
background-color: #0CF;
}
.ys1 {
font-size: 24px;
}
.STYLE1 {font-size: 36px}
</style>
</head>
<body class="juzhong">
<table width="900" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><p class="STYLE1"> </p>
<p class="STYLE1">iTOP-4412 WEB SERVER </p></td>
</tr>
<tr>
<td height="30"> </td>
</tr>
<tr>
<td><form action="/cgi-bin/myled.cgi" method="get" enctype="application/x-www-form-urlencoded" name="form1" target="_blank" id="form1">
<table width="300" border="1" align="center" cellpadding="1" cellspacing="1">
<tr>
<td>Led1</td>
<td><input name="led1" type="checkbox" id="led1" value="1" />
<label for="led1"></label></td>
</tr>
<tr>
<td>Led2</td>
<td><input name="led2" type="checkbox" id="led2" value="2" />
<label for="led2"></label></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submit" id="submit" value="submit" /></td>
</tr>
</table>
</form></td>
</tr>
<tr>
<td ><p> </p> </td>
</tr>
</table>
<p> </p>
</body>
</html>
myled.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *data;
int leds[2] = {0, 0};
long m, n;
int exit=0,i,fd;
printf("Content-Type:text/html;charset=gb2312\n\n");
printf("<html>\n");
printf("<body>\n");
printf("<title>iTOP-4412</title> ");
printf("<h3>iTOP-4412</h3> ");
data = getenv("QUERY_STRING");
printf("<p>receive data:%s</p>",data);
while(*data != '\0')
{
if(*data=='=')
switch(*(data+1))
{
case '1':leds[0]=1;break;
case '2':leds[1]=1;break;
default:exit=1;break;
}
if(exit == 1)
break;
data++;
}
fd=open("/dev/leds",0);
for(i=0;i<2;i++)
{
if(leds[i]==1)
printf("<p>%d\t</p>",i+1);
ioctl(fd,leds[i],i);
}
printf("</body>\n");
printf("</html>\n");
return 0;
}