一种基于XML的数据通信模型的设计与实现
来源:岁月联盟
时间:2010-08-30
1 引言
在解决一个监控系统的信息传输问题时,遇到了一些困难,主要的原因是该系统中的数据类型多,发送的方向杂,控制起来比较繁琐。而引入XML文件后使得这个问题变得简单化。2 监控系统的数据通信
数据通信是依照一定的通信协议,利用数据传输技术在两个终端之间传递数据信息。它可实现机和计算机、计算机和终端以及终端与终端之间的数据信息传递。在分布式监控系统中,数据通信是最基本的问题。如图1所示是一个比较典型的站点式远程监控系统的模型。
3 XML及其特点
XML(EXtensible Markup Language)是可扩展标记语言,类似于HTML,但和HTML不同的是XML的标记不是预先定义好的,用户可以且必须自己定义标记。XML是用来描述数据和保存数据的一种灵活而有效的方式,能够清楚地表示出:什么是数据,有什么数据及如何组织数据。XML是Web上表示结构化信息的一种标准文本格式,广泛用于数据交换,具有“易于生成数据”的优点。 XML支持世界上几乎所有的主要语言,并且不同语言的文本可以在同一文档中混合使用,应用XML的软件能处理这些语言的任何组合。所有这一切将使XML成为数据表示的一个开放标准,这种数据表示独立于机器平台、供应商以及编程语言。XML被引入许多网络协议,以便于为二个软件提供相互通信的标准方法,如简单对象访问协议(SOAP)和XML-RPC规范。 XML数据是以纯文本格式存储的,提供了一种与软件和硬件无关的共享数据方法,所以XML数据文件可以被更多的用户、更多的设备所利用,而不仅仅是基于HTML标准的浏览器。XML是不同系统之间的桥梁。4 系统模型的建立
根据监控系统的功能要求和XML的特点,将系统的数据通信问题转化为如何实现网络文件传输和如何使用XML文件表示数据这两个子问题。同时,为了便于实现,提高系统的可靠性、稳定性及可维护性,采用层次结构,将系统的功能划分为七层模型,如图2所示:
图2 层次结构模型 (1) 物理链路层:是指网络通讯的线路,本系统采用电信的ADSL有线方式,其它也可以是局域网(双绞线、同轴电缆、光纤等)或者无线通讯方式(GPRS、GSM、CDMA等);物理链路层是系统数据通信的基础,但与上层的实现方式基本无关。 (2) 标准网络协议层:是指TCP/IP(Transmission Control Protocol/Internet Protocol)协议族,网络中TCP/IP协议叫做传输控制/网际协议,又叫网络通讯协议,是Internet国际互联网络的基础,其中的TCP协议和UDP(User Datagram Protocol)协议是两种最常用的数据通信协议。 (3) 文件传输层:使用Socket(套接字)技术实现文件的传输。Socket是Windows与网络的接口。Windows通过Socket把数据格式转换成网络传输格式,也把网络数据格式转换成Windows格式。Socket可以使用面向连接的协议(如TCP),也可以使用无连接的协议(如UDP)。Socket一般用来描述IP地址和端口,是一个通信链接的句柄。应用程序通常通过Socket向网络发出请求或者应答网络请求,可以通过Socket传送数据,进一歨封装成传送任何文件(字节流)的功能。 (4) XML文件控制层:在XML中的数据可能是接收到的数据,也可能是要发送的数据,监控中心和站点必须准确控制XML文件的接收和发送。特别是对于监控中心,可能同时接收到多个站点发送来的XML文件,发送XML文件时也要准确控制发送的目标站点。 (5) XML文件封装/解析层:这是两个相逆的过程,也是两种相对应的操作。XML文件封装是指将要发送的数据按照一定的协议打包组装成一个特定格式的XML文件,解析是指对一个XML文件按照特定的协议进行分析解读,还原出其中所描述的数据。 (6) 数据表示层:将采集到的数据、处理中的数据或者在数据库中存储的数据等各种数据格式转换为能够用XML文件描述的格式。这一层在本地操作的数据和远程传输的数据之间建立了一个通道,使两者之间互不影响,从而不会降低系统的执行效率。 (7) 业务逻辑层:实际上就是整个系统的用户接口,或者说是系统功能的实现层,包括打印单据、防作弊、报警处理、用户管理、查询统计、费用计算、实时监控、基础数据录入、系统管理等。5 系统实现
5.1 网络文件传输
5.1.1 动态链接库 本系统使用VC++开发专门用于网络文件传输的动态链接库(DLL),基于对字节流的处理可以传输任何文件,因此对于XML文件的传输来说是透明的。该动态链接库的主要接口及其功能如下: (1) 初始化。服务器端要先启动监听,客户端主动联接。 DWORD DT_Net_InitServer(BOOL bIsServer = TRUE); 参数:bIsServer表示是否将此Socket端用作服务 返回:0或者错误代码 (2) 设置回调函数接口 DWORD DT_Net_SetCallBack(LPVOID pParam,LPNET_ ACCEPT_CALLBACK pAccept,LPNET_RECV_CALLBACK pRevc,LPNET_DISCONN_CALLBACK pDisConnect,LPNET_ LOG_CALLBACK pLogInfo); 包括请求连接、接收到数据、断开连接和日志回调。 (3) 设置文件操作的回调函数接口 DWORD DT_Net_SetFileCallBack(LPCTSTR pSavePath, LPNET_SENDFILE_CALLBACK pSendFile,LPNET_ RECV FILE_CALLBACK pRecvFile,LPNET_ABORTFILE_ CALL BACK pAbortFile); 包括文件发送完毕、接收到文件、文件发送中断的回调。 (4) 服务器启动监听 DWORD DT_Net_StartListen(LPCTSTR pszLocalIP, unsigned long nSvrPort); 参数:pszLocalIP-服务器IP地址 nSvrPort-服务器端口号 返回:0或者错误代码 (5) 服务器停止监听 DWORD DT_Net_StopListen(); (6) 发送文件 DWORD DT_Net_SendFile(unsigned int nIDSocket, LPCTSTR pstrFileName, LPCTSTR pszReName=NULL); 参数:nIDSocket-Client端套接字句柄 pstrFileName-文件名称(全部路径) pszReName-文件重命名 (7) 中止文件发送 DWORD DT_Net_AbortFile(unsigned int nIDSocket); 参数:nIDSocket-Client端套接字句柄 (8) 断开连接 DWORD DT_Net_DisConnect(unsigned int nIDSocket); 参数:nIDSocket-套接字句柄 (9) 连接服务器 DWORD DT_Net_ConnectRemote(LPCTSTR pstrRemoteIP, unsigned long nRemotePort); 参数:pstrRemoteIp-服务器IP地址; nRemotePort-服务器端口号5.1.2 实现文件传输 将监控中心作为Socket Server,启动监听: DT_Net_InitServer(TRUE); DT_Net_StartListen(ServerIP,ServerPort); 然后设置回调函数: DT_Net_SetCallBack(self,LPNET_ACCEPT_CALLBACK, LPNET_RECV_CALLBACK,LPNET_DISCONN_CALLBACK, LPNET_LOG_CALLBACK); DT_Net_SetFileCallBack(PChar('d:/temps'),LPNET_ SEN DFILE_CALLBACK,LPNET_RECVFILE_CALLBACK,LPNET_ABORTFILE_CALLBACK); 各站点作为Socket Client,也设置回调函数,并主动去连接Server: DT_Net_InitServer(FALSE); DT_Net_SetCallBack(self,LPNET_ACCEPT_CALLBACK, LPNET_RECV_CALLBACK,LPNET_DISCONN_CALLBACK, LPNET_LOG_CALLBACK); DT_Net_SetFileCallBack(PChar('c:/tempc'), LPNET_ SEN DFILE_CALLBACK,LPNET_RECVFILE_CALLBACK,LPNET_ABORTFILE_CALLBACK); DT_Net_ConnectRemote(ServerIP,ServerPort); 每个站点和监控中心之间建立唯一的独立通道,当连接建立成功后,就可以利用该套接字在该站点与监控中心之间收发文件: DT_Net_SendFile(theSocket,FileName);5.2 XML文件封装协议
不同的数据最终封装成的XML文件是不同的,但是为了便于处理,把每一个XML文件分成两个主要的部分(Head和Data),如图3所示:
图3 XML结构示意图 (1) Head部分 系统中的任何一个XML数据文件都有相同的Head(数据包头),表明该XML文件的优先级(priority)、数据种类(FrameType)、来自何处(FromStationNo,站点编号,如果是服务器则为“0”)以及封装时间(DateTime)。 (2) Data部分 这一部分是XML文件所要封装的数据内容,基本按字段格式排列即可。要注意数据类型转换的问题,任何数据都必须想方设法转换成字符串类型的表示形式。5.3 XML文件控制
在实现了文件传输的基础上,对XML文件的封装、解析、接收和发送等操作使用多线程方式并行处理,并且引入队列(Queue)的机制。监控中心的基本处理机制与流程如图4所示:
图4 监控中心处理线程与流程 文件接收线程接收到XML文件后,先不管文件的具体内容,只负责将文件入队。然后由专门负责从队列中提取文件的线程将文件取出,由处理线程进行解析、处理,并将数据保存至数据库,同时还要生成确认应答的XML文件放如发送队列中。另外有专门负责发送文件的线程将文件发送出去。监控中心要往各站点发送的数据有一个独立的线程负责从数据库中读取相应数据封装成XML文件放入发送队列,等待发送。数据处理线程负责对数据库中的数据做进一步的业务处理,而系统监管线程主要的任务就是监视其它各个线程的状态,及时进行调整、修复或者发出报警,以保证系统正常运行。 站点的处理与监控中心的处理比较相似,但更为简单,因为监控中心面对多个站点,而站点只面对一个监控中心。 要保证监控中西文件处理的速度和系统运行的效率还要考虑以下几个问题: (1) 优先级 (2) 区分文件是哪个站点发送来的或者要发送给哪个站点 (3) 文件队列的管理 虽然XML文件的<Head>部分有优先级和站点编号信息,但是需要解析XML文件才能得到,为此要把文件名定为“优先级_站点编号_流水号.xml”的格式,可在一定程度上方便处理的过程。另外,文件队列可能存在积压现象,即入队快而出队慢,并且会造成恶性循环使系统性能持续降低,针对这种情况制定一个限度,当队列中的文件数达到此限度,则停止入队,即把新生成的XML文件丢弃。