张锋辉,王祥清,苏守宝
无文件系统的嵌入式Web服务器设计
*张锋辉,王祥清,苏守宝
(皖西学院信息工程学院,安徽,六安 237012)
针对嵌入式设备资源有限及嵌入式Web应用于具体领域时工作流程固定的特点,提出了一种无文件系统的嵌入式Web服务器。在实时操作系统UC/OS-II的基础上裁剪并移植了Lwip协议栈,在研究标准CGI程序的基础上设计并实现了嵌入式CGI程序,成功的设计了无文件系统的Web服务器并实现了其监测功能。
嵌入式网关(CGI);Web服务器;Lwip;UC/OS-II;文件系统;ARM
随着信息技术的迅猛发展,嵌入式设备与Internet技术的结合将成为信息时代的必然趋势,将智能家电,工控节点等连接到网络中已成为研究热点[1]。网络专家也预测将来在Internet传输中将有70%的信息来自嵌入式系统。
嵌入式设备的资源相对有限,很多都用于专用的地方,其工作流程较为固定,如在智能家居,一些工业控制等。目前在一些嵌入式Web服务器大多都建立在Linux操作系统之上,并且都使用了文件系统[2-4],但Linux需要的硬件配置较高,文件系统也需要Nand Flash作为硬件基础,这样会增加服务器的成本。一些无操作系统的嵌入式Web服务器[5]虽然降低了硬件配置但在使用时可扩展性不高。
基于以上考虑在流程较为固定的地方使用嵌入式Web服务器,可以不通过文件系统而直接对设备进行监控。本文提出了一种无文件系统的嵌入式Web服务器的设计方法并将其实现。用B/S架构的Web服务器取代传统的C/S架构,用户只需要输入检测设备的Ip地址即可访问与监测设备的信息。
系统采用NXP公司的LPC2294作为服务器的主控芯片,它集成了ARM7TDMI-S内核,最高主频可达60M,内部有16K的静态RAM和256K的Flash的程序存储器,是一款使用于中低端用户的工业控制级的微处理器。网络芯片采用10/100M的以太网控制芯片DM9000E。调试接口采用标准的JATG接口,检测设备与服务器通过RS232总线来连接。
本系统采用操作系统加以太网协议栈的方法进行设计。操作系统使用UCOS- II,它是一个源代码公开,移植性较强的,占先式的多任务管理的实时性操作系统内核,其实时性高可以和一些商业性操作系统相媲美,并且已经在实际中得到了成功了运用[6]。UCOS- II只是一个操作系统内核,可根据具体的芯片进行适当的裁剪,它已经被成功移植到多种架构的处理器上,如流行的ARM,MIPS,PowerPc等。其他相关的外围软件如:网络传输协议栈,文件系统,图形用户界面,用户可根据实际的需要进行适当的选取,移植,编写底层的驱动,将它们融和成实用的系统。
该设计采用UC/OS-II2.76版本内核,并针对平台经行了移植,移植了以太网协议栈Lwip,并编写芯片DM9000E的驱动程序。在没有移植文件系统的条件下成功运用HTTP协议设计了一个实用的嵌入式CGI程序,在此基础上建立了Web服务器。在UC/OS-II系统下设计了串口程序对温度传感器的进行测试并以网页的形式传送给浏览器。其系统的软硬件结构示意图见图1:
图1 嵌入式Web服务器结构示意图
以太网协议栈采用的是Lwip。它是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。
Lwip除了实现TCP/IP协议的各个模块(IP、ICMP、UDP、和 TCP),同时设计了许多支持模块。这些支持模块组成了操作系统模拟层、缓冲和存储管理子系统、网络接口函数和一些处理因特网校验和的函数。Lwip使用的过程模型是:它把所有协议封装到一个单一的过程中,从而与操作系统内核分开。应用程序可能也驻留在lwip处理过程中或者在单独的过程中。 TCP/IP栈和应用程序之间的通信可以通过函数调用实现,也可以通过更为抽象的API。Lwip既可以移植到操作系统上,又可以在无操作系统的情况下独立运行,Lwip的实现的重点是保持tcp/ip主要功能上减少对内存的占用,其分层明确它运行时一般只需要几十kb的RAM和40多kb的ROM,因此特别适合在低端的嵌入式设备中使用。
在进行Lwip移植时,需要对操作系统的模拟层添加一定的代码,操作系统模拟层(sys_arch)存在的主要目的是为了方便lwip的移植,它在底层操作系统和Lwip之间提供了一个接口,移植时候只需要改动这个接口即可。我们为操作系统模拟层提供了信号量和邮箱两种进程间通讯方式,只保留了Lwip以太网通信的基本功能,去掉其中的ipv6部分及telnet,ppp服务等,所以给操作系统模拟层只提供了一个线程即可满足设计需要。
Lwip和操作系统的接口主要是建立文件数据类型、编写信号量操作函数、邮箱操作函数、建立一个新线程函数、实现sys_arch_timeouts()函数、实现临界保护函数等。由于UC/OS-II为我们提供了大量的信号量的操作函数,故只做少量的修改即可完成Lwip要求的信号量操作,在UC/OS-II中建立一个新任务也就是建立一个新线程,同时运用UCOS-II的开关中断的方式实现了操作系统模拟层要求的临界保护函数,为了让Lwip更有效的工作,我们利用UCOS-II提供给的消息队列,可以让多条消息投递到这个消息队列,我们建立了一个邮箱的单向链表,一个邮箱是一个消息队列,可以允许多个消息投递到此邮箱。提供了一个具有静态存储期的数组,为每一个线程提供一个固定的sys_timeouts结构,从而实现sys_arch_timeouts()函数,从而完成与操作系统的通信工作。
Lwip和下层驱动程序的接口主要是建立初始化函数、入口函数以及初始化底层接口函数。建立LwipEntry.C程序,添加一些代码建立入口函数的基本结构,添加__ilvInitLwIP()这个函数负责完成 LwIP对使用的内存区、PBUF、PCB以及 OS 模拟层等各个方面最基本的初始化化工作。添加__ilvSetLwIP(),这个函数完成 LwIP 的初始配置工作,实现网络驱动与 LwIP 的接口它会告诉 LwIP网络数据的发送出口,建立网络数据的接收入口并实现接收入口与 LwIP 处理入口的对接。在原有的的ethernetif_init()添加一些初始化网络驱动的函数,从而完成与底层驱动程序的通信工作,至此我们已经完成lwip的移植工作。
Lwip已经写好了与驱动程序接口的大体框架,只需要在框架上完成与底层硬件相关的部分即可,按照如图三方式逐个添加与编写底层驱动:
图2 以太网驱动函数框架
图3 接收函数框图
按照框架需要完成三个函数的编写网络芯片的初始化函数、发送数据函数和接收数据函数。在网卡初始化函数low_level_init()里添加DM9000E_Init()。完成对LPC2294ARM芯片的IO属性的设置,对DM9000E进行了复位,对内部的寄存器进程设置包括MAC地址的写入等完成了初始化工作。在链路层发送函数low_level_output()中编写Send_Pact()它负责把数据从Lwip提供的数据结构 pbuf 中搬运到 DM9000E 发送缓冲区中完成向网络发送数据的功能。在链路层接收函数low_level_iutput()中编写Re_Pact()函数负责把数据从接收缓冲区转移到pbuf中完成接受数据包向上传递的功能。三个函数的主要功能的流成图如下:
图4 送函数框图
随着 Web技术的迅速发展 Brower/Serve(B/S)已成为流行的开发模式,这种方式基本上不用开发客户端程序,只需对服务器端程序进行开发程序,在客户端采用诸如IE 这样的浏览器对服务器上的数据进行浏览或控制。(即可对工业现场或智能家具等进行远程监控。可去掉)具有方便易于操作等优点。基于以上特点本设计采用B/S模式代替传统的C/S模式。
HTTP(HyperTextTransferProtocol,超文本传输协议)是在TCP/IP协议之上的基于请求/应答模式的协议,是浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议,它是从客户机/服务器模型发展起来的。客户与服务器连接时,首先向服务器提出请求,服务器根据客户的请求完成处理并给出响应。浏览器就是与Web服务器产生连接的客户端程序,它的端口为TCP的80端口,浏览器与Web服务器之间遵循的就是HTTP协议[7]。
HTTP的复杂性与低速处理器资源的有限性构成了对较为尖锐的矛盾,但可以从对Web服务器功能进行最小化定制的角度出发,通过简化HTTP的一些机制来缓解这种矛盾,在低速处理器中实现简化的HTTP以实现功能最小化的Web服务器[8]。因此,可从以下两个方面对其进行简化:
(1)对请求数据报文的解析。服务器只接收GET请求方法,对不是GET请求的不予响应。此处分别设置了两种请求,一种是对页面的请求,另一种是对数值的请求。
(2)对应答数据报文的封装。保留HTTP数据报文的协议版本号、应答状态码、应答字符等一些相对固定的东西。去掉服务器类型、内容类型等一些不是必须的参数。把这些报文放到内存中去,提高处理器处理读取数据的效率。
CGI(通用网关接口)定义了Web服务器与CGI脚本之间的接口标准。其主要功能是在 Web环境下从客户端传送一些信息给 Web服务器,Web服务器把接收到的有关信息放入环境变量,然后再去启动所指定的CGI脚本以完成特定的工作,CGI脚本从环境变量中获取相关信息来运行,最后以HTML格式输出相应的执行结果返回给浏览器端.由于用户能传递不同的参数给 CGI脚本,所以CGI技术使得浏览器和服务器之间具有交互性。
由于嵌入式资源相对有限,而标准的CGI需要文件系统等的支持,所以没有文件系统的嵌入式CGI和标准的CGI有所区别,有一些自己的特点:
(1)没有标准输入 , CGI函数可以直接获取到浏览器送来的信息。
(2)没有标准输出,CGI函数可以直接将封装好的数据送回给浏览器。
(3)没有环境变量, CGI和Web服务器在同一程序中实现用一些函数代替环境变量来交换信息。
根据以上特点,当用户点击网页上的监测温度的按钮时,服务器调用预先编写好的CGI程序,通过串口采集温度传感器的信息并返回给CGI程序,通过Temp_Con()函数把数据转化为摄氏温度,加上内存中的HTTP报文发送给客户机,通过浏览器直接显示给用户。
在UC/OS-II下创建一个任务专门用来存放和发送一个固定的网页,包括有各种控制按钮用以发送信息,以及信息栏等待接收及更新信息,用户可发送消息进行温度的监测。
Web_Receive()函数的主要功能是接收请求、读请求、分析是否为要求监测温度的信息,服务器只接收GET请求方法,对不是GET请求的不予响应,如果是则调用Do_Temp()函数进行处理。
Do_Temp()调用串口程序监测温度传感器的数据,并调用Temp_Con()函数把温度信息并转化为摄氏温度,存入预先设计好的Temp结构体中。
Web_Return()函数根据测试的温度信息,加上具有返回原网页的按钮语句并封装了简化的HTTP报文传回测量的温度给浏览器。
Web服务器的IP地址为192.168.0.174,测试终端PC机也位于同一网段内IP地址为 192.168.0.176。在测试终端的IE地址栏中输入嵌入式Web服务器的地址:http://192.168.0.174,点击测试温度按钮。运行我们看到温度为当前温度如图5,点击“返回”则回到原测试界面。
图5 当前温度
无文件系统的嵌入式web服务器,节省了系统资源,提高了工作效率,简化了开发的流程,调用函数直接对硬件进行操作,省去了中间环节,可以根据不同的硬件变更相应的操作。但是它的通用性不强,随着硬件的变动要进行变更,另外安全性也是一个问题,目前只使用于安全系数要求不高的地方,但是对于资源相对较少的一些芯片有很高的使用价值。
[1] 彭少熙.家庭网络中的嵌入式internet方案[J].电子应用技术, 2001,26(10):47-50.
[2] 张曦煌,柴志雷.嵌入式Web服务器中CGI的特点及实现小型微型计算机系统[J].小型微型计算机系统 2003(11):46-48.
[3] 孙辉,陆松年,杨树堂.基于Linux和$3c2410的嵌入式Web Server的研究与实现[J].计算机应用与软件, 2007, 24(2):134-136.
[4] 姚洪智,郑雪峰,曹磊.基于CGI接口实现嵌入式系统远程控制[J].微机发展, 2004,14(9):7-10.
[5] 张曦煌,柴志雷.嵌入式Web在无操作系统支持环境下的设计及实现[J].计算机工程与应用,2004,24(4):175-177.
[6] 任哲,潘树林,房红征 .嵌入式操作系统基础uc/os-II和Linux[M].北京: 北京航空航天大学出版社,2006.
[7] 光军.动态网站设计编程技法[M].北京: 北京航空航天大学出版社 ,2001.
[8] 司凤山.单片机上简单嵌入式Web服务器的设计与实现[J]. 计算机应用与软件,2008,25(5):179-181.
STUDY AND DESIGN OF EMBEDDED WEB SEVER WITHOUT FILE SYSTEM
*ZHANG Feng-hui,WANG Xiang-qing,SU Shou-bao
(College of Information Engineering West Anhui University, Lüan, Anhui 237012, China )
Existing embedded equipment with limited resource and fixed tasks, an embedded web sever without file system is offered. A Lwip protocol stack is edited and transplanted based on real time operating system of UC/OS-II .With the study of standard CGI, the program of embedded CGI is designed. We successful designed the web sever with the function of monitoring.
CGI; Web server; Lwip; UC/OS-II; file system; ARM
1674-8085(2012)03-0062-04
TP393.06
A
10.3969/j.issn.1674-8085.2012.03.013
2012-03-30;
2012-04-12
国家自然科学基金项目(61075049) ;安徽省高校优秀青年人才基金项目(2011SQRL151)
*张锋辉(1982-),男,河南洛阳人,助教,硕士,主要从事嵌入式系统及应用研究(Email: zfhiwillwin@163.com);
王祥清(1982-),男,安徽六安人,助教,硕士,主要从事嵌入式系统及应用研究(Email:94364574@qq.com);
苏守宝(1965-),男,安徽六安人,教授,博士,主要从事群智能计算与嵌入式控制优化等研究(Email:sushowbao@gmail.com).