4嵌入式网关接口程序的实现
为了实现客户浏览器同Web服务器之间的动态交互,需要采用动态网页技术,使客户不仅可在浏览器上实时查看远传来的数据,而且还能主动控制Web服务器端的嵌入式设备。目前,实现动态网页的四种技术分别是CGI、ASP、PI-IP和JSP。但μClinux不支持ASP和PHP,故采用CGI来实现动态Web页面。
CGI是一种在Web服务器中运行的程序,其功能是在Web服务器和应用程序之间建立通信链接。当Web服务器接收到客户机浏览器发送的HTTP请求消息,即传送给相应的CGI程序,只要有对应的资源,CGI就会把应答返回服务器,由后者将结果回复给客户机。CGI的工作机制如图3所示。
图2嵌入式Web服务器的工作流程
图3 CGI的工作模式
当用户在网页中点击按钮时,HTML页面的表单数据就被发送到Web服务器。服务器随即创建一个新的进程运行CGI程序,并把表单数据传送给程序。CGI再根据表单数据调用其他服务进程,将执行结果给服务器。再由服务器封装成HTTP应答包,发送给客户浏览器。
开发的CGI程序主要由四部分组成:
1)从POST请求表单中读取数据。用户通过标准输入将POST请求中的数据传送给Web服务器,服务器则把输入数据作为一系列的键-值对,提供给CGI程序。键是HTML表单元素的名字,值是用户输入的数据或空值。各键-值对由“&”字符分开,键和值由“=”分开。
2)解释来自请求表单的数据。读到的CONTENT—LENGTH字符串是一系列键一值对和编码,程序将此字符串中的键和值一一对应起来,通过表单元素的名字可以获得用户输入的数据。
3)对请求表单中的数据进行解码。程序要使用这些数据,还要对其进行解码,除去其中的“+”、十六进制ASCII码等。按照1)中提到的编码规则逆操作,然后将每一个键-值对添加到自定义的结构体(变量名—值对)数组中保存起来。
4)交互其他应用程序,返回结果。根据解析出来的变量名,值对,通过变量名判断用户请求的类型,把对应的值传递给其他程序。程序执行完后,将结果返回CGI。CGI再通过一系列的打印输出函数生成HTML源代码,最后由服务器按照HTTP协议将其打包,返回客户浏览器。
CGI程序可使用多种语言编写,如Perl、Shell、C、C++、Fortran、Pascal等。Linux下可使用Perl、C语言等开发CGI程序。但μClinux不支持Perl,故应选用C语言编写。
与CGI交互的嵌入式应用程序,应采用模块化编程技术,每个功能模块由一单独的进程完成,并以μClinux所支持的System V IPC所提供的各种进程通信机制,如信号、消息队列和共享内存等,来实现各进程之问的通信。对于嵌入式测控应用来说,主要进程包括数据采集、系统时间设置等。
CGI进程接收服务器传来的表单信息并解析成各种命令,然后以消息队列的方式发送到相应的进程。数据采集进程采用信号(软中断)机制实现数据采集功能,初始化后首先进入信号阻塞状态,当定时信号到达时,将采集到的数据以共享内存的方式上传给CGI进程。CGI进程与各应用进程之间的通信如图4所示。
图4 CGI进程与各应用进程之间的通信框图
编写好的CCI源程序经交叉编译后,在服务器cgi目录下生成*.cgi可执行程序。用户点击Web页面上的按钮或指向CGI程序的链接,*.cgi便被执行。CGI程序为用户提供了一个图形式的界面。远程Web用户通过向Web表单输入数据并提交来实现与现场嵌入式设备之间的信息交互。但由于每运行一个CGI,服务器就需一个进程为其服务,这样服务器与浏览器交互越多,对服务器端嵌入式系统总体性能的影响就越大,因此对于数据的后期处理和显示方式等任务,应采用基于客户端浏览器的动态HTML技术来完成,由脚本语言JavaScript实现,以减轻嵌入式服务器端的负担。
内嵌JavaScript的HTML以及其他静态HTML都保存在服务器的文档目录下,当用户点击HTML链接时,服务器就会自动找到相应的HTML页面返回。
5 结语
基于μClinux操作系统,将ARM嵌入式应用系统与Internet结合,通过向内嵌的Web服务器中添加嵌入式网关接口CGI程序等手段,实现了动态Web技术在远程监控系统中的应用,使得用户通过Internet就可以直接访问和控制远端的嵌入式应用系统,而不再需要通用微机作Web服务器。具有成本低、可靠性高等优点,可对监控领域的发展和方案的选择提供实用的参考价值。