引言
随着嵌入式技术的迅速发展,嵌入式系统的应用越来越广泛。而网络通信技术的发展,使得B/S(服务器/客户端)应用模式成为一种趋势。嵌入式Web服务器将其功能嵌入到芯片中,通过相应的硬件平台和软件系统,将传统的、基于专业服务器的互联网网络转变为以嵌入式系统为平台、TCP/IP为底层通信协议、Web技术为核心的网络测试和控制设备,它具有成本低廉,体积小,设计灵活等特点。本文正是在此前提下,设计并实现了一种简化的嵌入式Web服务器,该服务器具有支持多HTTP连接,支持HTTP的GET/POST请求、支持改进的公共网关接口、支持动态网页等功能。
系统硬件设计
系统组成
本文设计的嵌入式Web服务器采用低价格、高性能ARM7芯片LPC2210为主控芯片,通过SPI接口控制以太网控制器芯片ENC28J60实现TCP/IP通信。采用基于操作系统μC/OS-Ⅱ的软件设计,以提高整个设计的稳定性与扩展能力。图1为本文设计的嵌入式Web服务器的硬件系统组成。
图1 嵌入式Web服务器硬件系统组成(略)
最小系统
主控芯片采用ARM7芯片LPC2210,内部仅有16 KB的RAM,不带有片内Flash。由于μC/OS-Ⅱ和TCP/IP协议栈的移植,且要进行简单网页的存储,因此在LPC2210外分别扩展了512KB的SDRAM以及2MB的Flash。LPC2210含 有SPI接口,满足操作以太网控制器ENC28J60的要求。同时,LPC2210含有SCI、I 2 C等外部资源,方便系统功能扩展。由于LPC2210工作在+3.3V,但是其内核的工作电压是+1.8V,所以设计电源时要考虑+3.3V供电以及+1.8V供电。此外,本设计中还使用了带“看门狗”的专用复位芯片以提高系统抗干扰能力。
TCP/IP通信模块
本文采用Microchip公司推出的SPI接口的以太网控制器ENC28J60,其最大通信速率为10Mbps。ENC28J60引脚简单,通过 SPI接口和 LPC2210相连接,网络的四个引脚通过网络变压器后连接到RJ45接口,两个中断引脚接单片机的外部中断或者连接到通用I/O口,两个指示灯引脚外接发光管连接到地或者电源,其余引脚是电源和地,简化了硬件设计难度。图2为ENC28J60接口电路图。网口插座采用内置网络变压器、状态显示灯和电阻网络的RJ45接座HR911105,具有信号耦合、电气隔离、阻抗匹配、抑制干扰等优点。
图 2 ENC28J60 接口电路图
TCP/IP通信的实现
ENC28J60硬件驱动设计
ENC28J60所执行的操作完全依据外部主控制器通过SPI接口发出的命令,这些命令为一个或多个字节的指令,用于访问控制存储器和以太网缓冲区。指令至少包含一个3位操作码和一个用于指定寄存器地址或数据常量的5位参数,指令后还会有一个或多个字节的数据。ENC28J60共有七条指令,表1显示了所有操作的命令代码。通过SPI接口对ENC28J60相应寄存器进行读写操作即可完成ENC28J60硬件驱动设计。
表1 ENC28J60的SPI指令集(略)
MCHPStack实现TCP/IP通信
由于本设计中选择用Microchip公司的以太网控制芯片ENC28J60实现TCP/IP通信,所以同时选择该公司提供的协议栈MCHPStack作为参考。MCHPStack是Microchip公司为其生产的微处理器进行以太网应用而开发的一个协议栈,整个框架结构清晰地体现出了OSI参考模型的分层思想。通过该协议栈提供一个状态机函数,如图3所示,可以方便地实现ARP、IP、ICMP、UDP以及TCP通信。TCP作为运输层协议,是应用层协议HTTP的基础,要实现HTTP协议只需要在TCP基础上进行应用程序设计即可完成。
图3 TCP/IP协议栈的状态机流程图(略)
在移植协议栈的过程中需要注意两点:一是数据的大小端格式,一是结构体字节对齐。TCP/IP各层协议所使用的字节序均为big-endian字节顺序,而LPC2210为little-endian字节顺序。本文使用的编译环境ADS支持4字节结构体对齐,而协议栈中结构体是单字节对齐的。因此,LPC2210在对以太网控制器进行数据读写时,既要进行字节顺序转换,又要使用#pragma _packed定义结构体按单字节对齐,否则无法正确地进行数据报的解析,以致无法正确实现TCP/IP通信。
嵌入式Web服务器的实现
使用简单文件系统MPFS实现网页存储
本文设计的Web服务器采用Microchip提供的简单文件系统MPFS来 存储网页。MPFS以一个或多个MPFS FAT(文件分配表)条目开始,后跟一个或多个文件数据。图4(a)为MPFS条目格式。FAT条目描述文件的名称、位置以及状态,其中标志表示当前条目正在使用、已被删除或在FAT的结尾。MPFS 使用“8+3”格式(8个字节用于实际文件名,3个字节用于扩展名,即NNNNNNNN.EEE)的“短”文件名。16位地址给出第一个文件数据块的开始地址。所有文件名都用大写字母存储,以方便文件名的比较。
图4(a) MPFS条目格式(略)
MPFS中每个FAT条目中的地址指向包含实际文件数据的数据块,图4(b)中显示了数据块格式。数据块以名为EOF(End of File)的特殊8位标志结束,后跟0xFFFF。
在利用简单文件系统MPFS进行网页存储时,首先判断MPFS条目格式的标志是否表示当前条目可用。如果是,则比较文件名,若文件名符合,则按照当前地址查找MPFS的数据块;若文件名不符合,则查找下一条目,直至全部找完。如果还是没有,则返回错误信息。如图5为按照文件系统MPFS提取网页内容的流程图。
图4(b) MPFS数据块格式(略)
图5 提取网页内容流程图(略)
公共网关接口 公共网关接口(CGI)在嵌入式Web服务器中,提供了一个执行外部程序的通道,使得浏览器和服务器之间具有交互性,也就形成了动态网页。一般地,浏览器将用户输入的数据送到Web服务器,Web服务器将数据送给CGI程序。在执行CGI程序后,可能会访问存储数据的一些文档,最后输出HTML形式的结构文件,经Web服务器送回浏览器显示给用户。本文设计的嵌入式Web服务器实现了CGI的一个修订版本,一般意义上的CGI是一个不依赖于Web服务器的应用函数,本设计中使用的CGI是HTTP中的一个函数,由Web服务器负责解析并相应处理,实现数据交互功能。
图6 CGI实现动态网页流程图(略)
动态网页的实现
一 般的静态网页只能满足客户端浏览网页的功能,无法满足客户端与服务器端的数据交互,因此在诸如远程监控等许多场合实用性不强。而使用CGI接口,浏览器可以在HTTP内部调用函数并以网页的形式接收结果,即实现动态网页,能够有效解决客户端与服务器端数据交互的问题。设计中相应的CGI文件(*. cgi)必须包含文本字符串"%xx",其中"%"是控制代码,"xx"代表两位变量标识符,其值为0~99。当HTTP服务器调用CGI文件,遇到这个文本字符串时,它将除去"%",并将"xx"提取出来,交给相应函数进行处理。本设计中浏览器使用HTML GET的方法以及多个参数来调用函数,服务器对其进行解析并使用实际方法代码和它的参数来调用主应用程序,在服务器主应用程序中设计了相应的代码来实现回调函数。图5给出了通过CGI实现动态网页的流程。
结束语
嵌 入式Web服务器是嵌入式技术与网络通信技术相结合的产物。随着嵌入式技术以及网络通信技术的发展,嵌入式Web服务器具有广阔的应用前景。本文中简化的嵌入式Web服务器的实现方案,采用高性能的ARM微处理器,通过SPI接口控制以太网控制器芯片ENC28J60,并移植了源代码完全公开的操作系统μC/OS-Ⅱ以及TCP/IP协议栈,不仅成本低廉、设计简单,而且运行稳定,应用于远程监控等场合,取得了理想的效果。 |