delphi多线程超时控Delphi7中Indy控件对于网络数据的接收
1.引言
随着我国经济和社会的发展,水资源的科学管理与合理配置显得越来越重要。而获取大量的、实时的、动态的水资源及其相关信息则是实现水资源科学管理的基础。传统的水资源信息获取采用人工抄取数据后逐级的方式,这种方式收集数据困难且缺乏实时性,对水资源的科学管理造成了很大的困难。水资源的监测点地域分布广,搭建通讯网络不切实际且不适合移动的需要。本文介绍一种采用GPRS技术的水资源无线监测系统及DELPHI编程软件在该系统中的应用。
2.系统实现方案
系统由RTU(远程终端)和中心站部分组成。两部分之间最终通过Internet连为一体。系统结构如图一所示:
RTU(远程终端)集成了数据数据采集终端和GPRS数据远传模块。数据采集终端负责采集传感器送来的与水资源有关的雨量,水位等各种数据,将其存储在固态存储器中,并根据需要定时将数据送至数据远传模块进行远程传送。本系统采用PHILIP公司的P89LPC935单片机作为数据采集终端控制核心,外围配以FM24C64L存储芯片和PCF8583时钟日历芯片。单片机和外围的存储和时钟芯片采用I2C总线进行数据交互。GPRS数据远传模块主要负责上下位机的远程通信,单片机通过串口使用AT指令来控制模块进行拨号和数据传输。本系统采用法国WAVECOM公司的Q2406B模块。
中心站由服务器、监测软件及客户端计算机组成。监测软件连接至Internet网络,负责接收下位机传送上来的数据和状态信息,将其存入数据库,同时负责向下位机发送控制指令。局域网内的客户端计算机可通过服务器来查看数据信息。
3.中心软件设计
本系统软件采用Delphi7编写.中心软件主要功能实现数据的接收,解析和存储。
Delphi是Borland公司推出的可视化开发平台,其代码采用OBJECTPASCAL语言编写.DELPHI编写的程序编译和连接速度快,生成的源代码简洁,相比较其他的编程语言,在对数据库、多线程及网络通信的综合支持方面占有很大的优势.delphi多线程超时控Delphi7中Indy控件对于网络数据的接收因此非常适合编写软件.
本软件主要由数据接收、数据解析、数据存储三部分组成,其工作流程如图二所示:
图二
3.1数据接收部分
下位机通过GPRS方式可直接连至互联网,因此对中心站来说,其与下位机的数据通信和与网络上的其他PC机通信方式相同。对于网络数据的接收,采用Delphi7中Indy控件来实现.
delphi多线程超时控制Indy的全名是InternetDirect(也叫Winshoes),它是一套源代码的Internet控件集,它支持大部分流行的Internet协议。本系统数据传输采用TCP/IP协议,软件使用Indy控件集中的IdTCPServer来实现通过INTERNET与下位机通信。
IdTCPServer在开始工作后,首先会自动建立一个侦听线程TidListenerThread,该线程负责侦听客户端的连接请求,并对每一个服务器已接受的连接创建一个TidPeerThread线程。每个连接通过运行各自所属的TidPeerThread来实现与服务器的数据交互。
本系统使用的IdTCPServerR的主要属性和事件
ListenQueue属性表示在侦听线程中等待的未被处理的最大连接数。
MaxConnections属性表示该服务器所能接受的最大连接数。
DeultPort属性表示IDTCPSERVER在启动后开始侦听连接所使用的端口号
OnConnect事件和OnDisconnect在分别在连接建立和断开时被触发。OnExecute在为新的连接所建的线程TidPeerThread调用其run方法时被触发。OnExecute事件在触发后会自动循环的执行其响应过程IdTCPServerExecute,而不需要另外在该事件的响应函数中自己来建立循环。以上三个事件处理函数均接收一个TidPeerThread线程作为其参数。
(2)通信协议的制定
BGN为起始标志符,在检测到该标符后,认为正式的数据传输开始;
SORT为数据的类别,LENGTH为要发送的有效数据的长度,INFO为传输的信息内容
CRCCHECK为校验,本系统采用CRC16校验,END为结束标志符,收到此标志后认为有效的数据传输结束。
由于在数据通信的过程中,数据传输的起始和终止时期是容易出错的阶段,因此在上下位机建立通讯链后,首先发送一段无效字符,然后发送要传输的数据,在有效数据发送完成后,继续发一部分无效数据,以此来增强数据传输的可靠性。
//在收到字符串后,调用//WriteLn方法往下位机发//送一确认信息;
在与客户端的连接断开后2012年4月(15),会触发OnDisconnec事件,IdTCPServer1Disconnect方法为该事件的响应过程,在该方法中必须为该连接所创建的对象,否则会造成内存泄露.
该部分的主要代码如下:
3.2数据解析部分
数据的接收是在各个为连接所建的线程中并发进行,由于在往数据库存数据时需要建立与数据库连接,各种数据库所提供的并发连接能力都是有限的delphi盒子无线充电技术:并不神秘_财经,若直接在每个线程中建立数据库连接回耗费过多的系统资源,造成系统不稳定.为此需要把并发接收的数据串行化,队列(QUEUE)很好地实现了这种功能.
本系统在每接收到一串字符后,即将该字符串送往一个特定的FIFO(先进先出)的队列。该队列是线程安全的,即某一个TidPeerThread线程在往该队列写数据时,其余的线程需等待该线程写完后才能望该队列读写数据。调用该队列的sendmsg(received_msg)方法可以往队列中添加一串字符.其主要代码如下:
//将接收到的消息发送到队列
调用该队列的receivemsg(received_msg:string,qmsg_flag:boolean);可以从队列中读取出字符,在有数据被读出时flag为true否则为lse;
数据解析即将收到的字符串根据预先定好的协议解析成我们所需要的数据。
系统建立一个专门的线程来负责数据解析,该线程循环的读取队列,在读到数据后即进解析.在本系统中,2012年4月 (1)。共有两类数据,一类是反映下位机工作状态的数据,用于对下位机工作状态的监测;另一类是下位机采集的与水资源相关的数据。
对于这两类数据,程序中建立了与其相对应的两个对象,每个对象有若干属性,这些属性值分别对应于数据库中的相应字段,在队列中每读出一条数据时,根据其内容创建一个相应的对象的实例,根据字符串的内容对该实例的各个属性赋值。
3.3数据存储部分
数据的存储采用ADO方式,利用ADOConnection和ADOQuery来实现.
数据存储函数以一个对象作为其参数,根据不同的对象获取其各个属性值,然后存到数据库的相应字段中。在存储完毕后,将该对象实例,其所占用的内存空间。
4.结束语
本文介绍了DELPHI在水资源无线监测系统中的应用.利用了Indy组件和队列,在数据解析和存储时,充分利用的面向对象编程的优点,使系统各个部分分工明确,这使得该系统的应用范围扩展和功能完善变得相当方便。目前该系统已投入运行,且运行效果良好。