本帖最后由 翠花儿 于 2021-6-1 18:30 编辑
本文档是在搭建好的 web 服务器(可参考第四十七章文档)基础上讲解一下通过 web 网页实现控制 LED。 要实现控制 led,需要 CGI 编程,CGI(Common Gateway Interface)是外部应用扩展,应用程序与 www 服务器交互的一个标准接口。按照 CGI 标准编写的外部扩展应用程序可以处理客户端浏览器输入的数据,从而完成客户端与服务器的交互操作。而 CGI 规范就定义了 web 服务器如何向扩展应用程序发送消息,在收到扩展应用程序的信息后又如何进行处理等内容。通过 CGI 可以提供许多静态的 HTML 网页无法实现的功能。比如搜索引擎、基于web 的数据库访问等等。 1 web 服务器配置 在前面的搭建 web 服务器章节,在修改 boa.conf 配置文件的时候指定了 web 网页的存放目录“DocumentRoot /www”,现在打开之前在 www 目录创建的 index.html。删除掉里面的内容,然后输入以下内容。修改后如下图。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <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; www.topeetboard.com } .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">iMX6 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>Led</td> <td><input name="led2" type="checkbox" id="led_ctl" value="2" /> <label for="led"></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> |
然后保存退出。上面输入的是 HTML 格式的代码,主要是用到了通过表单向服务器提交信息,在表单里面指定了服务器端处理接收到信息的 CGI 程序是 myled,这是在 form 表单的属性里设置的,代码是“form action="/cgi-bin/myled.cgi" method="get”,使用的传递数据的方式是 get 方法,如下图所示。 修改完了 index.html,需要些 CGI 程序。在 boa 的配置文件 boa.conf 里面指定了 CGI 程序的存储目录是“ScriptAlias /cgi-bin/ /www/cgi-bin/”。现在进入到 www/cgi-bin 目录,并创建 myled.c 文件,如下图。 然后在 myled.c 文件中输入一下代码。 #include <stdio.h> #include <stdlib.h> int main() { char *data; int leds_ctl[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>iMX6</title> "); printf("<h3>iMX6</h3> "); data = getenv("QUERY_STRING"); printf("<p>receive data:%s</p>",data); while(*data != '\0') { if(*data=='=') switch(*(data+1)) { case '1':leds_ctl[0]=1;break; case '2':leds_ctl[1]=1;break; www.topeetboard.com default:exit=1;break; } if(exit == 1) break; data++; } fd=open("/dev/leds_ctl",0); for(i=0;i<2;i++) { if(leds_ctl==1) printf("<p>%d\t</p>",i+1); ioctl(fd,leds_ctl,i); } printf("</body>\n"); printf("</html>\n"); return 0; } |
最后保存退出。 上面的代码是 C 语言,主要是完成了获取 web 提交过来的数据,然后对获得的数据解析,最后会调用 led 的 ioctl 函数来点亮或关闭 led。里面的 printf 打印语句,最终会生成一个 web 页面。 接下来编译 myled.c 生成 myled.cgi(在 index.html 的表单里面设置了处理文请求的 cgi 程序是 myled.cgi),把最小系统挂载到虚拟机 Ubuntu 系统上,并把 myled.c 文件复制到挂载的 mnt 目录中的 web 文件夹中。如下图。 使用命令“arm-none-linux-gnueabi-gcc -o myled.cgi myled.c -static”编译 myled.c ,编译完成后,可以看到生成了 myled.cgi 文件,如下图。 在开发板的超级终端控制台,进入/mnt/web 目录,并把编译生成的 myled.cgi 文件复制到/www/cgi-ini 目录下。如下图。 注意:生成的 myled.cgi 文件需要有执行权限,所示使用 chmod 命令修改一下它的权限,如下图。 现在控制 led 的 web 程序已经完成了。 2 运行测试 在 PC 的浏览器上输入开发板的 IP 地址,输入完成后,按回车,即可打开开发板的 index.html 页面。如下图。 选中 led 右边的方框,点击页面上的“submit”按钮,会打开一个新的 web 界面,如下图。并且此时可以看见 iMX6 开发板上编号 D6 的 led 灯亮起。 再回到初始的 index.html 界面,取消选中 led 右边的方框,点击”submit”按钮,会打开另一界面。如下图。同时看到编号 D6 的 led 灯熄灭。 上图中的页面里面的信息就是 myled.cgi 程序里面的 printf 打印出来的,其中“receive data:led1=1&led2=2&submit=submit”,就是客户端通过 get 方式传递给 web 服务器的数据,下面的数字 2 是 myled.cgi 程序从”receive data:led1=1&led2=2&submit=submit”解析出来的值。同时还可以看到在 iMX6 开发板 led_ctl 打印出来的信息,如下图所示: 测试完毕。
|