《基于WEB的远程控制精品资料.doc》由会员分享,可在线阅读,更多相关《基于WEB的远程控制精品资料.doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、物理与电子工程学院设计实验报告 嵌入式系统设计设计性实验报告 题目 基于web的远程控制设计 系 别 年 级 专 业 班 级 学 号 学生姓名 指导教师 实验时间 目 录前 言2引 言2课题要求31、课题目的:32、运行环境:3正 文3一、课题分析:3二、实验原理:3三、系统设计:31、配置BOA 服务器:42、CGI原理及程序设计与编写53、网页文件index.html设计64、LED灯的驱动6四、实验现象6五、实验注意点及问题61、实验注意点:62、问题:6总结体会7附件1:CGI程序8附件2:网页(html文件)程序10设计性实验报告成绩: 指导教师签名:11前 言随着计算机技术和网络通
2、信技术的飞速发展,人们日常生活和工业生产等方面对基于以太网进行远程通信和控制的要求日益强烈。现代实验设备由于其高度的精密和复杂性以及大量的信息获取和处理要求, 基本上涵盖网络化生产与商业的技术问题, 使得它成为一个非常好的前期模型。基于Web的远程控制对远程终端要求低,再加上互联网技术的普及,基于Web的远程控制这种方式将会广泛应用到工业设备远程监控,自动化农业,网络化信息家电,智能楼宇,远程安防监控系统等。目前市场上虽已有成熟的Web服务器可供远程控制系统选择,但多是基于通用计算机或专用服务器,体积及成本不适合小型控制系统,尤其是在一些环境恶劣,不易值守或无法安装计算机控制系统的场所。如今嵌
3、入式技术发展迅速,嵌入式处理器的性能不断提高,基于嵌入式的控制系统得到广泛应用。这个实验研究了基于Web 的远程控制实验系统的硬件和软件设计方法, 重点讨论了远程数据通信实现等关键技术, 并用计算机网络对Led灯的控制。引 言近年来,随着互联网在全球的飞速发展,网络技术广泛应用于各种企业和工业系统,越来越多的信息化产品需要能够接入互联网通过Web页面进行远程访问和控制。这种程序结构也就是大家非常熟悉的B/S结构,即在 嵌入式设备上运行一个支持脚本或CGI功能的Web服务器,能够生成动态页面,在用户端只需要通过Web浏览器就可以对嵌入式设备进行管理和监控,非常方便实用。基于Web的远程控制设计,
4、我们首先需要在嵌入式设备上成功移植支持脚本或CGI功能的Web服务器,然后才能进行应用程序的开发。嵌入式Web服务器移植,我们常用的是Boa服务器的移植。课题要求1、 课题目的:在2440开发板上移植一个boa程序,使开发板可以作为一个WEB服务器使用。在PC计算机上使用浏览器测试嵌入式WEB服务器的功能。建立嵌入式系统的WEB服务功能(Boa服务器的建立参考实验“嵌入式WEB服务器实验”说明),利用WEB页远程控制嵌入式系统中的硬件状态,如控制Led等的点亮、熄灭等动作。2、 运行环境: 硬件:up-Star 认证考试实践板、PC 机Pentium 500 以上, 硬盘10G 以上。软件:P
5、C 机操作系统REDHAT LINUX 9.0MINICOMARM-LINUX 开发环境正 文一、 课题分析:这个实验基于Web的远程控制系统是以嵌入式Web服务器为中心,通过Internet网远程访问嵌入式Web服务器,嵌入式Web服务器通过现场总线控制各个LED灯,以达到远程监控的目的,实现PC机的浏览器可通过Internet网访问嵌入式Web服务器。通过对嵌入式系统的结构形式主要有通用平台、系统架构、硬件架构、软件架构以及硬件、软件的设计方案介绍,系统的将现场数据采集设备、本地Web服务器和远端监控主机三部分构成的基于Web的远程控制系统做了较为全面的介绍和设计。二、 实验原理: 基于w
6、eb 的远程控制系统开发步骤如下:1、建立可用的软件开发环境;2、移植Boa 服务器;3、开发所需的驱动程序;4、编写html 页面;5、编写CGI 程序,实现远程控制;6、登陆服务器,测试系统功能。三、 系统设计:1、配置BOA 服务器:(1) 依照实验要求编译BOA 服务器,并生成可执行文件BOA,并且在开发板的/var的文件下建立实验所需的文件夹及文件。拷贝Boa源码目录下已有的一个示例boa.conf,并在其基础上进行修改:Port 80#Listen 192.68.0.5User rootGroup 0#ServerAdmin rootlocalhostErrorLog /var/w
7、eb_boa/log/error_logAccessLog /var/web_boa/log/access_log#UseLocaltime#VerboseCGILogsServerName www.your.org.here#VirtualHost DocumentRoot /var/web_boa/wwwUserDir public_htmlDirectoryIndex index.htmlDirectoryMaker /usr/lib/boa/boa_indexer# DirectoryCache /var/spool/boa/dircacheKeepAliveMax 1000KeepA
8、liveTimeout 10MimeTypes /var/web_boa/mime.typesDefaultType text/plainCGIPath /bin:/usr/bin:/usr/local/binAlias /doc /usr/docScriptAlias /cgi-bin/ /var/web_boa/www/cgi-bin/(2)利用挂载功能将BOA 执行文件复制到开发板/var的文件夹下;(3)利用挂载功能将boa.conf文件复制到开发板/var的文件夹下。在/var下建立web_boa目录等,根据boa.conf文件中的内容相应创建需要的目录。另外,在虚拟机的/etc目录
9、下拷贝mime.types文件到开发板。将生成的执行文件boa、pass.cgi及index.html文件传到开发板指定目录(boa.conf文件中指定)。(4)运行boa文件up-tech: #cd /varup-tech:/var#./boa打开浏览器输入开发板的IP地址运行程序2、CGI原理及程序设计与编写(1)CGI程序编写(详细程序见附件1)for ( i = 0; i (int)strlen(input); i+ ) if ( inputi = V ) j=inputi+1; if (j=1) ioctl(fd, 1, 0); ioctl(fd, 0, 1); ioctl(fd,
10、0, 2); if(j=2) ioctl(fd, 0, 0); ioctl(fd, 1, 1); ioctl(fd, 0, 2); if(j=3) ioctl(fd, 0, 0); ioctl(fd, 0, 1); ioctl(fd, 1, 2); close(fd); printf(Your POST Message is %s n, input); return 0;(2)CGI文件的生成在虚拟机的终端环境中打开文件所在的文件夹输入arm-linux-gcc -o pass.cgi pass.c3、网页文件index.html设计(1)网页(html文件)设计(见附件2)(2)利用挂载功能
11、将文件复制到开发板的/var/web_boa/www的文件夹下(3)运行结果4、LED灯的驱动驱动的编译:make modules;将驱动程序下载到开发板上;加载驱动程序命令: insmod 驱动名;手动创建设备节点:mknod /dev/led c 231 0。四、 实验现象 连好实验设备后,执行boa,在远程联网计算机上通过浏览器输入开发板IP,就可以远程控制实验板上led灯的亮灭。按0即第一个灯亮,按1即第二个灯亮,按2即第三个灯亮。五、 实验注意点及问题1、实验注意点:(1)容量较大的文件上传到开发板要用ftp。如果需要用挂载则要将nolock改为nolock rsize=1024,w
12、size=1024这样才能顺利的上传。(2)生成文件夹mkdir *,生成文件touch *。(3)文件的移动:mv 文件的复制:cp(4) CGI文件的生成:arm-linux-gcc -o pazss.cgi pass.c2、问题:(1)挂载挂不上:可能是没连接开发板,也可能是本地网络连接禁用错误的原因。(2)压缩包的解压缩:解压缩时我们不能像平常一样直接右击解压缩到当前文件,而是应该将压缩包拷到自己文件下,用rootlocalhost webserver#tar zxvf boa-0.94.13.tar.gz 。(3)Boa执行后打不开网页或者打开网页错误:可能是网页出现了错误,也许是c
13、gi自身出了问题,或是配置文件的路径发生了错误,这些问题可以通过检查路径和文件解决。(4)无法控制Led灯:最可能的原因是未添加Led灯的驱动,异是Led灯的驱动程序出现错误。(5)开发板ping出错:1.自动桥接 2.换个IP地址再激活。(6)源文件的拷贝:实验过程中,一些源文件在虚拟机上修改以后,应该重新将其加载到开发板上,并将原来的文件覆盖掉。总结体会此次实验课题是基于web的远程控制设计。通过本次实验,我熟悉了基于Web下远程控制Led的方法,对CGI原理有了进一步了解,掌握了BOA的移植方法。这次实验是嵌入式实验的最后一个综合性设计实验,前前后后经历了两周时间。第一周我只是大概了解了
14、一下整个过程,完成了网页的设计,和boa的移植。因为课前预习了实验讲义,所以过程还是顺利的。第二周根据我们课前编好的CGI代码,进行实验的整体操作。在这个过程中问题还是蛮多的。然而我通过询问老师还有同学以及自己的查资料,更多地了解嵌入式的一些基本术语还有这些术语的作用,以及在什么时候使用它改如何使用它。还有就是当我遇到问题或麻烦的时候我该怎样去解决问题,我该怎么运用我所学的知识走出这个谜团,以及以最好的方式解决当前的问题。通过这次实验我总结了要如何学习嵌入式。首先要保持良好的心态,不能急于求成,要一步一个脚印的坚持;然后要有清晰的学习规划,明确学习步骤,明确先学什么,再学什么,比如C语言是学习
15、嵌入式的基础,所以在学习时必须要踏踏实实,把地基给打好;最后要有良好的学习氛围。嵌入式学习的难度和高度决定了嵌入式的学习要有个良好的学习讨论氛围,不能一味自己闷头学,要多去讨论和探讨或是想老师寻求答案但自己一定要明白其中的道理,汲取大家的智慧才能更好的提高。在整个学期中,虽然嵌入式很难学习,很难掌握,但我还是挺喜欢嵌入式的,因为它可以带给我许多接触不到的事物,也渐渐习惯了看满屏代码的感觉。希望如果有机会还能对嵌入式有所学习。附件1:CGI程序 #include #include #include char* getcgidata(FILE* fp, char* requestmethod);i
16、nt main() char *input; char *req_method; / char led1064; char led264; char a; int i = 0; int j = 0; int fd; printf(Content-type: text/plain; charset=iso-8859-1nn); printf(Content-type: text/htmlnn); printf(The following is query reuslt:); fd = open(/dev/led, 0); if (fd 0) perror(open device /dev/led
17、); exit(1); ioctl(fd, 1, 0); req_method = getenv(REQUEST_METHOD); input = getcgidata(stdin, req_method); /根据input中的字符串信息确定led灯的点亮关闭 /以下补充完善代码 for ( i = 0; i (int)strlen(input); i+ ) if ( inputi = V ) j=inputi+1; if (j=1) ioctl(fd, 1, 0); ioctl(fd, 0, 1); ioctl(fd, 0, 2); if(j=2) ioctl(fd, 0, 0); ioc
18、tl(fd, 1, 1); ioctl(fd, 0, 2); if(j=3) ioctl(fd, 0, 0); ioctl(fd, 0, 1); ioctl(fd, 1, 2); close(fd); printf(Your POST Message is %s n, input); return 0;char* getcgidata(FILE* fp, char* requestmethod) char* input; int len; int size = 1024; int i = 0; if (!strcmp(requestmethod, GET) input = getenv(QUE
19、RY_STRING); return input; else if (!strcmp(requestmethod, POST) len = atoi(getenv(CONTENT_LENGTH); input = (char*)malloc(sizeof(char)*(size + 1); if (len = 0) input0 = 0; return input; while(1) inputi = (char)fgetc(fp); if (i = size) inputi+1 = 0; return input; -len; if (feof(fp) | (!(len) i+; input
20、i = 0; return input; i+; return NULL;附件2:网页(html文件)程序Led远程控制 嵌入式LED远程控制系统亮灯位置0 1 2 设计性实验报告成绩: 指导教师签名: 附录资料:从 XML 生成可与 Ajax 共同使用的 JSON时下,非常流行使用 JavaScript 代码为数据驱动的 Web 应用程序添加互动性。若能将数据编码成 JavaScript Object Notation(JSON)的格式,您就可以更轻松地通过 JavaScript 语言使用它。通过本文,发掘使用 XSLT V2 从 XM
21、L 数据生成 JSON 的几种不同方法。几年前,许多开发人员很看好 XML、XSLT、Extensible HTML (XHTML)和其他一些基于标记的语言。现在,Asynchronous JavaScript and XML(AJAX)成了新的热点,人们又将目光转向了使用 JavaScript 代码的数据驱动的富 Internet 应用程序。但是开发人员是否已经消除了 XML 和这一新技术之间的鸿沟呢?当然,您可以在 Web 客户机中使用 XML 解析器来读取数据,但这种做法会带来两个问题。第一,出于安全方面的原因,XML 数据只能从与此页面相同的那个域中读取。这虽然不是什么大的限制因素,但
22、它的确会引起部署方面的问题,还会阻碍 DHTML 小部件的创建。第二,读取和解析 XML 会非常慢。另一种做法是让服务器执行 XML 的解析工作,方法是设置服务器,使之向浏览器发送以 JavaScript 代码或时下流行的 JavaScript Object Notation(JSON)编码的数据。本文将展示如下三种使用 XSLT V2 语言和 Saxon XSLT V2 处理器从 XML 数据生成 JSON 的技巧: l 简单编码 l 通过函数调用加载数据 l 编码对象 JSON 简介要学习如何将数据编码成 JSON(它只是 JavaScript 的一个子集),最好的方法是从数据开始。清单
23、1 显示了书籍列表的一个示例 XML 数据集。清单 1. 基本的图形化图书馆 Code Generation in Action JackHerrington Manning PHP Hacks JackHerrington OReilly Podcasting Hacks JackHerrington OReilly 这个数据集很简单,只包含三本书,每本书都具有惟一的 ID、书名、作者姓名及出版商的名字。(没错,我只选择了我自己的书作为数据集,但能怨我吗?这些书实在是不可多得的节日和生日礼物。)清单 2 显示了这些数据在 JSON 中的效果。清单 2. JSON 中的示例数据集 id: 1,
24、 title: Code Generation in Action, first: Jack, last: Herrington, publisher: Manning , . 方括号 () 表明这是一个数组。大括号 () 则表明这是一个散列表,该散列表由一组名称和值对组成。在本例中,我创建了一个散列表的数组 用来存储这类结构式数据的一种常见方法。另外一点值得注意的是字符串是通过单引号或双引号被编码的。所以,如果我想用单引号编码 OReilly,我就必须使用反斜杠对它进行转义:OReilly。 这让我编写的这个 XSLT 样式表更为有趣了一些。我并未在本例中放上任何日期,但您也可以通过如下两种
25、方法来编码日期。第一种方法是将日期作为字符串,该字符串必须在后面被解析。第二种方法是将日期作为一个对象,比如:publishdate: new Date( 2006, 6, 16, 17, 45, 0 )这段代码将 publishdate 的值设置为6/16/2006 5:45:00 p.m.。简单编码接下来我将陆续介绍 JSON 编码的几种技巧。第一种也是其中最简单的一种,此样式表如 清单 3 所示。清单 3. simple.xsl 样式表 var g_books = 1, id: ,name: ,first: ,last: ,publisher: ;要理解此样式表,不妨先来看一下 清单 4
26、 所示的输出。清单 4. simple.xsl 的输出var g_books = id: 1,name: Code Generation in Action,first: Jack,last: Herrington,publisher: Manning, id: 2,name: PHP Hacks,first: Jack,last: Herrington,publisher: OReilly, id: 3,name: Podcasting Hacks,first: Jack,last: Herrington,publisher: OReilly;这里,我将名为 g_books 的变量设置为一个
27、包含三个散列表的数组,每个散列表包含关于该书的信息。再回过头来看看 清单 3,您会发现第一个模板匹配 / 路径,它也是首先应用到输入数据集的模板,该模板使用 for-each 循环来遍历每本书。之后,它使用 标记来将文本从该数据输出到 JavaScript 输出代码。对于字符串,我使用名为 js:escape() 的定制函数,它在模板之前定义。该函数使用一个正则表达式将一个单引号标记更改为带有反斜杠的单引号标记。最后一个重要的元素是 标记,它告知处理器要输出的是文本而不是 XML。要检验此过程是否可以正常工作,我加入了一个 simple .html 文件,该文件引用我在 simple.js 保
28、存的 XSL 样式表的输出。这个 HTML 文件如 清单 5 所示。清单 5. simple.html 文件Simple JS loaderdocument.write( Found +g_books.length+ books );.html 文件使用 标记简单地加载已编码了的 JavaScript 代码。之后,第二个 标记将数组的长度写出到浏览器页面,如 图 1 所示。图 1. simple.html 的输出好了!数据文件包含三本书,相应的 JavaScript 文件也包含三本书。它真的可以工作!通过函数加载上述第一个示例很简单,而且在大多数情况下可以发挥其作用,但它存在一些问题。第一个问
29、题是对于数据何时被加载没有任何提示。如果数据是像页面那样被静态加载的,这不成问题。但是如果页面动态创建了一个 标记来按需加载数据,那么就很有必要知道 标记是何时完成的。实现此功能的最好的方法是让编码了的数据调用一个 JavaScript 函数,而不是只设置数据。这个概念很重要,所以我将花一些时间来介绍一下为什么您必须要通过动态生成的 标记来加载数据。页面加载后,从服务器获得数据是 Web 2.0 的核心功能。一种方法是使用 AJAX 机制通过到服务器的调用来加载 XML。然而,出于安全性的原因,AJAX 机制只限于从单一域获取数据。这在大多数情况下都没有问题,但有时,您可能需要 JavaScr
30、ipt 代码运行在他人的页面上(例如,Google Maps)。在这种情况下从服务器获得数据的惟一方法是通过动态加载 标记。获悉 标记何时加载的最好的方法是让 标记返回的脚本调用函数而不是简单地加载数据。清单 6 显示了在函数调用中编码的数据。清单 6. Function1.jsAddBooks( id: 1,name: Code Generation in Action,first: Jack,last: Herrington,publisher: Manning, id: 2,name: PHP Hacks,first: Jack,last: Herrington,publisher: O
31、Reilly, id: 3,name: Podcasting Hacks,first: Jack,last: Herrington,publisher: OReilly );清单 7 给出了相应的 .html 文件。清单 7. Function1.htmlFunction 1 JS loadervar g_books = ;function AddBooks( books ) g_books = books; drawbooks( g_books );稍后将详细介绍 drawbooks 函数。这里重要的是了解一下页面如何定义 AddBooks 函数,该函数随后会由 function1.js 文件中的脚本调用。该 AddBooks 函数负责处理数据。而且被调用的 AddBooks 函数会向页面指示 标记被正确加载,并已加载完成。要创建 function1.js 文件,我只对样式表稍微做了一点修改,如 清单 8 所示。清单 8. function1.xsl 样式表AddBooks( xsl:if test=positio