基于boa服务器的web控制mini2440的GPIO口
来源:互联网 发布:淘宝卖家可以改名字吗 编辑:程序博客网 时间:2024/06/05 00:08
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\n\n");printf("<html>\n");printf("<head><title>cgi led demo</title></head>\n");printf("<body>\n");printf("<p>led is setted successful! you can watch the led's change</p>\n");printf("<p><a herf=index.html><button>get back</button></a</p>\n");printf("</body>\n");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>\n"); exit(0);
CGI程序从客户端获取环境变量后,需要进行解码,这里我们采用sscanf()函数来进行URL解码,即分离变量的值。
CGI标准规定了CGI程序可以使用的三个HTTP标题。标题必须占据第一行输出!而且必须随后带有一个空行。即cgi程序输出语句:
printf("Content-type: text/html;charset=gb2312\n\n");
三个标题分别为:Content-type 内容类型,Location地址,status状态
text/html表示输出为html格式的数据
利用交叉编译环境生成cgi_led.cgi可执行文件,将文件下载到开发版的/var/www/cgi-bin/的目录下
接下来我们就可以在主机上运行程序了。
在主页上输入控制信息,然后点击sure按钮,接着页面会跳转到如下所示:
观察开发板的led,可以发现相应的led被点亮。
- 基于boa服务器的web控制mini2440的GPIO口
- mini2440基于boa服务器通过WEB控制GPIO
- 基于mini2440的boa服务器移植
- 基于Boa-web服务器的远程机器人控制(网络篇)
- 基于Boa-web服务器的远程机器人控制(网络篇)
- mini2440之GPIO控制按键的方法
- web服务器boa的移植
- 基于flask通过web浏览器控制树莓派raspberry的GPIO
- 基于BOA的WEB服务的搭建
- 基于嵌入式linux的Boa服务器移植
- 基于arm的嵌入式boa服务器移植
- 嵌入式WEB服务器BOA的移植方法
- 嵌入式WEB服务器BOA的移植方法
- web服务器boa的交叉编译
- 嵌入式web服务器boa的编译移植
- 嵌入式web服务器boa的测试
- 嵌入式WEB服务器BOA的移植方法
- Linux下web服务器BOA的移植
- GT-Grid初学服务端数据加载
- java网路编程学习之路(1)
- MySQL新建一个数据库的时,产生的新文件在哪?
- 线程天敌TerminateThread与SuspendThread
- 一切从基础开始
- 基于boa服务器的web控制mini2440的GPIO口
- pandoc 用markdown写毕业论文 markdown转pdf,docx
- 测试4——shrink和move产生的redo log量的比较
- python学习(windows编程工具安装)
- apache并发数调整
- ZOJ 2001水题
- Ubuntu下手动安装openssh
- 黑马程序员——Java学习笔记之13——“反射”总结
- poj3213