随着数字信息技术和网络通信技术的发展,人类已进入后PC时代。后PC时代的一个显著特点是设备的联网,出现了像现场总线、工业以太网等工业现场设备的联网技术。由于这些现场总线和工业以太网专用性很强,实施成本高,开放性不够好,同时售后维护费用还很高,维护不方便,软件升级麻烦,所以当前人们纷纷研究嵌入式设备的直接联入互联网技术(即嵌入式Internet技术)。
1系统结构
图1中,虚线框内是本设计中嵌入式WEB服务器的系统结构图。
图1嵌入式WEB服务器系统结构图
整个系统采用B/S模式,连接到Internet的计算机通过浏览器访问嵌入式WEB服务器,实现对现场交流伺服系统的监控。该模式与传统的C/S模式相比,使用简单,便于维护,扩展性好,因此已成为主流。
2嵌入式WEB服务器的研究与设计
2.1嵌入式WEB服务器工作原理
嵌入式WEB服务器的工作原理如图2所示。本设计的嵌入式WEB服务器系统软件主要由HTTP WEB Server守护任务模块、CGI程序和串口通信模块3部分组成。
图2嵌入式WEB服务器的工作原理图
下面简单叙述其工作过程:
服务器端软件的守护程序始终在HTTP端口80守候客户的连接请求,当客户端向服务器发起一个连接请求后,客户和服务器之间经过3步握手建立起连接。守护程序在接收到客户端HTTP请求消息后,对其进行解析,包括读取URL,映射到对应的物理文件,区分客户端请求的资源是静态文本页面还是CGI应用程序等。如果客户请求的是静态文件,那么守护任务程序读取相应的文件作为HTTP响应消息中的实体返回给客户端,客户端浏览器通过解码读取相应的内容并显示出来。如果客户端的请求是CGI应用程序,那么服务器将创建响应的CGI应用程序进程,并将各种信息(如客户端请求信息和服务器的相关信息等)按CGI标准规范传递给CGI应用程序进程,接着由此CGI进程接管对服务器需完成的相关操作的控制。
CGI 应用程序读取从HTTP WEB Server传递来的各种信息,并对客户端的请求进行解释和处理,例如使用SQL 语句来检索,更新数据库,或者启动串口数据通信进程,将从客户端获得的数据按RS232C通信协议重新组帧,从UART 口发送到现场被控对象。最后CGI 应用程序会将处理结果按照CGI 规范返回给HTTP WEB Server,HTTP WEB Server会对CGI 应用程序的处理结果进行解析,并在此基础上生成HTTP 响应信息返回给客户端。
2.2硬件设计
嵌入式WEB服务器的处理器选用Samsung公司的ARM9系列芯片S3C2410A。本设计用到的接口资源有两路UART,一路用作与现场设备数据通信,另一路作为测试调试使用;同时还用到SD卡接口,方便以后扩展内存空间。由于这款处理器片上没有网络控制器,所以需要外接一个网络控制器,本设计选用RTL8019AS 10M网络控制器。硬件结构如图3所示,主要包括网络通信模块、异步串口通信模块、存储模块以及电源、时钟、复位、看门狗模块。
图3嵌入式WEB服务器的硬件结构图
由于篇幅原因,下面主要介绍一下网络通信模块。
网络通信模块主要是由RTL8019AS以太网控制芯片和网络滤波器、数据缓冲器、收发器、RJ45接口构成。RTL8019AS有8位和16位两种工作模式,通过JP引脚来改变(接高为8位数据模式,接低为16位数据模式)。RTL8019AS的8位数据线D0~D7通过一个8位双向总线转换器74LVCC4245A,与S3C2410A的低8位数据位相连;RTL8019AS的低5位地址线通过一个8位三态数据缓冲器,与S3C2410A的低5位地址线相连。为了提高网络通信的抗干扰能力,使用引脚TPIN+、TPIN-、TPOUT+和TPOUT-连接GROUPTEK公司的20F01网络滤波器,利用RJ45插头实现与以太网的连接。
2.3软件设计
嵌入式WEB服务器的软件开发主要包括以下几项内容: ① 完成嵌入式操作系统ARMLinux的移植和TCP/IP协议族的裁剪;② 编写HTTP WEB Server;③ 编写CGI应用程序,包括URL解码程序、各功能模块子程序以及输出浏览器显示页面程序等;④ 移植嵌入式SQLite数据库;⑤ 编写RS232C串口通信程序,完成整个系统的软件调试与测试。下面重点讲述内容①、②、③。
2.3.1TCP/IP协议族的裁剪及Socket编程
TCP/IP协议包括很多的协议,鉴于嵌入式WEB服务器的应用场合和有限的资源,并不是所有的协议都需要实现,应根据系统的要求有选择地加以实现。以太网数据的传输是采用MAC地址来识别的,为了保证系统在以太网的正常通信,首先得实现ARP协议,因为ARP协议提供IP地址到MAC地址的转换功能。嵌入式WEB服务器要实现在Internet上通信,在网络层一定要实现 IP协议,以及能报告数据传送差错等情况的 ICMP协议,因为IP协议是面向无连接的,它无法将状态信息和错误信息传到最初的主机上,因此要通过网际控制报文协议(ICMP)来实现。在传输层主要有TCP协议和UDP协议,UDP协议是面向无连接的数据报文传输协议,而 TCP协议则是面向可靠的数据流的传输。基于应用的需要和对可靠性的要求,在传输层采用 TCP协议,并对 TCP协议进行了简化处理。在应用层,远端主机是通过浏览器的访问控制方式来读取数据的,所以要实现HTTP协议。其他一些在 Internet上应用较广泛的协议(如FTP协议、SMTP协议等)在此无需实现。
(1) IP协议的裁剪
嵌入式系统只把IP作为传输工具,进行简化以完成主要的操作。得到IP包后,检验IP头部的版本、目的地址及校验和是否正确,并解析出协议类型字段,由此交给相应的高层协议处理。发送IP包时,将缓冲区内的源地址与目的地址互换,设置校验和,然后交给下层协议处理。若不符合要求,则将此包丢弃。IP包最大可以为65 KB,可以分段传输,而在嵌入式系统中根本无法容纳如此大的数据包,一般不支持分段传输,所以对于分段的功能可以裁剪掉。通过限制ARM发送和接收数据包的方式来避免分段传输,从而降低程序复杂度。
IP协议主要实现2种功能,分别是对接收的数据包首部进行校验和检查,以及对IP数据包进行解析。由于在设计过程中,裁剪了整个UDP协议,因此IP层只需要识别ICMP包和TCP包,然后根据数据包的类型进行相应的处理。主要函数有:
◆ WORD CHECK_IP_HEAD (DATA *BUF, WORD DA_SIZE, DWORD IN_HEAD)——校验函数,负责对IP包头的首部校验和进行处理;
◆ VOID IP_INPUT (STRUCT IP_EM_HEAD DATA *MEM_HEAD)——IP接收函数,根据协议类型提交上层协议处理;
◆ BOOL IP_OUTPUT (STRUCT IP_EM_HEAD DATA *MEM_HEAD)——IP发送函数,包括生成IP报头,调用以太网发送函数将IP包发送给以太网接收模块。
(2) TCP协议的裁剪
在TCP协议中采用“停止等待算法”代替“滑动窗口算法”。一方面是由于数据量小,对网络拥塞不会产生太大影响,从而可以裁剪TCP的流量控制功能;另一方面则是因为数据量小时,采用停止等待算法的传输效率和滑动窗口算法的效率差不多,因此采用简单停止等待算法代替复杂的滑动窗口算法,不但降低了实现难度,提高了处理速度,同时取消了TCP发送缓存区和接收缓存区,从而减小了占用存储空间。
研究发现,如果TCP层的上层实现服务器端的应用,可以将标准TCP状态机建立连接过程中客户端建立连接的状态机部分简化掉,即将主动创建连接的SYNSENT状态,主动关闭连接的FINWAIT1、FINWAIT2、CLOSING、TIMEWAIT状态。同理,如果应用是基于客户端的,还可以将服务器建立连接的状态机部分简化掉。当处于监听状态的服务器收到客户端的请求时,发送“ACK+对方发过来的SYN数据片”。当收到来自客户端的一个仅含有ACK的空数据片后,双方进入Established状态建立连接,之后可以进行TCP数据通信。这样既节省了系统开销,同时也保证了所有的数据段都能安全正确地到达目的端。
精简后TCP/IP协议族的实现流程如图4所示。
图4精简后TCP/IP协议族的实现流程图
(3) Socket编程设计
本系统在传输层采用的是TCP协议,所以为实现WEB服务功能采用的是流式套接字,具体使用方法如图5所示。
图5流式套接字用法流程图
2.3.2CGI程序设计
客户端与服务器通过 CGI标准接口通信的流程如图6所示。CGI程序由客户端软件发送的基于 HTTP协议的请求和命令触发,将客户端的请求和命令传给服务器端相应的应用程序;在服务器端相关的程序完成相应操作后,CGI程序通过标准的输出流以打印输出的形式将结果返回给客户端。当HTTP WEB Server收到CGI程序字段“Contenttype: text/html加一空白行”或“Contenttype: text/plain加一空白行”时,分别表示CGI程序后面输出的是要传给客户端浏览器的HTML文档或纯文本文档。
图6客户端与服务器通过CGI标准接口通信示意图
基于这种交互模式,客户端可以查询和设置现场设备的一些参数;当出现故障时,专家远程可以根据现场的运行状态进行诊断,提出诊断方法和建议,便于现场设备的监控与维护。考虑到目前ARMLinux对 C语言的良好支持,以及 C语言的平台无关性、C代码的高效简洁,及其在同等编程水平下安全性好等特点,选用 C语言来编写 CGI程序。
CGI程序主要分为以下几部分:
① 接收客户端提交的数据。有两种方法:GET方法和POST方法。若以 GET方法提交数据,则客户端提交的数据被保存在QUERY_STRING环境变量中,通过调用函数getenv("QUERY_STRING")来读取数据;若以 POST方法提交数据,则程序先从 CONTENT_LENGTH环境变量得到数据的字长,然后从标准输入中读取相应长度的字符串即可得到客户端提交的数据。
② URL编码的解码。这个过程较为复杂,在 URL编码的规则下:变量之间用“&”分开;变量name与其value之间用“=”连接;空格符用“+”代替;特殊意义的字符用“%”接相应的十六进制 ASCII码代替。解码即编码的逆过程。在程序中,只要对于由①所述方法提取的数据进行URL编码逆操作,就可以得到客户端传过来的数据。最后将解析出来的name/value保存在一个自定义的结构体中,此结构体定义如下:
typedef struct name_value_st {
char name[FIELD_LEN+1];
char value[FIELD_LEN+1];
}name_value;
name_value nam_val_pairs[NV_PAIRS];
将十六进制 ASCII码值表示的特殊字符转换成相应的 ASCII字符的函数是参照NCSA Server实现的。
③ 根据上一部分解析出来的变量/值对,判断客户端请求的含义,利用 Linux下进程间通信机制传送消息给相应的应用程序主进程,以完成客户端请求要完成的任务(如系统某些参数设定、远端设备的运行状态量等)。应用程序将执行结果返回给 CGI进程,由 CGI进程先输出“Contenttype: text/html加空格行”到HTTP WEB Server;然后用printf()函数产生 HTML源代码传给HTTP WEB Server,HTTP WEB Server再按各层协议将数据打包把执行结果返回给客户端。
3嵌入式WEB服务器的应用实例与性能分析
3.1应用实例
本设计的嵌入式WEB服务器系统的一个应用实例就是将其应用到现场交流伺服系统中,以实现其远程监控与故障诊断。主监控界面如图7所示。
图7交流伺服远程监控与故障诊断系统主监控界面
通过WEB页面实现的功能有远程设定控制参数、定时或手动实时显示现场交流伺服系统运行状态、下载更新程序、实时报警等。
3.2性能分析
性能测试的试验环境为: 1块嵌入式WEB服务器应用板、1台数字交流伺服系统、1台PC机以及10M以太网网络报文监视分析工具Iris。在PC机上启动两个进程:一个是打开支持JavaScript的浏览器软件(测试时使用的是MYIEGB1.0),输入嵌入式WEB服务器的IP地址(实验时的设定值为192.168.1.60),输入用户名和密码,进入主监控页面;另一个进程是在网页中进行各种监控操作。
系统对 HTTP请求的响应时间是通过 PC机发送 HTTP请求与整个文件返回的时间差来测试的。在建立TCP连接时,报文比较简单,处理时间是μs级的;完成 TCP连接后,开始传送 HTTP数据,处理时间为 ms级,这是由于涉及到文件读取和维护 TCP状态等操作。系统对部分文件的处理时间如表 1所列。
表1系统对部分HTTP请求的响应时间序号文件名文件大小
表1中的数据只是某次各程序请求的处理时间,实际测试时每一请求做5次记录,记下5次的时间,并求平均值得到系统对各程序的处理时间。按表1中序号顺序分别为0.439 s、0.183 s、0.193 s、0.188 s、0.179 s、0.174 s,不同大小的CGI程序其响应处理的时间差不多。由此可知,其时间延时主要来自网络传输。
由于测量误差的存在以及网络状况不稳定等因素的影响,以上数据只能近似反映系统的性能。但可以肯定,在响应此类复杂程度的 HTTP请求的处理时间均为 ms级,可以满足实际监控任务的需要。
结语
本文提出了一种基于ARMLinux操作系统的嵌入式WEB服务器的设计方法,并给出了相应的软硬件设计和一些实现的关键技术;重点讨论了为满足嵌入式网络通信的需要对目前的TCP/IP协议族的裁剪,并利用Socket编程和CGI程序完成了整个WEB服务器的设计。同时,成功地将其应用到现场交流伺服系统中,实现了交流伺服系统的远程监控。该嵌入式WEB服务器具有成本低、开放性好、可移植性强等优点,便于后期维护和升级。由于此设计的嵌入式WEB服务器是一个单独的模块,提供的是标准接口,只要在软件上作少许的修改就能很容易地应用到其他的嵌入式设备(如智能家电、现场节点等)中,具有一定的推广价值。