第3章嵌入式远程监控系统设计与实现1.1课程设计目的通过本课程设计,要对嵌入式系统的开发有比较深入的学习和分析。通过对WEB编程、服务器的架设、驱动程序的开发这些步骤的深入研究,掌握构建一个完备的嵌入式系统的开发流程。1.2课程设计要求通过本课程设计,熟练前面几章的内容。在此基础上,编写相关驱动程序,以及CGI和数据处理程序完成基于WEB的嵌入式远程控制系统。通过本章的课程设计,可以初步了解一个嵌入式系统的基本构建过程,学习如何在ARM系统上搭建嵌入式服务器,并通过CGI控制外部设备的一般方法。1.3系统简介嵌入式WEB服务器及远程测控总的思想就是网络化仪器。完成的目标就是设计基于Linux操作系统的远程测控系统,并且讨论实践中的可行性,我们通过普通的浏览器就可以对远端现场的控制和测量以及获取远端现场的图像信息。使用嵌入式WEB服务器的好处有这样几点:(1)远程监控终端仅需要安装浏览器即可,无需开发专门的应用软件,降低系统成本。(2)浏览器所在的监控终端平台与WEB所在的服务器平台无关,监控终端可以采用多种操作系统,真正实现了跨平台。(3)操作界面简单统一,表达直观生动,用户无需经过专门培训。(4)易于扩展新的功能,系统升级仅需在Web服务器一端添加相应模块,与远程监控终端无关,降低系统升级维护费用。系统整体结构如下:图3.1系统整体结构远程监控系统所涉及的知识点很多,主要包括Linux操作系统,内核移植,文件系统的移植,服务器的移植,CGI程序的移植,CGI脚本的编写,设备驱动的调试和JavaScript脚本,TCP服务器与客户端,UDP服务器与客户端,Java中的多线程技术,Java画图板及各种控件的添加。下面提供几张已经做好的测控服务器的图片,先达到一个感性的认识。图3.2是一个实时视频及温度测量远程监控系统,它将采集到的图像以及温度参数在网页中显示出来。图3.2ARM9远程实时视频及温度测量在这一章中我们将学习一个基本的嵌入式远程监控系统的搭建,由于涉及到的知识点较多,我们只能把其中最主要的知识简要地描述,更多更详细的设计可以参考手册后面的参考文献。通过对本章的学习,读者可以了解架设一个嵌入式WEB服务器的全过程及其要点。1.4嵌入式WEB服务器移植1.4.1BOA的移植1、下载BOA源码下载地址:或者。最新发行版本:0.94.13下载boa-0.94.13.tar.gz,注意:从boa上下载的是boa-0.94.13.tar.gz,按照一般解压步骤进行解压:#tarxzfboa-0.94.13.tar.gz2、生成Makefile文件生成Makefile文件直接运行src/configure文件。3、修改Makefile文件修改Makefile文件修改CC=gcc为CC=arm-linux-gcc修改CPP=gcc-E为CPP=arm-linux-gcc-E4、编译#make生成boa文件#arm-linux-stripboa去掉文本信息,使boa变小#make生成boa文件#arm-linux-stripboa去掉文本信息,使boa变小5、BOA的配置BOA需要在/etc目录下建立一个boa目录,里面放入BOA的主要配置文件boa.conf。在BOA源码目录下已有一个示例boa.conf,可以在其基础上进行修改。(a)、Group的修改修改Groupnogroup为Group0由于在/etc/group文件中没有nogroup组,所以设成0。另外在/etc/passwd中有nobody用户,所以Usernobody不用修改。(注意如果没有nobody用户,也需要将User设成0)(b)、ScriptAlias的修改指示CGI脚本的存放位置。修改ScriptAlias/cgi-bin//usr/lib/cgi-bin/为ScriptAlias/cgi-bin//var/指示网页存放的位置。(c)、ServerName的设置修改ServerName为ServerName注意:该项默认为未打开,执行BOA会异常退出,提示“gethostbyname::Nosuchfileordirectory”,所以必须打开。其它默认设置即可。6、BOA的运行成功配置以后,还需要创建日志文件所在目录/var/log/boa,创建HTML文档的主目录/var/,将静态网页存入该目录下(可以将主机/usr/share/doc/HTML/目录下的index.html文件和img目录复制到/var/目录下),创建CGI脚本所在录/var/,将cgi的脚本存放在该目录下。另外还要将mime.types文件复制/etc目录下,通常可以从linux主机的/etc目录下直接复制即可。实际运行时,可以将index.html文件、img目录和mime.types文件放到CF卡目录下,建立目录后,拷贝至相应目录。制作run.sh:mkdir/etc/boacp/cf/boa/boa.conf/etc/boa/mkdir/var/logmkdir/var/log/boamkdir/var/启动浏览器,直接在浏览器中输入,出现BOATEST的欢迎网页。静态HTML调试成功。1.4.2CGI脚本测试为了测试刚才建立的BOA服务器是否正确,我们可以编写一个简单例程进行测试。helloworld.c程序就起这个作用,其内容如下:#includestdio.hintmain(){printf(Content-type:text/html\n\n);printf(html\n);printf(headtitleBOACGITEST/title/head\n);printf(body\n);printf(h1BOACGITEST/h1\n);printf(/body\n);printf(/html\n);exit(0);}编写完后进行交叉编译,得到的helloworld拷贝到var/目录下。#arm-linux-gcc-ohelloworld.cgihelloworld.c在浏览器中输入可以看到BOA测试页面,表示CGI测试通过。1.5HTML网页设计普通的HTML页面只能提供静态的信息给用户,如果要实现网页的交互仅靠HTML是无能为力的。在一个完整的系统中,用户提交信息输入界面的好坏将影响到系统的成败。好的输入界面可以弥补系统设计上的某些缺陷,但如何才能设计一个好的输入界面呢?HTML中表单(FORM)在CGI中是常见使用的输入界面,虽然并不十分完美,但它的确是目前中最强大的输入工具。FORM是由一组相关联的标签所组成,使用方法就像HTML中的其他标签一样。在FORM中提供了多种输入资料的工具,如文字输入区(Text)、下拉式菜单(select)、复选框(CheckBox)、单选框(RadioButton)等等。就目前所定义的标准种,FORM的标签可以分为INPUT、SELECT以及TEXTAREA三个大类。我们来看看具体的程序实现,下面是一段HTML表单:htmltitleCGILEDtest/titlebodyformaction=/cgi-bin/cgi_led.cgimethod=GETfontsize=7center基于S3C2440的Web服务器的设计程序/center/fontbrppcenter系统资源:s3c2440,16MFlash,32MSDRM,IP:192.168.1.70/centerPcenter输入要点亮的LED:inputtype=textname=led/centerbrcenter输入LED状态:inputtype=textname=status/centerbrcenterinputtype=submitvalue=确定inputtype=resetvalue=重设/center/form/body/html网页中表单由字头form开始,/form结束。其中action=/cgi-bin/cgi_led.cgi指明使用的CGI程序名为cgi_led.cgi;method属性指定提交数据的方法(POST还是GET),这里使用的是GET方法。我们要实现的功能很简单,就是采集现场的LED的状态,并在网页上输出结果。在这个实例中我们提交了两个数据,一个是数据的名字是led,另一个数据的名字是status,它们的值由用户在网页中输入。这里首先了解一下CGI编码的规则。其规则如下:不同域(变量值对)之间用“&”分开;变量与值之间用“=”连接;空格符用“+”代替;任何特殊字符用“%”接相应的十六进制ASCII码代替,最后形成的格式为:name1=value1&name2=value2%name3=value3...1.6CGI程序设计CGI(CommonGatewayInterface)通用网关接口的简称。其主要的功能是在环境下,从客户端传递一些信息给WEB服务器,再由WEB服务器去启动所指定的程序来完成特定的工作。所以简单点说,CGI是一种通用的接口标准。CGI可以为我们提供许多HTML(HyperTextMarkupLanguage,超文本标记语言)无法做到的功能。比如一个计算器、顾客表格的提交以及统计、搜索引擎、WEB数据库等等。用HTML是没有办法记住客户的任何信息的。要把顾客的信息记录在服务器的硬盘上,就要用到CGI。CGI是一种通用的接口标准。CGI程序就是符合这种接口标准的,运行在WEB服务器上的程序。它的工作就是控制信息要求,产生并传回所需的文件。CGI由浏览器的输入触发这个程序。先看看浏览器浏览网页是怎样实现的。作为一个用户首先在浏览器的地址栏中添加上要访问的主页地址并回车触发这个申请。浏览器将申请发送到服务器上。WEB服务器接收这些申请并根据.htm或.html的后缀并认识到这是HTML文件。WEB服务器从当前硬盘或内存中读取正确的HTML文件,然后将它送回浏览器。HTML文件将被用户的浏览器解释并将结果显示在用户浏览器上。CGI程序可以用来在WEB内加入动态的内容。通过接口,浏览器能够发送一个可执行应用程序的HTTP请求,而不仅仅只是静态的HTML文件。服务器运行指定的应用程序,这个应用程序读取与请求相关的信息,获得请求传过来的数值。例如使用者填写HTML表单提交了数据,浏览器将这些数据发送到WEB服务器上。WEB服务器接收这些数据并根据客户机指定的CGI程序把这些数据递交给指定的CGI程序,并使CGI在服务器上运行。CGI程序运行结束,生成HTML页面,WEB服务器把CGI程序运行的结果送回用户浏览器。HTML文件将会被用户的浏览器解释并将结果显示在用户浏览器上。CGI的基本工作情况如下图所示:图3.3CGI工作流程示意图WEB服务器与CGI程序之间通过四种途径进行通信:环境变量、命令行、标准输入和标准输出。其中负责输入的有环境变量、命令行和标准输入。命令行只用于ISINDEX查询,较少使用。环境变量存放服务器向CG