基于Delphi IND Y控件的GPRS无线视频通信程序在山洪灾害预警系统中的应用
2012-07-14钟志武
钟志武
(湖南省水利水电勘测设计研究总院 长沙市 410007)
1 系统简介
本系统作为山洪灾害预警系统的一部分,主要负责接收雨量水位监测站通过无线GPRS网络发送过来的数据,包括雨量数据、水位数据、电瓶电压数据和监测站(水库、河道和闸坝等)监控无线视频图片信息。
系统在Windows环境下用Delphi 7编写,数据库采用MS SQL Server 2005。下位机采用基于ARM9处理器(三星 S3C2410)的HYKJ-2410 Arm-PC104嵌入式工业计算机主板设计,配置HYKJ-GPRS V5.0通信模块,预装linux操作系统,采用C语言编程,采用TCP/IP协议与上位机程序(本系统)通讯。下位机采用太阳能电源供电(配置38 Ah电瓶和13 W太阳能电板),连接雨量传感器、水位传感器和视频摄像头。数据传输采用公共的GPRS网络,具有组网方便、实时性高、运行费用低等优点。
2 系统设计
2.1 编程原理与系统流程
Indy 的全名是 Internet Direct(也叫 Winshoes),它是一套开放源代码的Internet控件集,它支持大部分流行的Internet协议。IdTCPServer控件是Indy控件系列中基于TCP/IP协议的TCP服务器控件。IdTCPServer是一个多线程控件。IdTCPServer在开始工作后,首先会自动建立一个侦听线程TidListenerThread,该线程负责侦听客户端的连接请求,Server端首先是响应客户的Connect事件,一旦连接了,就自动在服务端对每一个服务器已接受的连接创建一个TidPeerThread线程。每个连接通过运行各自所属的TidPeerThread来实现与服务器的数据交互。只要有客户发送数据,就会激活Server的OnExecute事件。数据的接收是在各个为连接所建的线程中并发进行的。而这个连接线程是需要Server维护的,IdTCPServer的最大连接线程数为600个左右,完全能满足县级山洪灾害预警系统的需要。
通常使用Winsock开发网络应用程序时,从Socket中读取数据或者向Socket写入数据都是异步发生的,这样就不会阻断程序中其它代码的执行。在收到数据时,Winsock会向应用程序发送相应的消息。这种访问方式被称作非阻塞式连接,它要求你对事件作出响应,设置状态机,并通常还需要一个等待循环。与通常的Winsock编程方法不同的是,Indy使用了阻塞式(便于编程)Socket调用方式。阻塞式访问更像是文件存取。当你读取数据,或是写入数据时,读取和写入函数将一直等到相应的操作完成后才返回,程序也一直阻塞在读或写的地方。比如说,发起网络连接只需调用Connect方法并等待它返回,如果该方法执行成功,在结束时就直接返回,如果未能成功执行,则会抛出相应的异常。同文件访问不同的是,Socket调用可能会需要更长的时间,因为要读写的数据可能不会立即就能准备好(很大程度上依赖于网络带宽)。
事物都具有两面性,阻塞式Socket也不例外。它的一个主要的缺点就是使客户程序的用户界面“冻结”。当在程序的主线程中进行阻塞式Socket调用时,由于要等待Socket调用完成并返回,这段时间就不能处理用户界面消息,使得Update、Repaint以及其它消息得不到及时响应,从而导致用户界面被“冻结”。Indy使用一个特殊的组件TIdAntiFreeze来透明地解决客户程序用户界面“冻结”的问题。TIdAntiFreeze在Indy内部定时中断对栈的调用,并在中断期间调用Application.ProcessMessages方法处理消息,而外部的Indy调用继续保存阻塞状态,就好像TIdAntiFreeze对象不存在一样。我们只要在程序中的任意地方添加一个TIdAntiFreeze对象,就能利用到阻塞式Socket的所有优点而避开它的一些显著缺点。
Indy服务器工作原理同Unix服务器十分类似,只是Windows不像Unix那样支持fork,而是支持线程,因此Indy服务器为每一个客户连接分配一个线程。图1显示了Indy服务器的工作原理与系统流程图。Indy服务器组件创建一个同应用程序主线程分离的监听线程来监听客户连接请求,对于接受的每一个客户,都创建一个新的线程来为该客户提供服务,所有与这一客户相关的事务都由该线程来处理。
图1 系统流程示意图
2.2 数据结构设计
本系统接收的客户端(下位机)通过GPRS网络上传的数据包包括字符串包(雨量、水位和电压)和流媒体包(视频图片)。由于服务端读取各个客户端数据是并发进行的,所以应尽量避免读取数据时进行数据处理入库,可分别为两种数据包建立两个循环队列表,先将客户端数据存入缓存中,然后新建两个线程(定时器)处理数据。循环队列表数据结构如下所示:
下位机上传的数据包符合水利部发布的水情信息编码标准(SL330-2005)和湖南省山洪灾害监测预警系统水文通信协议规范。数据包格式如下:
河道水位包:CH 10 000 001 MMDDHHNN PN10 2 Z 100.00 NN
该数据包表示站号为10 000 001的监测站于时间MMDDHHNN采集的10分钟雨量2 mm,河道水位100.00 m。
水库水位包:CK 10 000 001 MMDDHHNN PN10 2 ZU 100.00 NN
该数据包表示站号为10 000 001的监测站于时间MMDDHHNN采集的10分钟雨量2 mm,库水位100.00 m。
2.3 模块设计
本系统除了接收监测站的数据外,另一个功能是通过GSM短信猫远程设置监测站的参数,包括连接的数据中心IP地址、端口号、水位站类型(河道或水库等)、站号、水位原始高程等。主要的模块有视频监控模块、站点信息管理模块、参数设置模块、数据监测模块、数据查询模块等。
图2为监测站视频监控示意图。
3 编程实现
本系统关键代码如下:
图2 监测站视频监控示意图
4 结语
本系统已经应用于湖南省30多个县的山洪灾害预警系统建设中,运行稳定可靠,极大地提高对暴雨山洪灾害的监测能力和反应速度,最大程度保障了人民群众生命财产的安全。
1水情信息编码标准SL 330-2005.中华人民共和国水利部[S].
2蒋方帅.Delphi 5程序员指南[M].北京:人民邮电出版社,2000.
3国家防汛抗旱总指挥部办公室.山洪灾害防治县级监测预警系统建设技术要求[R].2010.