引言
传统的嵌入式Web Server搭建方案中,不论是直接基于开源网络协议栈(uip等),还是基于Linux平台下的轻量级服务器(Httpd等),Web Server均是运行在嵌入式设备当中,这也是其名称为“嵌入式Web Server”的原因,如图1所示。但随着Web技术的不断发展,Server的体积越来越大,嵌入式Web Server已不再满足于简单的网页发送、CGI等技术,而是要求具有表单更新、实时流传输、大数据量交换和存储以及复杂的后台逻辑管理等功能。但与之相对的是嵌入式设备的硬件处理能力区别较大,很多设备无法负担庞大的Web Server的运行压力。基于此,我们提出了一种新的Server搭建方式,即将Server搬运到运算处理能力更强大的PC上,通过成熟的PHP+HTML+JavaScript等技术来实现功能强大、界面精美的Web Server。Server提供一种称为“Web服务”的接口,与客户端(嵌入式设备)互通信息。对于用户而言,直接通过浏览器访问或控制嵌入式设备,丝毫感觉不到Web服务器的位置变化,因此仍然可以被称作“嵌入式Web Server”。这种策略类似于常见的网站设计中的前后台架构,达到在最少的资源上最大化运行效率的成效。
图1 传统的嵌入式Web Server
基于这一思路,可以不用再担心硬件限制,在实际应用中选择主流的Apache+PHP+HTML方案来搭建服务器。这种嵌入式Web Server的示意图如图2所示。
图2 基于Web服务的嵌入式Web Server
当系统中的节点设备数量众多,或者是设备的开发平台、系统不同(各种手机、设备等)的时候,这种Web Server更能体现优越之处。通过Web服务接口来与众多的设备通信,而设备通过Web请求,将自身采集到的数据发送到服务器,服务器在收集到数据后会进行逻辑分析,按照PHP脚本所指定的功能将这些数据进行存储或者丢弃,并给设备特定的反馈信息。同时,该服务器提供了一个完善的Web页面,用户可以通过浏览器来访问到相应的数据,或者对设备进行一定的控制。
搭建这种类型的服务器需要做两方面的工作,一是搭建传统意义上的Web服务器并实现服务接口;二是在嵌入式设备当中编写Web请求程序,不断地更新自身状态或者发送信息到网站服务器当中。下文将对这些内容进行详细介绍。
1 Web服务器搭建
受限于嵌入式设备的处理能力,之前只能借助于Boa、Httpd等轻量级的Web服务器,现在可以采用更合适的Web服务器。Apache是一款开放源码的HTTP服务器,可以在大多数计算机操作系统中运行,由于其跨平台和安全性而被广泛使用,是最流行的Web服务器端软件之一。它快速可靠并且可通过简单的API扩展、PHP/Python等脚本被内嵌到服务器中。在本项目当中,为了对服务器进行高效的开发,采用了目前比较流行的集成安装包WAMP(或LAMP),其内含Apache、PHP和Mysql等功能。
在Linux平台(ubuntu12.04)下搭建服务器及开发环境的简单步骤如下:
LAMP的安装:sudo aptget install apache2 mysqlserver mysqlclient php5 php5gd php5mysql。
phpmyadmin安装:sudo aptget install phpmyadmin。
Apache配置:启用 mod_rewrite模块:sudo a2enmod rewrite;重启Apache服务器:sudo /etc/init.d/apache2 restart。
在Windows平台下只需下载WAMP集成安装包,即可进行相应安装。
2 Web服务
Web服务(Web Service)是一项新技术,它能使得运行在不同机器上的不同应用无需借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。Web服务通过标准的数据接口与客户端进行通信,在本项目当中,采用了Json这种轻量级数据格式。客户端发送与接收到的数据均是封装成Json格式的数据包,这保证了系统的扩展性与可维护性。
通过编写PHP脚本程序来实现Web服务的诸多服务接口,以本项目为例,实现了多达21个服务接口,客户端通过访问这些接口,即可实现与服务器的通信。以其中一个为例,该服务接口接收客户端的信息,返回相应的反馈信息。接口规定如表1所列。
表1 Web服务接口规范
从表1可以看出,服务器提供了一个getRFID的服务接口,该接口接收三个参数,同时对这些参数进行分析判断。客户端通过访问http://localhost/lvsemoban/interface/getRFID.php来发送相应的信息,通信格式采用Json封装。
服务器为了实现这一接口功能,需要编写PHP脚本,本项目当中对应的PHP脚本内容如下:
<?php
/*
* RFID服务器接口
* 获取RFID、教室名和上课时间
* 检索学生表,根据RFID检索对应姓名和班级名
*/
//获取RFID、教室名和上课时间
$RFID=$_REQUEST["RFID"];
$classroom=$_REQUEST["classroom"];
$courseIndex=$_REQUEST["coursetime"];
……
echo json_encode($ret);
?>
服务器通过$_REQUEST来获取客户端所发送的信息参数,进行一系列的分析、判断和处理之后,以Json格式返回给客户端相应的信息。在本项目当中,客户端把采集到的学生RFID卡、教室名和上课时间发送至服务器,服务器会判断这些信息的正确性,同时将处理后的信息存储到数据库当中。其中,json_encode函数将返回数据封装成Json格式后再进行返回。
而对于用户而言,则无需接触到这些复杂的后台逻辑,只需在浏览器当中输入相应网址,即可获取到相应信息。借助HTML+Javascript,服务器提供了一个良好的网站界面。同时,服务器后台通过Web服务接口与嵌入式设备的互通信息,并实时显示在前台页面中。本项目所提供的Web页面之一如图3所示。
图3 提供给用户的Web界面
3 嵌入式设备程序
我们采用了Linux+QT的软件开发平台来进行嵌入式设备的软件开发。当系统采集到信息之后,会定时(间隔3 s)访问Web服务接口,QT提供了一种http Request方案。在嵌入式设备的开发当中,主要包括数据的封装与发送。
3.1 数据封装
在QT平台上,借用了开源Json代码来进行数据的封装与解包。它提供了encode和decode两个函数,只需调用这两个接口即可对数据进行操作。解包出来的数据以map容器形式出现,代码当中将容器中的数据提取出来即可进行处理。
3.2 数据发送与接收
在本项目当中,嵌入式设备采集到相关信息后会发送到服务器,并且接收服务器的处理结果进行相应的显示。通过QT的信号—槽机制来整合对数据的发送与接收过程,在系统启动之初将QtNetwork的接收信号与我们的处理函数相连接,这样,在接收到服务器的返回数据之后,系统即可进行相应的处理与显示,系统流程图如图4所示。
图4 客户端数据发送与处理流程
结语
本文讨论的基于Web服务的嵌入式Web Server的实现方法及应用的主要技术,使得开发者可以根据目标硬件平台的实际资源进行选择,不用再因为硬件资源的限制而降低Web Server的性能。同时,PHP脚本的引入,使得Web Server的功能与灵活性大大增强。更具实用意义的是,不仅嵌入式设备,其他智能手机等设备也完全可以与Web Server进行通信,实现了多平台的整合。目前该方案已在多款开源平台上被实际应用,在工程实践中证明了其可行性。