鐘志武
(湖南省水利水電勘測設(shè)計研究總院 長沙市 410007)
本系統(tǒng)作為山洪災(zāi)害預(yù)警系統(tǒng)的一部分,主要負責接收雨量水位監(jiān)測站通過無線GPRS網(wǎng)絡(luò)發(fā)送過來的數(shù)據(jù),包括雨量數(shù)據(jù)、水位數(shù)據(jù)、電瓶電壓數(shù)據(jù)和監(jiān)測站(水庫、河道和閘壩等)監(jiān)控無線視頻圖片信息。
系統(tǒng)在Windows環(huán)境下用Delphi 7編寫,數(shù)據(jù)庫采用MS SQL Server 2005。下位機采用基于ARM9處理器(三星 S3C2410)的HYKJ-2410 Arm-PC104嵌入式工業(yè)計算機主板設(shè)計,配置HYKJ-GPRS V5.0通信模塊,預(yù)裝linux操作系統(tǒng),采用C語言編程,采用TCP/IP協(xié)議與上位機程序(本系統(tǒng))通訊。下位機采用太陽能電源供電(配置38 Ah電瓶和13 W太陽能電板),連接雨量傳感器、水位傳感器和視頻攝像頭。數(shù)據(jù)傳輸采用公共的GPRS網(wǎng)絡(luò),具有組網(wǎng)方便、實時性高、運行費用低等優(yōu)點。
Indy 的全名是 Internet Direct(也叫 Winshoes),它是一套開放源代碼的Internet控件集,它支持大部分流行的Internet協(xié)議。IdTCPServer控件是Indy控件系列中基于TCP/IP協(xié)議的TCP服務(wù)器控件。IdTCPServer是一個多線程控件。IdTCPServer在開始工作后,首先會自動建立一個偵聽線程TidListenerThread,該線程負責偵聽客戶端的連接請求,Server端首先是響應(yīng)客戶的Connect事件,一旦連接了,就自動在服務(wù)端對每一個服務(wù)器已接受的連接創(chuàng)建一個TidPeerThread線程。每個連接通過運行各自所屬的TidPeerThread來實現(xiàn)與服務(wù)器的數(shù)據(jù)交互。只要有客戶發(fā)送數(shù)據(jù),就會激活Server的OnExecute事件。數(shù)據(jù)的接收是在各個為連接所建的線程中并發(fā)進行的。而這個連接線程是需要Server維護的,IdTCPServer的最大連接線程數(shù)為600個左右,完全能滿足縣級山洪災(zāi)害預(yù)警系統(tǒng)的需要。
通常使用Winsock開發(fā)網(wǎng)絡(luò)應(yīng)用程序時,從Socket中讀取數(shù)據(jù)或者向Socket寫入數(shù)據(jù)都是異步發(fā)生的,這樣就不會阻斷程序中其它代碼的執(zhí)行。在收到數(shù)據(jù)時,Winsock會向應(yīng)用程序發(fā)送相應(yīng)的消息。這種訪問方式被稱作非阻塞式連接,它要求你對事件作出響應(yīng),設(shè)置狀態(tài)機,并通常還需要一個等待循環(huán)。與通常的Winsock編程方法不同的是,Indy使用了阻塞式(便于編程)Socket調(diào)用方式。阻塞式訪問更像是文件存取。當你讀取數(shù)據(jù),或是寫入數(shù)據(jù)時,讀取和寫入函數(shù)將一直等到相應(yīng)的操作完成后才返回,程序也一直阻塞在讀或?qū)懙牡胤健1热缯f,發(fā)起網(wǎng)絡(luò)連接只需調(diào)用Connect方法并等待它返回,如果該方法執(zhí)行成功,在結(jié)束時就直接返回,如果未能成功執(zhí)行,則會拋出相應(yīng)的異常。同文件訪問不同的是,Socket調(diào)用可能會需要更長的時間,因為要讀寫的數(shù)據(jù)可能不會立即就能準備好(很大程度上依賴于網(wǎng)絡(luò)帶寬)。
事物都具有兩面性,阻塞式Socket也不例外。它的一個主要的缺點就是使客戶程序的用戶界面“凍結(jié)”。當在程序的主線程中進行阻塞式Socket調(diào)用時,由于要等待Socket調(diào)用完成并返回,這段時間就不能處理用戶界面消息,使得Update、Repaint以及其它消息得不到及時響應(yīng),從而導(dǎo)致用戶界面被“凍結(jié)”。Indy使用一個特殊的組件TIdAntiFreeze來透明地解決客戶程序用戶界面“凍結(jié)”的問題。TIdAntiFreeze在Indy內(nèi)部定時中斷對棧的調(diào)用,并在中斷期間調(diào)用Application.ProcessMessages方法處理消息,而外部的Indy調(diào)用繼續(xù)保存阻塞狀態(tài),就好像TIdAntiFreeze對象不存在一樣。我們只要在程序中的任意地方添加一個TIdAntiFreeze對象,就能利用到阻塞式Socket的所有優(yōu)點而避開它的一些顯著缺點。
Indy服務(wù)器工作原理同Unix服務(wù)器十分類似,只是Windows不像Unix那樣支持fork,而是支持線程,因此Indy服務(wù)器為每一個客戶連接分配一個線程。圖1顯示了Indy服務(wù)器的工作原理與系統(tǒng)流程圖。Indy服務(wù)器組件創(chuàng)建一個同應(yīng)用程序主線程分離的監(jiān)聽線程來監(jiān)聽客戶連接請求,對于接受的每一個客戶,都創(chuàng)建一個新的線程來為該客戶提供服務(wù),所有與這一客戶相關(guān)的事務(wù)都由該線程來處理。
圖1 系統(tǒng)流程示意圖
本系統(tǒng)接收的客戶端(下位機)通過GPRS網(wǎng)絡(luò)上傳的數(shù)據(jù)包包括字符串包(雨量、水位和電壓)和流媒體包(視頻圖片)。由于服務(wù)端讀取各個客戶端數(shù)據(jù)是并發(fā)進行的,所以應(yīng)盡量避免讀取數(shù)據(jù)時進行數(shù)據(jù)處理入庫,可分別為兩種數(shù)據(jù)包建立兩個循環(huán)隊列表,先將客戶端數(shù)據(jù)存入緩存中,然后新建兩個線程(定時器)處理數(shù)據(jù)。循環(huán)隊列表數(shù)據(jù)結(jié)構(gòu)如下所示:
下位機上傳的數(shù)據(jù)包符合水利部發(fā)布的水情信息編碼標準(SL330-2005)和湖南省山洪災(zāi)害監(jiān)測預(yù)警系統(tǒng)水文通信協(xié)議規(guī)范。數(shù)據(jù)包格式如下:
河道水位包:CH 10 000 001 MMDDHHNN PN10 2 Z 100.00 NN
該數(shù)據(jù)包表示站號為10 000 001的監(jiān)測站于時間MMDDHHNN采集的10分鐘雨量2 mm,河道水位100.00 m。
水庫水位包:CK 10 000 001 MMDDHHNN PN10 2 ZU 100.00 NN
該數(shù)據(jù)包表示站號為10 000 001的監(jiān)測站于時間MMDDHHNN采集的10分鐘雨量2 mm,庫水位100.00 m。
本系統(tǒng)除了接收監(jiān)測站的數(shù)據(jù)外,另一個功能是通過GSM短信貓遠程設(shè)置監(jiān)測站的參數(shù),包括連接的數(shù)據(jù)中心IP地址、端口號、水位站類型(河道或水庫等)、站號、水位原始高程等。主要的模塊有視頻監(jiān)控模塊、站點信息管理模塊、參數(shù)設(shè)置模塊、數(shù)據(jù)監(jiān)測模塊、數(shù)據(jù)查詢模塊等。
圖2為監(jiān)測站視頻監(jiān)控示意圖。
本系統(tǒng)關(guān)鍵代碼如下:
圖2 監(jiān)測站視頻監(jiān)控示意圖
本系統(tǒng)已經(jīng)應(yīng)用于湖南省30多個縣的山洪災(zāi)害預(yù)警系統(tǒng)建設(shè)中,運行穩(wěn)定可靠,極大地提高對暴雨山洪災(zāi)害的監(jiān)測能力和反應(yīng)速度,最大程度保障了人民群眾生命財產(chǎn)的安全。
1水情信息編碼標準SL 330-2005.中華人民共和國水利部[S].
2蔣方帥.Delphi 5程序員指南[M].北京:人民郵電出版社,2000.
3國家防汛抗旱總指揮部辦公室.山洪災(zāi)害防治縣級監(jiān)測預(yù)警系統(tǒng)建設(shè)技術(shù)要求[R].2010.