引言
随着信息技术、网络技术和嵌入式系统的飞速发展,微型化嵌入式设备接入互联网是大势所趋。相对于中小型WEB服务器,微型嵌入式WEB服务器的优点显而易见。其体积小、价格低,最重要的是功耗非常低,携带和部署方便、快捷。在远距离分布式测控系统中,希望控制节点具有接入网络的功能,这样可以方便地实现基于网络的分布式测控;同时,出于成本考虑,也希望控制节点经济、高效。本文针对分布式测控系统中对于监控节点的需求而设计,考虑以一种实用的方式实现定制化的微型嵌入式WEB服务器。网络通信功能采用开源微型TCP/IP协议栈uIP实现,嵌入式WEB服务器以uIP协议栈作为基础,采用SSI(服务器端包含)技术实现。当嵌入式WEB服务器上电运行后,可实现以动态的方式将包含有传感器、执行器信息的HTTP数据发送给客户端,客户端也能够以HTTP请求的方式向服务器端发出控制命令。此外,设计了可配置网络参数的功能,以方便部署服务器。
1 硬件设计
1.1 系统硬件总体设计
硬件部分由8位模数混合型单片机C8051F340、10/100 Mbps自适应以太网控制器CP2200、网络转接器、传感器与接口电路、执行器与驱动电路、电源组成。系统硬件组成框图如图1所示。

图1 系统硬件总体框图
1.2 网络通信硬件电路设计
网络通信电路设计分成两个部分:一部分为C8051F340[1]与CP2200[2]的硬件接口电路设计,另一部分为CP2200与RJ45网络转接器的硬件接口电路设计。网络通信硬件接口电路如图2所示。

图2 网络通信硬件电路接口设计
1.2.1 C8051F340与CP2200硬件接口电路设计
将CP2200的MOTEN和MUXEN引脚接地,使CP2200工作在非复用Intel总线模式。单片机P3口作为地址线,P4口作为数据线分别与CP2200地址线和数据线相连。CP2200的读写控制信号线RD、WR分别与单片机的P1.6、P1.7两引脚相连。C8051F340的P0.2引脚被分配给INT0,与CP2200芯片的中断信号INT相连。
当CP2200的14个中断事件中的任何一个产生中断时,图4网络数据包接收处理过程CP2200将中断状态寄存器中相应的标志位置1,并将INT引脚驱动到低电平来通知主机。在被允许的中断的所有中断标志位都被主机清0之前,INT引脚将一直保持低电平。
1.2.2 CP2200与RJ45网络转接器硬件接口设计
CP2200与RJ45连接时使用的引脚有RX+、RX-、TX+、TX-,利用RJ45实现与网络的连接。CP2200的LINK和ACT引脚与LINK LED和ACT LED引脚相连,用来指示网络状态,其中LINK是当检测到有效连接脉冲时有效,ACT则是发送或接收一个数据包时有效。
2 软件系统设计
2.1 软件总体设计
软件设计总体上采用层次式设计结构,是组合式嵌入式软件设计方法[3]的一种实现方式。从TCP/IP模型的角度看,Ethernet初始化模块和ARP协议模块位于网络接入层,完成以太网控制器的物理层初始化(PHY)、媒体访问控制层初始化(MAC)和网络地址解析(ARP),该层负责为上层提供通信接口和收发通信链路上的比特流信号。TCP/IP协议栈模块分为两个部分,以IP协议为核心的部分位于TCP/IP的网际互连层,以TCP协议为核心的部分位于TCP/IP模型的传输层。基于SSI技术的WEB服务器位于TCP/IP模型的应用层。软件总体设计示意图如图3所示。

图3 软件总体设计示意图
2.2 TCP/IP协议栈的移植
对于8位单片机,硬件资源是十分有限的,采用RTOS结合TCP/IP的设计方法用来接入网络,目前没有实际应用意义,而仅移植TCP/IP协议栈来实现网络接入可以获得良好的实时通信效果。在本设计中,移植目前常用的开源微型网络协议栈uIP[46],版本采用uIP 0.6。图4为网络数据包接收处理总体流程。

图4 网络数据包接收处理总体流程
2.3 TCP消息处理
当从uIP接收到原始TCP消息后,需要调用TCP协议解析函数对消息体解析。由于HTTP协议是基于TCP的协议,因而只需检查TCP消息体中是否包含HTTP协议。如果包含HTTP协议,则进入该协议处理流程中;如果不包含,则放弃目前的消息,继续接收和解析下一个TCP消息体。
TCP消息处理流程如图5所示,该流程对应于图4中处理TCP消息部分。WEB服务器设计基于TCP协议,并采用HTTP[78]协议实现。

图5 TCP消息处理流程
2.4 基于SSI的动态网页生成技术
SSI[910](服务器端包含)技术是动态生成网页的一种技术实现方式。当需要在响应的WEB页面中增加小段动态信息时,采用SSI技术是一种合适的选择。在8位单片机上构建基于SSI机制的嵌入式WEB服务器,需要编写专门的WEB模板解析函数,用以在HTML模板中生成动态信息。SSI解析功能与参与HTTP响应的流程关系如图6所示。

图6 SSI解析参与HTTP响应流程
要实现WEB服务器内容动态响应客户端请求的效果,需要做到实时改变HTTP消息头和HTTP消息正文中WEB页面特定内容的数据。在采用SSI技术达到这个目标时,本设计并未实现SSI全部功能,原因是解析SSI所有类型脚本需要编写标准的SSI解析引擎,要占据大量的代码空间,同时对于8位单片机的运行效率也是一个挑战,故在脚本类型的实现上作了很大的简化。SSI解析函数仅处理一种嵌入式SSI脚本类型,即显示变量值。SSI脚本的一般通用格式为:<!#element attribute=value attribute=value...>。其中,element为脚本命令类型,attribute为脚本变量,value为变量名。命令类型和变量不同,解析方式也不同。
2.5 WEB模板设计
WEB模板文件通常在单片机code区定义,该区仅具有只读属性,适合存放静态的数据。WEB模板文件是一种符合HTML标准[11]的数据格式定义。如要增加数据动态显示功能,需将动态显示数值的地方插入SSI脚本。例如,在WEB模板文件Test.html中需要动态显示当前温度的位置,插入一个名为<!#echo var="TEMPERATURE" >的标签。模板定义示例如下:
(1) HTTP1.1协议响应头模板定义
HTTP/1.1 200 OK
Cachecontrol: nocache
Connection: KeepAlive
ContentLength:<!#echo var="FILELEN" >
ContentType: text/html
(2) Test.html的WEB模板文件体定义
<table><tr>
<td>当前温度:</td>
<td><!#echo var="TEMPERATURE" >℃</td>
</tr></table>
2.6 HTTP请求与响应
处理来自客户端的HTTP1.1请求。HTTP请求由3部分组成,分别是:请求行、消息报头、请求正文。在本文中,被处理的HTTP请求包括GET方式和POST方式。GET方式请求用来获取服务器中特定WEB页面,如果GET请求URL中附加用户信息,服务器不作出处理。POST请求正文一般带有用户附加信息,服务器接收请求后要对这些信息进行处理。
2.6.1 处理GET方式HTTP请求
当有客户端向服务器地址为192.168.131.112发送GET方式HTTP请求,获取一个WEB文件名为Test.html的页面时,通常发送一个包含但不限于如下内容的HTTP1.1请求:
GET Test.html HTTP/1.1
Host:192.168.131.112
Accept:*/*
Conection:KeepAlive
TCP协议解析程序、HTTP协议解析程序分别识别这个网络数据为TCP消息,同时是HTTP1.1 GET方式请求。当判断存在Test.html网页时,WEB服务器启动SSI解析函数,置换这个网页的模板文件和HTTP1.1协议响应头模板中所有嵌入的SSI脚本,然后以HTTP响应的形式发送给客户端。
2.6.2 处理POST方式HTTP请求
当有客户端向服务器地址为192.168.131.112发送POST方式HTTP请求,表示要通过表单向服务器提交数据。如向服务器提交新的网络参数表单,通常发送一个包含但不限于如下内容的HTTP1.1请求:
POST /IpConfig.html HTTP/1.1
Host:192.168.131.112
ContentType: application/xwwwformurlencoded
ContentLength:45
Conection:KeepAlive
IP=192.168.131.113&NetworkMask=255.255.255.0
服务器端通过协议解析程序判断这是一个HTTP1.1 POST方式请求。当判断存在IpConfig.html页面时,服务器从请求正文中获取新的网络参数信息,并更新当前的网络参数。当客户端再次向服务器发起HTTP请求时,需要使用新的主机地址,这个示例新地址为192.168.131.113。同样的,通过POST请求方式也可以用来向服务器发出控制指令,服务器根据指令完成动作。
2.7 连通性稳定性测试
设定局域网路由器网络参数:IP地址为192.168.131.1,子网掩码为255.255.255.0。设定局域网内PC机IP地址:192.168.131.100。设定嵌入式WEB服务器IP地址:192.168.131.112。子网掩码均相同。将嵌入式WEB服务器接入局域网中,通过PC机ping WEB服务器检查服务器的响应速度和丢包率,实验结果如图7和图8所示。

图7 网络连通性测试

图8 网络通信稳定性测试
结语
通过实际运行与调试,基本达到了预期目的。客户端发送HTTP GET方式请求获取动态WEB页面,发送POST方式请求时,在请求正文附加表单数据,服务器通过处理表单数据完成对应的动作。